如何在WordPress中设置复选框的默认值

时间:2016-05-31 作者:Kamal Ahmed

我在WordPress中设置复选框字段的默认值时遇到了一个问题。我在自定义帖子中有一个复选框输入字段(metabox)。我希望默认选中该复选框。若用户取消选中它,那个么应该保存并取消选中它,并在刷新页面时保持未选中状态。我的问题是无法设置复选框的默认值。我只有两个价值观可以合作。主要问题出现了,因为savemetadata函数在我单击“添加新”帖子时运行,所以默认值会自动保存在数据库中,而不会保存新帖子。我已经试了三天了。我尝试在用户未选中复选框时保存默认值“是”。

但在这种情况下,当用户取消选中时,它仍然会被默认值选中。我的当前代码段

// for displaying metabox
function aps_add_meta_box() {
 add_meta_box(
    \'aps_metabox\',
    __( \'Slider Settings & Shortcode Generator\', APS_TEXTDOMAIN ),
    \'aps_metabox_cb\', // callback
    \'apspostslider\', // screen or posttype
    \'normal\'
 );}
add_action( \'add_meta_boxes\', \'aps_add_meta_box\' );

function aps_metabox_cb( $post ) {
    wp_nonce_field( \'aps_meta_save\', \'aps_meta_save_nounce\' ); // nounce
    $aps_display_post_title = get_post_meta( $post->ID, \'aps_display_post_title\', true );

    <input type="checkbox" name="aps_display_post_title" value="yes" <?php checked( $aps_display_post_title, \'yes\'); />
}
在保存功能中保存metabox数据的代码:

function aps_meta_save( $post_id ) {
    // Perform checking for before saving
    $is_autosave = wp_is_post_autosave($post_id);
    $is_revision = wp_is_post_revision($post_id);
    $is_valid_nonce = (isset($_POST[\'aps_meta_save_nounce\']) && wp_verify_nonce( $_POST[\'aps_meta_save_nounce\'], \'aps_meta_save\' )? \'true\': \'false\');

    if ( $is_autosave || $is_revision || !$is_valid_nonce ) return;
   // Is the user allowed to edit the post or page?
    if ( !current_user_can( \'edit_post\', $post_id )) return;
    $aps_display_post_title = (isset($_POST[\'aps_display_post_title\']))? sanitize_text_field( $_POST["aps_display_post_title"] ): \'\' ;

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);
}
// save only when aps post slider posttype is saved
    add_action( \'save_post_apspostslider\', \'aps_meta_save\');
我在保存时尝试了以下代码,但在这种情况下,默认选中了复选框。但当我取消选中并保存帖子时,复选框仍处于选中状态。

    $aps_display_post_title = (isset($_POST[\'aps_display_post_title\']))? sanitize_text_field( $_POST["aps_display_post_title"] ): \'yes\' ;

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);
UPDATE: 更换挂钩后,一切正常。当新创建或更新帖子时,save\\u post挂钩将运行。因此,保存元数据的函数将在创建帖子时运行,因此默认值将保存在数据库中。然而,现在在将钩子更改为“edit\\u post”之后,一切都正常了。多亏了兄弟majick 谁帮助了我。所有工作代码如下所示:

//Show meta box
function aps_add_meta_box() {
add_meta_box(
    \'aps_metabox\',
    __( \'Slider Settings & Shortcode Generator\', APS_TEXTDOMAIN ),
    \'aps_metabox_cb\',
    \'apspostslider\',
    \'normal\'
);
}
add_action( \'add_meta_boxes\', \'aps_add_meta_box\' );

/**
 * Prints the box content.
 */
function aps_metabox_cb( $post ) {


    // Add a nonce field so we can check for it later.
    wp_nonce_field( \'aps_meta_save\', \'aps_meta_save_nounce\' );
    $aps_display_post_title = get_post_meta( $post->ID, \'aps_display_post_title\', true );
    <input type="checkbox" name="aps_display_post_title" value="yes" <?php if ($aps_display_post_title != \'no\') { echo \'checked\'; }?>/>

}

// Save or Update metabox data
function aps_meta_save( $post_id, $post ) {

if ($post->post_type != \'apspostslider\') {return;}
// Perform checking for before saving
$is_autosave = wp_is_post_autosave($post_id);
$is_revision = wp_is_post_revision($post_id);
$is_valid_nonce = (isset($_POST[\'aps_meta_save_nounce\']) && wp_verify_nonce( $_POST[\'aps_meta_save_nounce\'], \'aps_meta_save\' )? \'true\': \'false\');

if ( $is_autosave || $is_revision || !$is_valid_nonce ) return;
// Is the user allowed to edit the post or page?
if ( !current_user_can( \'edit_post\', $post_id )) return;

 if ( (isset($_POST[\'aps_display_post_title\']))
         && ($_POST[\'aps_display_post_title\'] == \'yes\') ) {
        $aps_display_post_title = \'yes\';
} else {$aps_display_post_title = \'no\';}

    update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);

add_action( \'edit_post\', \'aps_meta_save\', 10, 2);

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

我认为问题可能在于使用checked...

 <input type="checkbox" name="aps_display_post_title" value="yes" <?php if ($aps_display_post_title != \'no\') {echo \'checked\';} ?> />
。。。另一方面,然后运行sanitize_text_field 复选框上的值也可能导致问题。

相反,您可能希望以不同的方式分解逻辑,以便更容易理解,并将其用于上面检查值是否为no 因此,默认设置为选中:

if ( (isset($_POST[\'aps_display_post_title\'])) 
  && ($_POST[\'aps_display_post_title\'] == \'yes\') ) {
    $aps_display_post_title = \'yes\';}
} else {$aps_display_post_title = \'no\';}

update_post_meta($post_id, "aps_display_post_title", $aps_display_post_title);
UPDATE

要防止在创建后触发metasave函数,请钩住edit_post 而不是save_post (并使用传递的第二个参数(即$post)...

add_action( \'edit_post\', \'aps_meta_save\', 10, 2);

function aps_meta_save($post_id, $post) {

    if ($post->post_type != \'apspostslider\') {return;}

    ...

SO网友:Ismail

您的代码将生成值yes 仅当用户填写表单时。您可以检查元是否不存在,然后进行检查,或者尝试以下操作:

$aps_display_post_title = get_post_meta( $post->ID, \'aps_display_post_title\', true );
$aps_display_post_title = ! ( \'off\' == (string) $aps_display_post_title );

?>
    <input type="checkbox" name="aps_display_post_title" <?php checked( $aps_display_post_title ); ?> />
<?php


// updating the meta
$aps_display_post_title = ! empty($_POST[\'aps_display_post_title\'])? \'on\' : \'off\'; // call this only when the checkbox is in the screen
update_post_meta( $post_id, "aps_display_post_title", $aps_display_post_title );
我想它应该会起作用。但是,如果复选框不在屏幕中的表单中,则不要调用更新脚本,即使选中,也会取消复选框。。

相关推荐

如何在WordPress开发中添加带有ACF自定义字段ID的自定义metabox字段

我是wordpress开发的新手,我在我的项目中安装了高级自定义字段插件,并创建了两个文本字段名称&;我还创建了一个插件,可以在帖子中创建一个带有文本框的元框。现在在帖子中,我将获得自定义字段名称(&A);电子邮件和我的自定义元框旁边将出现,但我必须将我的元框附加到名称字段旁边,即在名称字段和电子邮件字段之间。我的metabox代码如下。请任何人帮帮我//Creating the custom meta box function my_notice_meta_box() {