it-swarm.cn

自定义Metabox与分类下拉 - 保存问题

我的目标很简单---使用自定义元数据创建自定义帖子类型,其中包含一个简单的分类术语下拉列表,而不是使用标签或复选框。原因是确保编辑器只能从分类列表中选择一个术语。

经过反复试验后,我终于找到了一种方法来利用我在WP-Alchemy(http://farinspace.com/wpalchemy-metabox/)中使用的优秀元数据创建工具来创建我的元数据并让它显示适用的下拉列表中的术语。

我遇到的问题是,我似乎无法从下拉菜单中获取新选项以保存所选值。

要清楚......重要的是,只有一个术语与此自定义帖子类型中的每个帖子相关联,这意味着只要从下拉菜单中选择不同的值并保存帖子,就需要确保先前的选择未注册。

如上所述,我目前让它在下拉列表中显示术语列表,我也正确地显示了可能关联的术语。

只是保存新值是我遇到问题的地方。

从广泛的研究来看,似乎“似乎”解决方案涉及使用wordpress“wp_set_post_terms”函数,这将在此进一步解释: http://codex.wordpress.org/Function_Reference/wp_set_post_terms 但我不确定如何正确使用它达到我想要的结果。

下面我已经包含了我正在使用的代码。很可能有一种更好的方法可以做到这一点,我希望你们可能有的任何建议也可以确保正在进行适当的“检查”,以确保未经授权的用户无法插入数据。

功能.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的METABOX。在这次尝试中,我尝试包括'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已经将一些新代码添加到他的1.3.2版本的GITHUB中,允许上面的代码包含A

'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
NetConstructor.com

对于任何有兴趣的人,我在另一篇文章中回答了这个问题:

保存分类标准

1
NetConstructor.com