我为此战斗了好几天。我试图在创建或编辑帖子类别时添加带有选项的自定义下拉列表:
function changePostOrder(){
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_page_title"><?php _e('Post Order'); ?></label></th>
<td>
<select name="post_order" id="post_order">>
<option value="" disabled selected> Order by </option>
<option value="ASC" <?php selected( $options['foo'], 'ASC' ); ?>>Oldest</option>
<option value="DESC" <?php selected( $options['foo'], 'DESC' ); ?>>Newest</option>
</select>
</td>
</tr>
<?php
}
add_action ( 'edit_category_form_fields', 'changePostOrder');
到目前为止,很好。但是,我要保存选定的选项,以便它在前端显示选定的选项。但是什么也没发生:
function saveCategoryFields() {
if ($_POST['post_order'] === 'Oldest') {
//do something and then update the field
update_term_meta($_POST['tag_ID'], 'post_order', $_POST['post_order']);
}
}
add_action ( 'edited_category', 'saveCategoryFields');
我检查了编解码器,我认为应该使用get_term_meta()来获取值,但我不知道该怎么做。基本上,我需要与此answer类似的东西,但需要一个下拉列表。请帮助。
WordPress具有称为add_meta_box()的功能。使用它来包装您的表单域,并在提交页面时格式化$ _POST参数。
您挂接到add_meta_boxes来调用一个函数,该函数将调用add_meta_box,此时您可以向其传递一些参数。
add_action( 'add_meta_boxes', 'yourname_create_metabox' );
public function yourname_create_metabox(){
if(is_admin()){
add_meta_box("a-meta-box-name", "Hi! I am a meta box", "your_metabox_markup_function", "", "", "");
}
}
您将表单包装在your_metabox函数中,并确保添加一个nonce字段以确保安全性:
public function your_metabox_markup_function(){
global $post;
$meta = get_post_meta($post->ID, 'post_order');
wp_nonce_field(basename(__FILE__),'yourname_post_class_nonce');
// your form here
}
然后您可以保存表格:
public function yourname_save_metabox($post_id){
if(!isset($_POST['yourname_post_class_nonce']) || !wp_verify_nonce($_POST['yourname_post_class_nonce'],basename(__FILE__)))return $post_id;
if(isset( $_POST['post_order'] )){
// save however you need
}
}
add_action( 'save_post', 'yourname_save_metabox', 10);