web-dev-qa-db-fra.com

comment définir la valeur par défaut pour la case à cocher dans wordpress

Je suis confronté à un problème pour définir la valeur par défaut du champ de case à cocher dans WordPress. J'ai un champ de saisie de case à cocher (metabox) dans un message personnalisé. Je veux que la case à cocher soit cochée par défaut. et si l'utilisateur décoche la case, celle-ci devrait être sauvegardée et décochée et rester décochée lorsque la page est actualisée. Mon problème est que je ne peux pas définir la valeur par défaut pour la case à cocher. Je n'ai que deux valeurs avec lesquelles travailler. Le problème principal se pose, car la fonction savemetadata est activée lorsque je clique sur "Ajouter un nouveau message". Ainsi, une valeur par défaut est automatiquement enregistrée dans la base de données sans enregistrer le nouveau message. J'essaie depuis 3 jours maintenant. J'ai essayé de sauvegarder une valeur par défaut "oui" lorsque l'utilisateur ne coche pas la case.

mais dans ce cas, lorsque l'utilisateur décoche, il devient toujours coché avec la valeur par défaut. mon extrait de code actuel

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

Le code pour sauvegarder les données metabox dans la sauvegarde:

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

J'ai essayé le code suivant lors de la sauvegarde, mais dans ce cas, la case à cocher est cochée par défaut. mais quand je décoche et enregistre le post, alors la case à cocher est restée cochée.

    $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: Maintenant tout fonctionne après le changement de hook. Le hook save_post s'exécute lorsqu'une publication est créée ou mise à jour. SO, la fonction de sauvegarde des métadonnées s’exécutait lors de la création d’une publication. Ainsi, une valeur par défaut était enregistrée dans la base de données. Cependant, maintenant, après avoir changé le hook en - "edit_post", maintenant tout fonctionne. Merci au frère majick qui m'a aidé. Tout le code de travail est donné ci-dessous:

//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

Je pense que le problème pourrait être la logique d'utilisation de checked...

 <input type="checkbox" name="aps_display_post_title" value="yes" <?php if ($aps_display_post_title != 'no') {echo 'checked';} ?> />

... d'autre part, exécuter sanitize_text_field sur la case à cocher pourrait également être à l'origine du problème.

Au lieu de cela, vous voudrez peut-être décomposer la logique différemment pour la rendre plus facile à comprendre. Utilisez-la avec le code ci-dessus qui vérifie que la valeur n'est pas no et sera par défaut comme cochée:

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);

METTRE À JOUR

Pour éviter que la fonction metasave ne se déclenche lors de la création du post, connectez-vous à edit_post au lieu de save_post (et effectuez la vérification du type de post en interne à l'aide du deuxième argument transmis, à savoir $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

Votre code rendra la valeur yes uniquement lorsque l'utilisateur remplira le formulaire. Vous pouvez vérifier si le méta n'est pas là, puis le vérifier, ou essayez ceci:

$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 );

Je suppose que ça devrait marcher. MAIS n’appelez pas le script de mise à jour si la case à cocher ne se trouve pas sous la forme à l’écran, cela désélectionnera les cases même si elle est cochée.

0
Samuel Elh