Query WP post meta value
Sto cercando di ottenere i post che hanno il valore meta trainees
.
$args = array(
'posts_per_page' => -1,
'orderby' => 'post_date',
'order' => 'DESC',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'enterprise_on_page',
'value' => array( 'trainees' ),
'compare' => 'IN',
),
),
);
$enterprise_posts = get_posts( $args );
Nel mio meta-field con la chiave enterprise_on_page ho precedentemente memorizzato un array() come update_post_meta( $post_id, 'enterprise_on_page', array('trainees', 'staff') );
.
Se eseguo var_dump(get_post_meta($post->ID))
ottengo il seguente output:
'enterprise_on_page' =>
array (size=1)
0 => string 'a:2:{i:0;s:8:"trainees";i:1;s:7:"staff";}'
Come posso modificare la mia query in modo che vengano mostrati solo i post con il valore meta trainees
? Al momento non ottengo alcun post.
Grazie a @Howdy_McGee. Mi ha suggerito di cercare informazioni sulle query meta serializzate. Con questo codice ottengo il risultato desiderato.
$args = array(
'posts_per_page' => -1,
'orderby' => 'post_date',
'order' => 'DESC',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'enterprise_on_page',
'value' => serialize(strval('trainees')),
'compare' => 'LIKE',
),
),
);
$enterprise_posts = get_posts( $args );

Non credo tu possa confrontare accuratamente i valori per un Array Serializzato, cosa che accade ogni volta che passi un array a update_post_meta
. È necessario ottenere l'intero valore durante il tuo ciclo utilizzando:
get_post_meta( $post->ID, 'enterprise_on_page', 1 )
Se hai bisogno di specificare query basate su questi valori, è meglio salvarli separatamente.
Consulta questa domanda per maggiori informazioni:

Con la struttura attuale dei tuoi dati, non puoi usare SQL per farlo (almeno non in modo performante). Hai due opzioni:
- Recuperare TUTTI i post e scorrerli in memoria cercando i meta post corretti, oppure
- Memorizzare separatamente i valori meta.
Tra le due, consiglio la seconda. WordPress ti permette di memorizzare più righe dello stesso meta post per un singolo post, così puoi ottenere un array di dati senza bisogno di serializzarli e memorizzarli in una singola chiave. Per fare ciò, devi modificare leggermente come interagisci con l'API dei meta post. Ecco cosa dovresti fare:
Quando recuperi i meta post, faresti:
get_post_meta($ID, 'enterprise_on_page', false);
L'aggiornamento sarebbe la parte più diversa. Se vuoi semplicemente aggiungere un valore, fai:
add_post_meta($ID, 'enterprise_on_page', $value);
Per aggiornare un valore:
update_post_meta($ID, 'enterprise_on_page', $new_value, $old_value);
E per rimuovere un valore:
delete_post_meta($ID, 'enterprise_on_page', $value_to_delete);
