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.

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
