我的目标很简单——创建一个带有自定义元框的自定义帖子类型,其中包含一个简单的分类术语下拉列表,而不是使用标签或复选框。原因是为了确保编辑器只能从分类列表中选择一个术语。
经过反复试验,我终于找到了一种利用WP Alchemy提供的优秀metabox创建工具的方法(http://farinspace.com/wpalchemy-metabox/)创建我的metabox并让它在下拉列表中显示适用的术语。
我遇到的问题是,我似乎无法从下拉菜单中获得新的选择来保存所选的值。
要明确的是。。。重要的是,在此自定义帖子类型中,只有一个术语与每个帖子相关联,这意味着无论何时从下拉菜单中选择不同的值并保存帖子,都需要确保取消注册之前的选择。
如前所述,我目前将其显示在下拉列表中的术语列表,并且我还将其正确显示可能关联的任何术语。
我遇到的问题就是保存新的值。
从广泛的研究来看,解决方案“似乎”涉及到使用wordpress“wp\\u set\\u post\\u terms”函数,此处将进一步解释:http://codex.wordpress.org/Function_Reference/wp_set_post_terms然而,我不确定如何正确利用它来达到我想要的结果。
下面是我正在使用的代码。很可能有更好的方法可以做到这一点,我非常感谢你们提出的任何建议,也可以确保正在进行适用的“检查”,以确保未经授权的用户无法插入数据。
功能。PHP文件(显示以下自定义帖子类型和分类的创建。
//////////////////////////////////////////////////////////////////////////////
// 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
)
));
}
这里是我注册我尝试使用的分类法的地方
// 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\');
这是我在函数文件中使用的代码的其余部分,以及基于WPALECHEMY创建元盒的代码。在这次尝试中,我试图包括“save\\u filter”=>“wp\\u set\\u post\\u 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
));
我还应该注意到,WPALECHMEY的DIMAS刚刚在GITHUB的1.3.2版本中添加了一些新代码,允许上面的代码包括
\'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>
我假设保存数据应该很简单,但我想我对如何实现这一点感到困惑。
如前所述,如果您还可以提供有关代码的建议,以确保进行任何必要的检查,以确保数据正确保存,并且仅为正确授权的人员,我将不胜感激。
一定要提前感谢!