Ottenere i post basati su meta key/value
Ho un custom post type "custom_author" che viene selezionato quando si crea un nuovo post utilizzando un dropdown metabox con chiave campo "chosen_author".
Questo è come appare il mio wp_postmeta:
Dove 13088 è il post del blog che ha l'"autore" 13112 assegnato.
Sto cercando di ottenere tutti i post di un particolare autore usando quanto segue:
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'chosen_author',
'value' => '13112' // provato con e senza virgolette
)
)
);
$getPosts = new WP_Query($args);
Ma restituisce semplicemente TUTTI i miei post.
Ho fatto un po' di debug:
$getPosts = new WP_Query($args);
echo $GLOBALS['wp_query']->request;
e ha prodotto questo output
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (wp_posts.post_author != 0) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
Ignorando completamente l'array meta_query!
Se può essere rilevante questo viene utilizzato fuori dal loop

Il problema
Sembra che tu stia salvando i dati come:
$a = array( "13112" );
update_post_meta( $post_id, "article_author", $a);
dove questo ti darà il meta_value
a:1:{i:0;s:5:"13112";}
La tua prima query ti darà virgolette escape:
LIKE '%\"13112\"%'
Metodo 1
Se salvi l'array degli autori con numeri invece:
$a = array( 13112 );
update_post_meta( $post_id, "article_author", $a);
allora il corrispondente meta_value
sarà
a:1:{i:0;i:13112;}
Quindi quando provi la meta query:
'meta_query' => array(
array(
'key' => 'article_author',
'value' => ':13112;',
'compare' => 'LIKE'
)
)
la parte SQL corrispondente sarà
LIKE '%:13112;%'
Potresti provare a usare questo invece.
Metodo 2
Un altro modo è rimuovere le virgolette escape con virgolette non escape:
add_filter('posts_where','my_posts_where');
$getPosts = new WP_Query($args);
remove_filter('posts_where','my_posts_where');
dove
function my_posts_where($where){
$where = str_replace('\"', '"', $where);
return $where;
}
ma non lo raccomando.

Grazie per questo, non ho molto controllo sul formato di salvataggio (stringa/intero), per curiosità, perché restituisce tutti i post se chiaramente non trova una corrispondenza? Come dovrei gestire il caso in cui non vengono trovati post corrispondenti se mi restituisce tutti i miei post? Edit: OK non restituisce TUTTI i miei post ma ne restituisce centinaia

sì, è strano, quando esegui la ricerca in PHPMyAdmin, ottieni risultati simili?

Stavo usando un plugin per aiutarmi con le meta box personalizzate (un menu a discesa delle voci del mio custom post type). Mi sono immerso e ho fatto tutto da solo in functions.php e ora salvo nel database solo il numero come meta_value: 13112. Ancora nessun risultato però, vedrò se posso attivare un qualche tipo di debug che mostri la query SQL che sta cercando di eseguire.

Strano, ho usato $GLOBALS['wp_query']->request; per scoprirlo e ha restituito SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (wp_posts.post_author != 0) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
ignorando completamente il meta_query!!
