meta_query cu valori multiple

23 dec. 2016, 02:02:35
Vizualizări: 19.3K
Voturi: 3

Am nevoie de ajutorul tău.

Problema mea este: am un tip de postare personalizată "Jucător". Și această CPT are un câmp personalizat "Sezoane". Sezoanele pot avea valori multiple separate prin virgulă - de exemplu "2014,2015,2016" etc.

Acum trebuie să filtrez lista de jucători care au jucat în anumite sezoane - de exemplu 2015 și 2016.

Și acum am nevoie de ajutorul tău cu acest wp_query. Am încercat acest cod, dar nu funcționează :-/

query_posts(
    array(

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

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

        ),

    )

);

Te rog ajută-mă.

Mulțumesc,
libor

0
Toate răspunsurile la întrebare 2
0

Extinzând puțin răspunsul de la @dgarceran

În general, utilizarea clasei WP_Query este probabil o idee bună pentru interogarea postărilor.

Vom dori să transmitem argumente acestei interogări.

În cazul tău, probabil vom dori să folosim una dintre următoarele opțiuni:

  1. "Parametri de câmp personalizat" - meta_query
  2. "Parametri de taxonomie" - tax_query

Pentru un exemplu aproape complet al tuturor opțiunilor, îmi place să mă refer la acest gist: https://gist.github.com/luetkemj/2023628.

Vezi și Codex-ul: https://codex.wordpress.org/Class_Reference/WP_Query

Ambele acceptă un array de array-uri asociative, de exemplu:

Notă: Voi folosi sintaxă compatibilă cu PHP 5.4 și mai nou

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

Putem include aceste argumente în instanța noastră de WP_Query

    $args = [
        'post_type'      => 'player',
        'posts_per_page' => 100, // Setați aceasta la o limită rezonabilă
        'meta_query'     => $meta_query_args,
    ];

    $the_query = new WP_Query( $args );

Ce se întâmplă în acest moment este că WordPress va verifica toate postările care se potrivesc cu tipul tău de postare personalizată player. Apoi, va interoga metadatele pe care le-ai setat cu cheia season. Orice postări care se potrivesc cu 2015 sau 2016 vor fi returnate.

Notă: utilizarea meta_query în acest fel nu este în general recomandată, deoarece este puțin solicitantă pentru baza de date. Consensul pare să fie că interogarea taxonomiilor este mai eficientă (nu lua asta de bun, nu mi-am găsit sursa)

Deci, pentru o alternativă rapidă, recomand următorul exemplu:

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

    $args = [
        'post_type'      => 'player',
        'posts_per_page' => 100, // Setați aceasta la o limită rezonabilă
        'tax_query'      => $tax_query_args,
    ];

    $the_query = new WP_Query( $args );

Acum putem parcurge efectiv datele, iată un exemplu de markup:

        <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 ); // exemplu dacă încă folosești meta pentru postări
                $season = wp_get_object_terms( $post_id, 'season', [ 'fields' => 'names' ] );
                ?>

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

            <?php endwhile; ?>
        </section>

Când folosești WP_Query, mai ales în template-uri, asigură-te că închei cu wp_reset_postdata();

Punând totul laolaltă (tl;dr)

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

    $args = [
        'post_type'      => 'player',
        'posts_per_page' => 100, // Setați aceasta la o limită rezonabilă
        '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 ); // exemplu dacă încă folosești meta pentru postări
                $season = wp_get_object_terms( $post_id, 'season', [ 'fields' => 'names' ] );
                ?>

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

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

    wp_reset_postdata();

Vedere front-end a interogării noastre: Exemplu interfață front-end Vedere din panoul de control a postărilor CPT Player: Exemplu postări CPT Player

Sper că acest lucru oferă un pic de context

14 sept. 2017 05:50:14
1

Iată cum aș proceda eu folosind The Loop și exemple din Codex.

$args = array(
    'post_type'  => 'player', // Tipul postării
    'meta_key'   => 'age', // Cheia meta pentru vârstă
    'meta_query' => array(
        array(
            'key'     => 'seasons', // Cheia meta pentru sezoane
            'value'   => array( 2015, 2016 ), // sau array( '2015', '2016' )
            'compare' => 'IN', // Comparare în array
        ),
    ),
);
// Interogarea
$query = new WP_Query( $args );

// The Loop
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // faci ceva aici
    }
} else {
    // nu s-au găsit postări
}

// Restabilirea datelor originale ale postării
wp_reset_postdata();

Problema ta este că adaugi valori într-un singur șir de genul "2015,2016,2017"... și ar trebui să separi fiecare valoare într-un câmp diferit. Cu ACF ai opțiunea de a adăuga un repeater pentru sezoane, și poți crea și o taxonomie personalizată pentru a stoca aceste valori, în loc de metadate. Dacă nu vrei să schimbi asta, ar trebui să preiei mai întâi metadatele postării cu get_post_meta, și să folosești explode în PHP.

23 dec. 2016 11:19:20
Comentarii

ok, mulțumesc pentru răspuns...

cum pot face asta cu post meta? cum pot obține primul get_post_meta în meta_query? nu înțeleg...

libor libor
23 dec. 2016 13:20:11