web-dev-qa-db-ja.com

新しい投稿を追加するためにカスタム投稿タイプのカスタムメタボックスのチェックボックスをデフォルトでオンにする方法

私のカスタムプラグインでは、私はカスタム投稿タイプを持ち、それに対するカスタムメタボックスを持っています。フィールドがほとんどありません。そのうちの1つがチェックボックスです。私はadd new postに行き、次にユーザーの選択、すなわちオン/オフを選択したときにこのチェックボックスをデフォルトでチェックしたいと思います。

私は関連するコードを追加しています:メタボックスと私はそれをどのように保存しているのか。

function coupon_add_metabox() {
    add_meta_box( 'coupon_details', __( 'Coupon Details', 'domain' ), 'wpse_coupon_metabox', 'coupons', 'normal', 'high' );
}

function wpse_coupon_metabox( $post ) {

    // Retrieve the value from the post_meta table
    $coupon_status   = get_post_meta( $post->ID, 'coupon_status', true );

    // Checking for coupon active option.
    if ( $coupon_status ) {
        if ( checked( '1', $coupon_status, false ) )
            $active = checked( '1', $coupon_status, false );
    }

    // Html for the coupon details
    $html = '';

    $html .= '<div class="coupon-status"><label for="coupon-status">';
    $html .= __( 'Active', 'domain' );
    $html .= '</label>';
    $html .= '<input type="checkbox" id="coupon-status-field" name="coupon-status-field" value="1"' . $active . ' /></div>';

    echo $html;
}

function wpse_coupons_save_details( $post_id ) {
    // If this is an autosave, our form has not been submitted, so we don't want to do anything.
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return $post_id;

    // Check the user's permissions.
    if ( ! current_user_can( 'activate_plugins' ) )
        return $post_id;

    $coupon_status   = sanitize_text_field( $_POST['coupon-status-field'] );

    // Update the meta field in the database.
    update_post_meta( $post_id, 'coupon_status', $coupon_status );
}
add_action( 'save_post', 'wpse_coupons_save_details' );
2
Maruti Mohanty

save_postが複数回呼び出されることは予想される動作ですが、その使用方法のため、ユーザーが実際に保存ボタンをクリックするまでコードを実行したくない場合があります。あなたがあなたの要求に関して上で述べたように。

だからあなたはwp-adminで現在のページ(すなわちpost-new.php)をチェックし、それに基づいて条件を置くことができます。これが実装方法です。

global $pagenow;

// Checking for coupon active option.
if ( $coupon_status ) {
    if ( checked( '1', $coupon_status, false ) )
        $active = checked( '1', $coupon_status, false );
}

if ( 'post-new.php' == $pagenow ) {
    $active = 'checked';
}

==========またはあなたもこれをチェックすることができます============

if( ! ( wp_is_post_revision( $post_id) && wp_is_post_autosave( $post_id ) ) ) {
    // do the work that you want to execute only on "Add New Post"
} // end if

なぜ起こるのか、そしてsave_postの舞台裏で何が起こっているのかを理解する価値があります。

  • 投稿は作成されてドラフトされるたびに自動保存プロセスを経ます。そのため、ユーザーが投稿を下書きしている間に、save_postは実際には複数回起動されます。
  • ユーザーが[保存]または[発行]をクリックすると、関数が起動され、呼び出されている関数がもう1回起動されます。
  • 最後に、edit_post関数が一度起動するのは注目に値しますが、それはユーザーが実際に既存の投稿を編集したときだけです。
  • -
2
Subharanjan

投稿が新しい場合、get_post_meta( $post->ID, 'coupon_status' )の値はnullになります。保存すると、カスタムフィールドのチェックが外れたら、それはempty文字列("")になります。だから、あなたはnull値のチェックを追加することができるはずです:

if ( checked( '1', $coupon_status, false ) || $coupon_status == null ) {
    $active = 'checked';
}
1
Joey Yax