Posso interrogare i meta dati personalizzati attraverso WP_Query

4 ott 2012, 19:37:01
Visualizzazioni: 24.3K
Voti: 6

Ok, la mia domanda è un po' complessa quindi cercherò di dare una spiegazione generale e poi entrare nei dettagli.

Sto utilizzando WordPress 3.4.2 e sto usando WCK Post Type Creator e WCK Custom Fields Creator per creare il mio custom post type e i campi personalizzati.

Sto cercando di interrogare i post dal custom post type 'business' che hanno un campo personalizzato 'special' associato. Il mio problema è che vorrei essere più specifico e ottenere solo un certo tipo di special (che è impostato nel plugin Custom Fields Creator) ma non so se/come posso farlo usando l'argomento meta_query per WP_Query.

Quello che ho ora estrarrà i post dal post type ma poi devo usare get_post_meta() per trovare i campi personalizzati e ciclare attraverso di essi facendo test per quello che voglio. Ecco quello che ho al momento:

<?php   
$args = array(
    'post_type' => 'business',
    'meta_query'  => array(
                array(
                    'key' => 'specials'
                )
            )

    );
$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post(); 

$specials = get_post_meta( $post->ID, 'specials'); 

//Ciclo attraverso l'array degli specials
foreach( $specials as $special){

    //Ciclo attraverso ogni special
    foreach($special as $individual){

    //Controllo se c'è uno special sulle bevande
    if ($individual ['type-of-special'] == 'Drink' ) { 
        //Fai qualcosa          

    }//individual
    }//special
} //specials

endwhile; ?>

Quindi, quello che sto facendo qui è estrarre i post e poi per ogni post ottenere i meta dati 'specials' e ciclare attraverso i diversi array per controllare che tipo di special è e poi mostrare contenuti se è il tipo giusto di special. C'è un modo per essere più specifici nella mia WP_query così da restituire solo i post che sono di un certo tipo di special?

Il problema che sembro incontrare è che non so come scavare abbastanza in profondità negli array multidimensionali che il campo personalizzato 'specials' ha per controllare i valori con l'argomento meta_query per WP_Query.

Se stampo $special nel foreach($specials as $special) ottengo questo:

Array
(
    [0] => Array
        (
            [type-of-special] => Drink
            [name-of-special] => Pumpkin Latte
            [price] => 2.00
            [day-of-the-week] => Lunedì, Martedì, Mercoledì, Giovedì, Venerdì, Sabato, Domenica
        )
)

Quindi non so come arrivare alla chiave [type-of-special] per controllare il suo valore attraverso meta_query.

So che queste sono molte informazioni e apprezzo davvero qualsiasi feedback e aiuto per risolvere questo problema. Se avete bisogno di maggiori informazioni o chiarimenti su qualcosa fatemelo sapere. Grazie ancora!

1
Commenti

Evita array multidimensionali

Tom J Nowell Tom J Nowell
4 ott 2012 21:11:01
Tutte le risposte alla domanda 2
8
11

Normalmente dovresti specificare semplicemente un meta_value, ad esempio:

 $args = array(
     'post_type' => 'business',
     'meta_query'  => array(
            array(
                'key' => 'specials',
                'value' => 'questi non sono gli speciali che stai cercando - Obi Wan Kenobi'
            )
        )

);

Tuttavia, poiché i tuoi post meta sono in realtà una struttura dati, un array/oggetto PHP serializzato, questo non è possibile.

Puoi leggere di più qui:

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

4 ott 2012 19:51:44
Commenti

Non sono sicuro di come formattare il campo 'value' perché le informazioni che devo verificare sono contenute in un array. Ho provato questi: 'value' => 'Drink' 'value' => 'type-of-special' 'value' => array([type-of-special]=>'Drink')

ma nessuno di questi funziona. Hai idea di come dovrei formattarlo per accedere a quegli array? Grazie

yoxalld yoxalld
4 ott 2012 20:39:53

perché faresti 'value' => 'type-of-special' 'value' => array([type-of-special]=>'Drink')? Accedi semplicemente al campo dell'array che ti interessa, è PHP di base, ad esempio per accedere all'elemento 5 nell'array 'stuff' fai $thefifthvalueinstuff = $stuff[5];

Tom J Nowell Tom J Nowell
4 ott 2012 21:08:53

in realtà guardando il tuo codice anche la tua domanda di follow up non ha senso. Impostalo su 'Drink', e non dovrai verificare se è di tipo drink perché verranno restituiti solo i tipi drink

Tom J Nowell Tom J Nowell
4 ott 2012 21:10:35

Penso che il problema sia con il modo in cui WCK Custom Fields Creator memorizza i campi personalizzati che crea. La meta box personalizzata è 'specials' ma 'Drink' è solo un'informazione contenuta all'interno di quel campo personalizzato, quindi non viene riconosciuta da meta_query come 'key'.

Ecco perché ho pubblicato l'output di $special, perché ho bisogno di aiuto per capire come accedere alle informazioni contenute all'interno di quegli array. Scusa per la confusione. Grazie

yoxalld yoxalld
4 ott 2012 22:10:04

Ma la tua meta query avviene prima del loop, non hai ancora nessuno di quei dati quindi non puoi usarli nei tuoi argomenti di query

Tom J Nowell Tom J Nowell
4 ott 2012 22:20:05

Ok bene, continuerò a fare i controlli all'interno del Loop, non ero sicuro se ci fosse un modo più corretto di farlo rispetto a come stavo facendo. Apprezzo molto il tuo aiuto! Grazie

yoxalld yoxalld
4 ott 2012 22:46:56

AHA scusa ora ho capito, dovrai memorizzare i tuoi post meta in modo diverso, poiché i valori dei post meta sono oggetti serializzati

Tom J Nowell Tom J Nowell
5 ott 2012 00:20:16

Ho aggiornato la mia risposta per riflettere questo, scusa, avrei dovuto notare prima che il meta non era un valore singolo

Tom J Nowell Tom J Nowell
5 ott 2012 00:21:57
Mostra i restanti 3 commenti
0
    $args = array(
        'post_type' => "tuo_tipo_di_post",
        'meta_key' => 'nome_della_meta_key',
        'meta_compare' => '=', // vedi documentazione per le opzioni di confronto
        'meta_value ' => 'il_valore_che_vuoi_cercare'
    );

    $posts = new WP_Query( $args );

https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters

se vuoi cercare elementi che non sono vuoti

    $args = array(
        'post_type' => "tuo_tipo_di_post",
        'meta_key' => 'nome_della_meta_key',
        'meta_compare' => '!=',
        'meta_value ' => ''
    );

    $posts = new WP_Query( $args );
22 gen 2021 14:41:24