web-dev-qa-db-fra.com

Comment garder une case à cocher dans la méta-boîte personnalisée pour le type de message personnalisé cochée par défaut pour ajouter un nouveau message?

Dans mon plugin personnalisé, j'ai un type de message personnalisé et une méta-boîte personnalisée. J'ai peu de champs dedans, l'un d'entre eux est une case à cocher. Je souhaite que cette case soit cochée par défaut lorsque je sélectionne un add new post, puis procède à la sélection de l'utilisateur, c'est-à-dire cochée/non cochée.

J'ajoute les codes associés, c'est-à-dire: pour la métabox et comment je l'enregistre.

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 être appelé plusieurs fois est le comportement attendu, mais en raison de la manière dont il est utilisé, vous ne voudrez peut-être pas toujours que votre code soit exécuté tant que l'utilisateur n'a pas cliqué sur le bouton Enregistrer. Comme vous l'avez mentionné ci-dessus concernant votre besoin.

Ainsi, vous pouvez vérifier la page en cours (c'est-à-dire post-new.php) dans wp-admin et définir des conditions. Voici comment vous pouvez implémenter.

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

========== Ou vous pouvez aussi vérifier ceci ============

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

Cela vaut la peine de comprendre pourquoi cela se passe et ce qui se passe dans les coulisses de save_post:

  • Les messages passent par un processus de sauvegarde automatique chaque fois qu’ils sont créés et chaque fois qu’ils sont rédigés. En tant que tel, save_post est en fait déclenché plusieurs fois lorsqu'un utilisateur rédige un message.
  • Lorsque l'utilisateur clique sur "Enregistrer" ou sur "Publier", la fonction se déclenche, déclenchant ainsi un autre tour de la fonction appelée.
  • Enfin, il convient de noter que la fonction edit_post est activée une fois, mais uniquement lorsque l'utilisateur a réellement modifié un message existant.
  • -
2
Subharanjan

Si la publication est nouvelle, la valeur de get_post_meta( $post->ID, 'coupon_status' ) sera null. Une fois enregistré et le champ personnalisé désactivé, il s'agira d'une chaîne empty (""). Donc, vous devriez juste pouvoir ajouter un contrôle pour une valeur null:

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