web-dev-qa-db-ja.com

ワードプレスのチェックボックスのデフォルト値を設定する方法

WordPressのチェックボックスフィールドにデフォルト値を設定すると問題が発生します。カスタム投稿にチェックボックス入力フィールド(メタボックス)があります。チェックボックスをデフォルトでオンにします。ユーザーがチェックを外した場合は、保存してチェックを外し、ページが更新されてもチェックを外したままにします。私の問題は、チェックボックスのデフォルト値を設定できないことです。私が取り組むべき価値は2つしかありません。 savemetadata関数は「add new」投稿をクリックすると実行されるため、主な問題が発生します。そのため、新しい投稿を保存せずにデフォルト値がデータベースに自動的に保存されます。私は今3日間試しています。ユーザーがチェックボックスをチェックしていないとき、デフォルト値 'yes'を保存しようとしました。

しかし、その場合、ユーザーがチェックを外しても、デフォルト値でチェックされます。私の現在のコードスニペット

// 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'); />
}

メタデータを保存機能に保存するためのコード。

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_postフックは、投稿が新しく作成または更新されたときに実行されます。つまり、投稿が作成されたときにメタデータを保存する機能が実行されるため、デフォルト値がデータベースに保存されます。しかし、フックを "edit_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
Kamal Ahmed

私は問題は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

メタセーブ関数が投稿の作成時に起動しないようにするには、edit_postではなくsave_postにフックします(そして、渡された2番目の引数である$postを使用して内部的に投稿タイプをチェックします)...

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

function aps_meta_save($post_id, $post) {

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

    ...
2
majick

ユーザーがフォームに入力したときにだけ、コードは値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 );

それは働いているはずだと思います。チェックボックスが画面のフォームにない場合は、更新スクリプトを呼び出さないでください。

0
Samuel Elh