Utilizzo di get_terms() con parametri meta_query
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?
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).
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
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