Wordpress meta_box 复选框更新未更新
Wordpress meta_box checkbox update is not updating
我在为自定义 post news
更新 wordpress 中的自定义元框时遇到问题。我做了一个元框复选框,所以我可以决定 post 是否有特色。如果选中该复选框,则 isFeatured = 1
。在这部分工作之前,问题是一段时间后我不想编辑 post 并取消选中复选框。更新 post 后,复选框始终处于选中状态。
数据库:meta_key | meta_value
---->news_details | a:1:{s:10:"isFeatured";s:1:"1";}
我的代码是这样的:
function add_news_details_meta_box() {
add_meta_box(
'news_details_meta_box', // $id
'Checkbox', // $title
'show_news_details_meta_box', // $callback
'news', // $screen
'normal', // $context
'high' // $priority
);
}
add_action( 'add_meta_boxes', 'add_news_details_meta_box' );
function show_news_details_meta_box() {
global $post;
$meta = get_post_meta( $post->ID, 'news_details', true ); ?>
<input type="hidden" name="news_details_meta_box_nonce" value="<?php echo wp_create_nonce( basename(__FILE__) ); ?>">
<p>
<label for="news_details[isFeatured]">Is this post featured?
<input type="checkbox" name="news_details[isFeatured]" value="1" <?php if (is_array($meta) && $meta['isFeatured'] === '1' ) { echo 'checked';} else { echo 'Unchecked';}?>>
</label>
</p>
<?php
}
function save_news_details_meta( $post_id ) {
// verify nonce
if ( !wp_verify_nonce( $_POST['news_details_meta_box_nonce'], basename(__FILE__) ) ) {
return $post_id;
}
// check autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return $post_id;
}
// check permissions
if ( 'page' === $_POST['post_type'] ) {
if ( !current_user_can( 'edit_page', $post_id ) ) {
return $post_id;
} elseif ( !current_user_can( 'edit_post', $post_id ) ) {
return $post_id;
}
}
$old = get_post_meta( $post_id, 'news_details', true );
$new = $_POST['news_details'];
if ( $new && $new !== $old ) {
update_post_meta( $post_id, 'news_details', $new );
} elseif ( '' === $new && $old ) {
delete_post_meta( $post_id, 'news_details', $old );
}
}
add_action( 'save_post', 'save_news_details_meta' );
你能向我解释一下更新复选框有什么问题吗?
我认为你应该检查 if 条件。我得到你的描述的方式, $meta['isFeatured'] === '1' 总是变成真的。您在输入标签中将值设置为 1。所以在保存时 1 的值被保存到我猜的字段中。在下一次加载时,您将使用 if 检查 $meta['isFeatured'] 是否为 1,所以这始终为真。
您可以检查是否选中了表单中的复选框:
isset($_POST['name_of_your_checkbox_input'])
如果已设置,则保存值 1。如果未设置,则保留预定义值 0。
在这种情况下对我有用的是将 } elseif ( '' === $new && $old ) {
更改为 } else ( '' === $new && $old ) {
我在为自定义 post news
更新 wordpress 中的自定义元框时遇到问题。我做了一个元框复选框,所以我可以决定 post 是否有特色。如果选中该复选框,则 isFeatured = 1
。在这部分工作之前,问题是一段时间后我不想编辑 post 并取消选中复选框。更新 post 后,复选框始终处于选中状态。
数据库:meta_key | meta_value
---->news_details | a:1:{s:10:"isFeatured";s:1:"1";}
我的代码是这样的:
function add_news_details_meta_box() {
add_meta_box(
'news_details_meta_box', // $id
'Checkbox', // $title
'show_news_details_meta_box', // $callback
'news', // $screen
'normal', // $context
'high' // $priority
);
}
add_action( 'add_meta_boxes', 'add_news_details_meta_box' );
function show_news_details_meta_box() {
global $post;
$meta = get_post_meta( $post->ID, 'news_details', true ); ?>
<input type="hidden" name="news_details_meta_box_nonce" value="<?php echo wp_create_nonce( basename(__FILE__) ); ?>">
<p>
<label for="news_details[isFeatured]">Is this post featured?
<input type="checkbox" name="news_details[isFeatured]" value="1" <?php if (is_array($meta) && $meta['isFeatured'] === '1' ) { echo 'checked';} else { echo 'Unchecked';}?>>
</label>
</p>
<?php
}
function save_news_details_meta( $post_id ) {
// verify nonce
if ( !wp_verify_nonce( $_POST['news_details_meta_box_nonce'], basename(__FILE__) ) ) {
return $post_id;
}
// check autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return $post_id;
}
// check permissions
if ( 'page' === $_POST['post_type'] ) {
if ( !current_user_can( 'edit_page', $post_id ) ) {
return $post_id;
} elseif ( !current_user_can( 'edit_post', $post_id ) ) {
return $post_id;
}
}
$old = get_post_meta( $post_id, 'news_details', true );
$new = $_POST['news_details'];
if ( $new && $new !== $old ) {
update_post_meta( $post_id, 'news_details', $new );
} elseif ( '' === $new && $old ) {
delete_post_meta( $post_id, 'news_details', $old );
}
}
add_action( 'save_post', 'save_news_details_meta' );
你能向我解释一下更新复选框有什么问题吗?
我认为你应该检查 if 条件。我得到你的描述的方式, $meta['isFeatured'] === '1' 总是变成真的。您在输入标签中将值设置为 1。所以在保存时 1 的值被保存到我猜的字段中。在下一次加载时,您将使用 if 检查 $meta['isFeatured'] 是否为 1,所以这始终为真。
您可以检查是否选中了表单中的复选框:
isset($_POST['name_of_your_checkbox_input'])
如果已设置,则保存值 1。如果未设置,则保留预定义值 0。
在这种情况下对我有用的是将 } elseif ( '' === $new && $old ) {
更改为 } else ( '' === $new && $old ) {