Utilizzo di get_terms() con parametri meta_query

2 lug 2016, 13:35:56
Visualizzazioni: 34.8K
Voti: 2

Sto cercando di costruire una query di tassonomia per visualizzare solo i termini che hanno un determinato valore di campo personalizzato assegnato. Il campo personalizzato contiene un valore booleano, quindi ho provato:

$args = array(
        'taxonomy' => 'product_cat',
        'hide_empty' => false,
        'meta_key' => 'featured',
        'meta_value' => true
    );

E anche:

$args = array(
        'taxonomy' => 'product_cat',
        'hide_empty' => false,
        'meta_query' => array(
             array(
                'key'       => 'featured',
                'value'     => true,
                'compare'   => '='
             )
        )
    );

Nessuna di queste ha restituito i risultati attesi. Cosa mi sta sfuggendo?

0
Tutte le risposte alla domanda 1
5
12

Inserimento di valori meta booleani per i termini

Quando aggiungiamo un term meta inesistente con ad esempio:

add_term_meta( 123, 'test', true );

in realtà stiamo eseguendo il seguente inserimento:

$wpdb->insert( 'wp_termmeta', array(
   'term_id' => 123,
   'meta_key' => 'test',
   'meta_value' => true
) );

all'interno della funzione generale add_metadata().

Ora wpdb::insert() è in realtà un wrapper per wpdb::_insert_replace_helper() che prepara la query SQL di inserimento e mappa i valori da inserire in:

INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)

o nel nostro caso di test:

INSERT INTO `wp_termmeta` (`term_id`, `meta_key`, `meta_value`) VALUES (123, 'test', '1')

Si noti inoltre che la colonna meta_value è di tipo longtext nella tabella wp_termmeta.

Quindi il booleano true viene memorizzato come stringa '1'.

Recupero di valori meta booleani per i termini

Quando get_terms() viene eseguito con questo tipo di meta query:

$args = array(
    'taxonomy'   => 'product_cat',
    'hide_empty' => false,
    'meta_query' => array(
         array(
            'key'       => 'featured',
            'value'     => true,
            'compare'   => '='
         )
    )
);

allora la query SQL generata contiene:

wp_termmeta.meta_key = 'featured' AND wp_termmeta.meta_value = '1' 

dove il true (booleano) viene convertito in '1' (stringa).

2 lug 2016 18:35:41
Commenti

Ancora non riesco a far restituire alcun risultato alla query, usando una stringa "1" come valore passato al meta_query ma continuerò a cercare. Grazie mille comunque per la spiegazione dettagliata.

Luis Martins Luis Martins
4 lug 2016 22:07:12

Anche il valore meta true nella query get_terms() è stato cambiato in '1' quindi penso che tu debba aver salvato i valori meta dei termini in modo diverso. Come lo memorizzi? Che tipo di codice usi? Forse lo stai memorizzando come stringa booleana 'true'? @LuisMartins

birgire birgire
5 lug 2016 12:17:44

Hai fatto progressi con il problema? @LuisMartins

birgire birgire
23 lug 2016 16:11:46

Scusa, ho completamente perso le notifiche di SO.

Luis Martins Luis Martins
13 ago 2016 16:04:54

Nessun problema, ero solo curioso ;-) @LuisMartins

birgire birgire
13 ago 2016 16:07:24