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