web-dev-qa-db-fra.com

meta_query avec plusieurs valeurs

J'ai besoin de ton aide.

Il y a mon problème: j'ai un type de message personnalisé "Player". Et ceciCPTa un champ personnalisé "Saisons". Les saisons peuvent avoir plusieurs valeurs séparées par une virgule - par exemple "2014,2015,2016" etc.

Maintenant, j'ai besoin de la liste de filtrage des joueurs ayant joué à certaines saisons - par exemple 2015 et 2016.

Et maintenant, j'ai besoin de votre aide avec ce wp_query. J'essaie ce code, mais ça ne marche pas: - /

query_posts(
    array(

        'post_type' => 'player',
        'meta_query' => array(

            array(
                'key'     => 'seasons',
                'value'   => array( '2015','2016'),
                'compare' => 'IN',
            ),

        ),

    )

);

S'il vous plaît aider.

Merci,
libor

2
libor

Développer un peu la réponse de @dgarceran

En règle générale, l’utilisation de la classe WP_Query est probablement une bonne idée pour interroger des publications.

Nous voudrons passer des arguments à cette requête.

Dans votre cas, nous voudrons probablement utiliser l'un des éléments suivants:

  1. " Paramètres de champ personnalisés " - meta_query
  2. " Paramètres de taxonomie " - tax_query

Pour un exemple presque complet de toutes les options, je me réfère à cet article: Gist: https://Gist.github.com/luetkemj/2023628 .

Voir également le Codex: https://codex.wordpress.org/Class_Reference/WP_Query

Les deux prennent un tableau de tableaux associatifs, par ex.

Note : J'utiliserai une syntaxe compatible avec à partir de PHP 5.4

    $meta_query_args = [
        [
            'key'     => 'season',
            'value'   => [ '2015', '2016' ],
            'compare' => 'IN',
        ],
    ];

Nous pouvons apporter ces arguments dans notre instance de WP_Query

    $args = [
        'post_type'      => 'player',
        'posts_per_page' => 100, // Set this to a reasonable limit
        'meta_query'     => $meta_query_args,

    ];

    $the_query = new WP_Query( $args );

À ce stade, WordPress vérifie tous les articles qui correspondent à votre type de message personnalisé player. Ensuite, il interrogera les métadonnées que vous avez définies avec la clé season. Toute publication correspondant à 2015 ou 2016 sera renvoyée.

Remarque: utiliser meta_query de cette façon n'est généralement pas recommandé car il est un peu lourd sur la base de données. Le consensus semble être que l'interrogation des taxonomies est plus performante (ne me citez pas là-dessus, je ne pourrais pas trouver ma source)

Donc, pour une alternative rapide, je recommande l'exemple suivant:

    $tax_query_args = [
        [
            'taxonomy' => 'season',
            'field'    => 'slug',
            'terms'    => [ '2015', '2016' ],
            'operator' => 'IN',
        ],
    ];

    $args = [
        'post_type'      => 'player',
        'posts_per_page' => 100, // Set this to a reasonable limit
        'tax_query'      => $tax_query_args,
    ];

    $the_query = new WP_Query( $args );

Maintenant, nous pouvons réellement parcourir les données, voici quelques exemples de balises:

        <section class="season-list">
            <?php while ( $the_query->have_posts() ) : $the_query->the_post();
                $post_id = get_the_ID();
                // $season  = get_post_meta( $post_id, 'season', true ); // example if you are still going to use post meta
                $season = wp_get_object_terms( $post_id, 'season', [ 'fields' => 'names' ] );
                ?>

                <h3><?php the_title(); ?></h3>
                <p><?php echo __( 'Season: ' ) . sanitize_text_field( implode( $season ) ); ?></p>

            <?php endwhile; ?>
        </section>

Lorsque vous utilisez WP_Query en particulier dans les modèles, assurez-vous de terminer par wp_reset_postdata();

Le mettre tout à fait (tl; dr)

    $tax_query_args = [
        [
            'taxonomy' => 'season',
            'field'    => 'slug',
            'terms'    => [ '2015', '2016' ],
            'operator' => 'IN',
        ],
    ];

    $args = [
        'post_type'      => 'player',
        'posts_per_page' => 100, // Set this to a reasonable limit
        'tax_query'      => $tax_query_args,
    ];

    $the_query = new WP_Query( $args );

    ?>
        <section class="season-list">
            <?php while ( $the_query->have_posts() ) : $the_query->the_post();
                $post_id = get_the_ID();
                // $season  = get_post_meta( $post_id, 'season', true ); // example if you are still going to use post meta
                $season = wp_get_object_terms( $post_id, 'season', [ 'fields' => 'names' ] );
                ?>

                <h3><?php the_title(); ?></h3>
                <p><?php echo __( 'Season: ' ) . sanitize_text_field( implode( $season ) ); ?></p>

            <?php endwhile; ?>
        </section>
    <?php

    wp_reset_postdata();

Vue frontale de notre requête:  Example Front End  Vue du tableau de bord des messages du joueur CPT:  Example CPT Player posts 

J'espère que cela fournit un peu de contexte ????????

2
Michael Mizner

Voici comment je le ferais avec The Loop et en utilisant Exemples Codex .

$args = array(
    'post_type'  => 'player',
    'meta_key'   => 'age',
    'meta_query' => array(
        array(
            'key'     => 'seasons',
            'value'   => array( 2015, 2016 ), // or array( '2015', '2016' )
            'compare' => 'IN',
        ),
    ),
);
// The Query
$query = new WP_Query( $args );

// The Loop
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // do something
    }
} else {
    // no posts found
}

// Restore original Post Data
wp_reset_postdata();

Votre problème est que vous ajoutez des valeurs dans une chaîne comme "2015,2016,2017" ... et vous devez séparer chaque valeur dans un champ différent. Avec ACF , vous avez la possibilité d’ajouter un répéteur de saisons et vous pouvez également faire une taxonomie personnalisée pour enregistrer ces valeurs plutôt qu’une méta de publication. Si vous ne voulez pas changer cela, vous devriez d'abord récupérer vos méta-données post avec get_post_meta et utiliser explod avec PHP.

0
dgarceran