web-dev-qa-db-fra.com

Comment faire un multicheck pour un meta box post/page

Aidez-moi à comprendre comment créer le type Multicheck pour metabox. Rechercher pour tout internet et rien. Merci.


METTRE À JOUR

@Jan j'ai un mal de tête de cette fonction. Je ne sais pas ce qui ne va pas. J'essaie votre méthode mais rien, alors j'essaie get_posts mais avec cette méthode, j'ai trop de problèmes. Avec votre méthode, j'obtiens cette erreur avant le contenu:

Warning: urldecode() expects parameter 1 to be string, array given in Z:\home\mysite.net\www\wp-includes\query.php on line 1878

Voici mon code:

<?php
        $catids = get_post_meta($post->ID,'_mtb_multicheck',false);
        $limit = 10;
        query_posts( array('posts_per_page' => $limit, 'cat' => $catids, 'paged' => get_query_var('paged') ) );
    ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>

        <!-- Content-->

<?php endwhile; ?>  
            <?php pagination(); ?>
<?php else : ?>
            <!--Error message here-->

<?php endif; ?>

Je veux savoir ce que mes vatiables retournent. Faites ceci:

query_posts( array('posts_per_page' => $limit, 'cat' => print_r($catids), 'paged' => get_query_var('paged') ) );

et obtenez ceci sur ma page:

Array ( [0] => 5 [1] => 5 [2] => 3 )

Je pense que c'est mon query_posts imprimé, pas $ catids. C'est un très gros problème. Je me sens comme un nerd. Aidez-moi, s'il vous plaît.

2
Denis Belousov

Les métadonnées de publication peuvent stocker plusieurs valeurs en tant qu'entrées distinctes dans la table postmeta ou en une entrée avec la valeur sous la forme d'un tableau sérialisé PHP. La sérialisation peut nécessiter moins de code, mais les entrées distinctes permettent une interrogation plus rapide plus tard ("donnez-moi toutes les publications dont au moins l'option A du multicheck est cochée").

J'ai pris le code que vous avez lié et apporté les modifications suivantes pour permettre un "multicheck":

// in show():
// Line 254: replace it by:
$meta = get_post_meta($post->ID, $field['id'], 'multicheck' != $field['type'] /* If multicheck this can be multiple values */);
// Add the following to the switch:
case 'multicheck':
    foreach ( $field['options'] as $value => $name ) {
        // Append `[]` to the name to get multiple values
        // Use in_array() to check whether the current option should be checked
        echo '<input type="checkbox" name="', $field['id'], '[]" id="', $field['id'], '" value="', $value, '"', in_array( $value, $meta ) ? ' checked="checked"' : '', ' /> ', $name, '<br/>';
    }
    break;

// In save():
// Line 358: replace it by:
$old = get_post_meta($post_id, $name, 'multicheck' != $field['type'] /* If multicheck this can be multiple values */);
// Lines 409-413: Wrap them in an else-clause, and prepend them by:
if ( 'multicheck' == $field['type'] ) {
    // Do the saving in two steps: first get everything we don't have yet
    // Then get everything we should not have anymore
    if ( empty( $new ) ) {
        $new = array();
    }
    $aNewToAdd = array_diff( $new, $old );
    $aOldToDelete = array_diff( $old, $new );
    foreach ( $aNewToAdd as $newToAdd ) {
        add_post_meta( $post_id, $name, $newToAdd, false );
    }
    foreach ( $aOldToDelete as $oldToDelete ) {
        delete_post_meta( $post_id, $name, $oldToDelete );
    }
} else {
    // The original lines 409-413
}

Deux modifications supplémentaires pour empêcher les avertissements PHP lorsque WP_DEBUG est activé:

// Line 337:
if ( ! isset( $_POST['wp_meta_box_nonce'] ) || !wp_verify_nonce($_POST['wp_meta_box_nonce'], basename(__FILE__))) {
// Line 359:
$new = isset( $_POST[$field['id']] ) ? $_POST[$field['id']] : null;

Avec ces modifications, vous pouvez utiliser un "multicheck" en le définissant comme suit:

array(
    'name' => 'Multicheck',
    'id' => $prefix . 'multicheck',
    'type' => 'multicheck',
    'options' => array(
        'a' => 'Apple',
        'b' => 'Banana',
        'c' => 'Cherry',
    ),
)
4
Jan Fabry