web-dev-qa-db-fra.com

Lister des pages avec des cases à cocher dans une Metabox (et les sauvegarder)

Voici ce que j'essaie essentiellement d'accomplir:

  1. J'ai un type de message personnalisé appelé "citations"
  2. J'ai plusieurs pages wordpress

Voici ce que j'essaie de faire: chaque fois que je crée un nouveau post "CITATIONS", je veux pouvoir choisir la page sur laquelle ce post doit être placé. J'ai décidé de le faire en créant une nouvelle métabox sur la page de publication "citations" et en listant toutes les pages de cette métabox, avec une case à cocher devant elles:

pages listing metabox screenshot

Tout va bien, mais maintenant je ne sais pas comment sauvegarder ces cases à cocher.

Voici la fonction que j'utilise pour imprimer le contenu de la métabox:

function myplugin_inner_custom_box( $post ) {
    $custom = get_post_custom($post->ID);
    $checkfield = $custom["checkfield"][0];

    // Nonce to verify intention later
    wp_nonce_field( 'save_quote_meta', 'custom_nonce' ); 
    $pages = get_pages(); 

    foreach ( $pages as $page ) { ?>   
        <input type="checkbox" name="checkfield_<?php echo $page->ID; ?>" value="yes" <?php if ($checkfield == 'yes') { ?> checked <?php } ?> /> <?php echo $page->post_title; ?> <br>   
    <?php 
    } 
}

Et voici la fonction que j'utilise pour les sauvegarder:

//save the meta box action
add_action( 'save_post', 'myplugin_meta_save' );

//save the meta box
function myplugin_meta_save()
{
    global $post;
    update_post_meta($post->ID, 'checkfield', $_POST['checkfield'] );
}

Évidemment, cela ne fonctionne pas - je ne sais pas comment sauvegarder toutes les valeurs de ces champs de contrôle.

4
Gabriela

Vous utilisez checkfield_<?php echo $page->ID; ?> comme nom pour vos champs de saisie, puis vous essayez de sauvegarder $_POST['checkfield'] qui est not set.

Vous pouvez effectuer la même boucle $pages sur la fonction myplugin_meta_save(), puis enregistrer les données de chaque page en tant qu'entrée meta_key distincte (checkfield_1, checkfield_5, etc.), OR, vous pouvez enregistrer toutes ces données dans un seul meta_key qui est checkfield dans ce cas, et un petit ajustement de votre code est nécessaire pour y parvenir:

function myplugin_inner_custom_box( $post ) {
    // we store data as an array, we need to unserialize it
    $checkfield = maybe_unserialize( get_post_meta($post->ID, "checkfield", true) );

    // Nonce to verify intention later
    wp_nonce_field( 'save_quote_meta', 'custom_nonce' ); 

    $pages = get_pages(); 
    foreach ( $pages as $page ) { ?>
        <input id="page_<?php echo $page->ID; ?>" type="checkbox" name="checkfield[]" value="<?php echo $page->ID; ?>" <?php if ( in_array($page->ID, (array) $checkfield) ) { ?> checked <?php } ?>/> <label for="page_<?php echo $page->ID; ?>"><?php echo $page->post_title; ?></label> <br>
<?php 
    } 
}
//save the meta box action
add_action( 'save_post', 'myplugin_meta_save', 10, 2 );

//save the meta box
function myplugin_meta_save($post_id, $post)
{   
    if ( isset($_POST['checkfield']) ) { // if we get new data

        update_post_meta($post_id, "checkfield", $_POST['checkfield'] );

    }
}

Notez que name="checkfield" dans le champ de saisie est remplacé par name="checkfield[]", ce qui rendra les données stockées sous forme de tableau dans la variable $_POST['checkfield']. De même, l'attribut value est passé de yes à $page->ID.

Mise à jour: cast checkfield à array: if ( in_array($page->ID, (array) $checkfield) )

4
Ahmad M