发布元数据复选框有时会变为未选中状态

时间:2015-05-14 作者:notGettingStabbed

我删除了帖子上的默认作者元框,并添加了一个复选框,用于确定帖子是否应显示作者的署名和作者框。它一直在工作,但由于某种原因,在某些情况下它变得不受控制。

这是在公开了一些私人帖子之后,当我改变了其他帖子的永久链接时发生的。将数据库从localhost迁移到服务器时也会发生这种情况。

这是我的代码:

/* Remove and then add back in the author box to include check box to display author byline and bio */

add_action( \'admin_menu\', \'fb_modify_author_meta_boxes\' );
function fb_modify_author_meta_boxes() {

remove_meta_box(\'authordiv\', \'post\', \'normal\');
add_meta_box(\'fb_authordiv\', __(\'Author\'), \'fb_post_author_meta_box\', \'post\', \'normal\', \'core\');
}

function fb_post_author_meta_box( $post ) {
global $user_ID;

// get all authors
$wp_user_search = new WP_User_Search($usersearch = \'\', $userspage = \'\', \'author\');
$authors = join( \', \', $wp_user_search->get_results() );?>
<label class="screen-reader-text" for="post_author_override"><?php _e(\'Author\'); ?></label>
<?php
    wp_dropdown_users( array(
        \'name\' => \'post_author_override\',
        \'selected\' => empty($post->ID) ? $user_ID : $post->post_author,
        \'include_selected\' => true
    ) );

global $post;
$custom = get_post_custom($post->ID);
$show_author = $custom["show_author"][0]; 
?>

<input type="checkbox" name="show_author" <?php if( $show_author == true ) { ?>checked="checked"<?php } ?> style="margin-left:15px" />  Check the box to display the author\'s byline and author box.
<?php }


/* Save checkbox status */
add_action(\'save_post\', \'save_details\');

function save_details($post_ID = 0) {
$post_ID = (int) $post_ID;
$post_type = get_post_type( $post_ID );
$post_status = get_post_status( $post_ID );

if ($post_type) {
update_post_meta($post_ID, "show_author", $_POST["show_author"]);
}
return $post_ID;
}
如果有人知道为什么会失去这个地位,我将非常感谢你的帮助。

谢谢

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

问题是save_post 在“编辑帖子”屏幕以外的许多地方激发-当它激发时,您的代码会认为复选框未选中,并覆盖您保存的状态。

向元框添加其他隐藏输入:

<?php

// Don\'t global post, use the $post parameter already passed to the function
// global $post;

// Avoid undefined index errors by passing the third argument "single" true
// The double !! will cast the value to a boolean true/false
$show_author = !! get_post_meta( $post->ID, \'show_author\', true );
?>

<input type="checkbox" name="show_author" <?php checked( $show_author ) /* WordPress helper function */ ?> style="margin-left:15px" /> Check the box to display the author\'s byline and author box.
<input type="hidden" name="do_show_author" value="1" />
然后在保存复选框状态之前检查它是否存在:

function save_details( $post_ID ) {
    if ( isset( $_POST[\'do_show_author\'] ) ) {
        // Use isset - unchecked checkboxes won\'t send a value to $_POST, you\'ll get an undefined index error
        update_post_meta( $post_ID, \'show_author\', isset( $_POST[\'show_author\'] ) ? \'1\' : \'0\' );
    }
}

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在