web-dev-qa-db-ja.com

分類法ドロップダウンを使用したカスタムメタボックス - 節約の問題

私の目標は簡単でした---タグやチェックボックスを利用するのではなく、分類用語の簡単なドロップダウンリストを持つカスタムメタボックスでカスタム投稿タイプを作成することでした。その理由は、編集者が分類法リストから1つの用語しか選択できないようにするためです。

試行錯誤の末、ついに私はWP-Alchemy(http://farinspace.com/wpalchemy-metabox/)から私が使っている優れたメタボックス作成ツールを使ってメタボックスを作成し、適切なメタボックスを作成する方法を見つけました。ドロップダウンリストの用語。

私が抱えている問題は、選択した値を保存するためにドロップダウンメニューから新しい選択を取得することができないようです。

このカスタム投稿タイプでは、各投稿に1つの用語のみを関連付けることが重要です。ドロップダウンメニューから異なる値を選択して投稿を保存するたびに、前の選択が未登録であることを確認する必要があります。

すでに述べたように、私は現在ドロップダウンで用語のリストを表示しています。また、関連している可能性のある用語を正しく表示しています。

新しい値を保存するだけで問題が発生します。

広範囲な研究から、この解決策はここでさらに説明されるワードプレスの "wp_set_post_terms"関数を使うことを含むように "思われる" - http://codex.wordpress.org/Function_Reference/wp_set_post_terms しかしそれを正しく利用する方法はわからない。私の望む結果を達成するために。

以下に、私が利用しているコードを含めます。これを行うより良い方法がある可能性が非常に高いですそしてあなたがあなたが持つかもしれないどんな提案もデータが許可されていないユーザーによって挿入されないことを保証するために適切な "チェック"が行われていることを保証するかもしれません。

FUNCTIONS.PHPファイル(以下のカスタムPOSTタイプと分類の作成を示しています。

//////////////////////////////////////////////////////////////////////////////
// CUSTOM POSTTYPE FOR -- SERVICES  
//////////////////////////////////////////////////////////////////////////////

add_action('init', 'services');
function services() {
 register_post_type('services', array(
  'labels' => array(
   'name'   => __('Services'),
   'singular_label'  => __('Service'),
   'new_item'   => __('Add a Service'),
   'add_new'   => __('Add a Service'),
   'add_new_item'  => __('Add a Service'),
   'edit'   => __('Edit Service'),
   'edit_item'   => __('Edit Service'),
   'view'   => __('View Service'),
   'view_item'   => __('View Service'),
   'search_items'  => __('Search Services'),
   'not_found'   => __('No Services Found'),
   'not_found_in_trash' => __('No Services Found in Trash'),
       'parent_item'  => __('Parent Service'),
   'parent_item_colon' => __('Parent Service:')
   ),
  'can_export'    => true,
  'menu_position'   => 7,
  'public'    => false,
  'show_ui'    => true,
  'publicly_queryable'  => true,
  'hierarchical'   => true,
  'query_var'    => true,
  'capability_type'   => 'post',
  'exclude_from_search'  => false,
  'supports' => array(
   'title',
   'editor',
   'revisions',
   'page-attributes'
   ),
  'rewrite' => array( 
   'slug'   => 'disability-services', 
   'with_front'   => false
   )
 ));
}

ここにIS私は一緒に仕事をしているという分類法を登録しています

// CUSTOM TAXONOMY METABOX POSTTYPE - AGE GROUPS
   register_taxonomy('theme', array('services'), array(
    'hierarchical'          => false, 
    'singular_label'            => 'Age Group', 
    'query_var'                 => 'theme',
    'public'                => true,
    'show_ui'               => true,
    'show_tagcloud'             => false,
    'show_in_nav_menus'             => true,    
    'rewrite'               => array( 'slug' => 'age-groups', 'with_front' => false ),
    'labels' => array(
        'name'          => __( 'Age Groups' ),
        'singular_name'         => __( 'Age Groups' ),
        'search_items'      => __( 'Search Age Groups' ),
        'all_items'             => __( 'All Age Groups' ),
        'parent_item'       => __( 'Parent Age Group' ),
        'parent_item_colon'         => __( 'Parent Age Group:' ),
        'edit_item'             => __( 'Edit Age Group' ), 
        'update_item'       => __( 'Update Age Group' ),
        'add_new_item'      => __( 'Add Age Group' ),
        'new_item_name'         => __( 'New Name of Age Group' ),
        'popular_items'         => __( 'Popular Age Groups' ),
        'separate_items_with_commas'=> __( 'Separate Age Groups with commas' ),
        'add_or_remove_items'   => __( 'Add or remove Age Groups' ),
        'choose_from_most_used' => __( 'Select Popular Age Groups' ), 
        ),
   ));
   wp_insert_term('Kids', 'theme');
   wp_insert_term('Teens', 'theme');
   wp_insert_term('Adults', 'theme');

このIS関数ファイルで使用しているコードの残りと、WPALECHEMYをベースにしたメタボックスを作成するためのコード。この試みで私は 'save_filter' => "wp_set_post_terms($ post-> ID、 'theme')"を含めようとしました、これが適切なデータを保存することを願っていましたが、そうではありませんでした。

// CUSTOM METABOX POSTTYPE - SERVICE DETAILS
   $custom_metabox_service_details = new WPAlchemy_MetaBox(array (
    'id'        => '_service_details-metaboxes',        // underscore prefix hides fields from the custom fields area
    'title'     => 'Age Groups',            // title added automatically to the custom metabox
    'types'     => array('services'),           // added only for custom post type "name-of-post-type" can also be "page" or "post"
    'context'   => 'normal',                    // same as above, defaults to "normal" but can use "advanced" or "side"
    'priority'  => 'high',                  // same as above, defaults to "high" but can use "low" as well
    'mode'  => WPALCHEMY_MODE_EXTRACT,
    'save_filter' => "wp_set_post_terms( $post->ID, 'theme' )",
    'template'  => TEMPLATEPATH . '/admin-metabox/service_details-metaboxes.php'  // contents for the meta box
    ));

また、AT WPALECHMEYにHIS 1.3.2にGISHUBのバージョンを追加した新しいコードを追加することを忘れないでください。

'save_filter' => "custom-function", 

このコードはあなたがカスタム関数を作成することを可能にするか、または私が公開ボタンを押すと実行されるカスタム関数を呼び出すと思いますので、それはおそらくデータを保存するための最良の方法ですか?

いずれにせよ、私は分類法の用語を表示する実際のドロップダウンリストを表示するためにカスタムメタボックスのために以下のコードを利用しています。

<?php 
// This function gets called in edit-form-advanced.php
echo '<input type="hidden" name="taxonomy_noncename" id="taxonomy_noncename" value="' . wp_create_nonce( 'taxonomy_theme' ) . '" />';

// Get all theme taxonomy terms
$themes = get_terms('theme', 'hide_empty=0'); 
?>

<select name='post_theme' id='post_theme'>
// DISPLAY TERMS AS DROP DOWN OPTIONS
<?php $names = wp_get_object_terms($post->ID, 'theme'); ?>
<option class='theme-option' value='' <?php if (!count($names)) echo "selected";?>>None</option>
<?php foreach ($themes as $theme) {
 if (!is_wp_error($names) && !empty($names) && !strcmp($theme->slug, $names[0]->slug)) 
 echo "<option class='theme-option' value='" . $theme->slug . "' selected>" . $theme->name . "</option>\n"; 
 else
 echo "<option class='theme-option' value='" . $theme->slug . "'>" . $theme->name . "</option>\n"; 
}
?>
</select>

データを保存するのは簡単なことであると私は想定していますが、これを達成する方法について私は混乱していると思います。

前述したように、データが正しく保存され、正しく承認された人だけであることを確認するために必要なチェックが行われることを確認するためのコードの提案も提供できれば幸いです。

事前に感謝しなければなりません!

3

興味のある人のために、私は別の投稿でこの質問に答えました:

分類学用語の保存

1