Ottenere i post basati su meta key/value

4 giu 2013, 12:28:26
Visualizzazioni: 25.4K
Voti: 6

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:

Screenshot della tabella wp_postmeta che mostra la relazione tra post e autore

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

2
Commenti

$GLOBALS['wp_query']->request non sarà la tua query poiché la tua query non è $wp_query, globale o meno, è $getPosts. echo $getPosts->request è ciò che vuoi.

s_ha_dum s_ha_dum
4 giu 2013 18:07:42

Se memorizzi $getPosts perché non usare semplicemente $getPosts->posts ?

->request contiene REQUEST ovvero la query SQL per i tuoi post, non i RISULTATI ... :)

jave.web jave.web
12 giu 2017 10:02:36
Tutte le risposte alla domanda 2
7

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.

4 giu 2013 13:46:39
Commenti

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

Titan Titan
4 giu 2013 14:18:04

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

birgire birgire
4 giu 2013 14:48:34

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.

Titan Titan
4 giu 2013 17:09:26

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!!

Titan Titan
4 giu 2013 17:15:26

Ho aggiornato la mia domanda originale con un riepilogo più recente

Titan Titan
4 giu 2013 17:20:28

Risolto di seguito (scusa per lo spam!)

Titan Titan
4 giu 2013 17:36:26

ottimo sapere che hai trovato una soluzione al tuo problema ;-) Dovresti verificare la tua SQL con $getPosts->request invece.

birgire birgire
4 giu 2013 17:51:54
Mostra i restanti 2 commenti
0

Risolto utilizzando

get_posts($args) invece di new WP_Query($args);

Non ho idea del perché...

4 giu 2013 17:36:00