Obține postări bazate pe meta key/value

4 iun. 2013, 12:28:26
Vizualizări: 25.4K
Voturi: 6

Am un tip de postare personalizat "custom_author" care este selectat când se creează o nouă postare folosind un dropdown metabox cu cheia câmpului "chosen_author".

Iată cum arată wp_postmeta:

Exemplu structură tabel wp_postmeta cu chei și valori meta

Unde 13088 este postarea de blog care are "autorul" 13112 atribuit.

Încerc să obțin toate postările unui anumit autor folosind următorul cod:

$args = array(
        'post_type'     => 'post',
        'post_status'   => 'publish',
        'meta_query' => array(
            array(
                'key' => 'chosen_author',
                'value' => '13112' // încercat cu și fără ghilimele
            )
        )
    );

    $getPosts = new WP_Query($args);

Dar îmi returnează TOATE postările mele.

Am făcut niște debugging:

$getPosts = new WP_Query($args);
echo $GLOBALS['wp_query']->request;

și acesta a afișat

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

Ignorând complet array-ul meta_query!

Dacă contează, acest cod este folosit în afara buclei

2
Comentarii

$GLOBALS['wp_query']->request nu va fi interogarea ta, deoarece interogarea ta nu este $wp_query, globală sau altfel, ci este $getPosts. echo $getPosts->request este ceea ce cauți.

s_ha_dum s_ha_dum
4 iun. 2013 18:07:42

Dacă stochezi $getPosts de ce nu folosești direct $getPosts->posts ?

->request conține REQUEST adică interogarea SQL pentru postările tale, nu REZULTATELE... :)

jave.web jave.web
12 iun. 2017 10:02:36
Toate răspunsurile la întrebare 2
7

Problema

Se pare că salvezi datele astfel:

$a = array( "13112" );
update_post_meta( $post_id, "article_author", $a);

ceea ce va genera următorul meta_value

a:1:{i:0;s:5:"13112";}

Prima ta interogare va genera ghilimele escape-uite:

LIKE '%\"13112\"%'

Metoda 1

Dacă salvezi array-ul de autori cu numere în loc de string-uri:

$a = array( 13112 );
update_post_meta( $post_id, "article_author", $a);

atunci meta_value corespunzător va fi

a:1:{i:0;i:13112;}

Așadar, când încerci interogarea meta:

 'meta_query' => array(
            array(
                'key' => 'article_author',
                'value' => ':13112;',
                'compare' => 'LIKE'
            )
    )

partea SQL corespunzătoare va fi

LIKE '%:13112;%'

Poți încerca să folosești această metodă.

Metoda 2

O altă metodă este înlocuirea ghilimelelor escape-uite cu ghilimele normale:

add_filter('posts_where','my_posts_where');
$getPosts = new WP_Query($args);
remove_filter('posts_where','my_posts_where');

unde

function my_posts_where($where){    
    $where = str_replace('\"', '"', $where);    
    return $where;  
}

dar nu o recomand.

4 iun. 2013 13:46:39
Comentarii

Mulțumesc pentru asta, nu am prea mult control asupra formatului de salvare (șir de caractere/întreg), din curiozitate, de ce returnează toate articolele dacă în mod clar nu găsește o potrivire? Cum ar trebui să gestionez situația când nu sunt găsite articole potrivite dacă returnează toate articolele mele? Edit: OK, nu returnează TOATE articolele mele, dar returnează sute

Titan Titan
4 iun. 2013 14:18:04

da, este ciudat, când cauți în PHPMyAdmin, obții rezultate similare?

birgire birgire
4 iun. 2013 14:48:34

Foloseam un plugin pentru a mă ajuta cu cutii meta personalizate (o listă derulantă cu intrările mele de tip post personalizat). Am intrat în problemă și am făcut totul singur în functions.php și acum salvez în baza de date doar numărul ca meta_value: 13112. Totuși, încă nu funcționează, voi încerca să activez un fel de depanare care să afișeze interogarea SQL pe care încearcă să o execute.

Titan Titan
4 iun. 2013 17:09:26

Ciudat, am folosit $GLOBALS['wp_query']->request; pentru a verifica și a afișat 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 ignorând complet meta_query!!

Titan Titan
4 iun. 2013 17:15:26

Am actualizat întrebarea originală cu un rezumat mai actualizat

Titan Titan
4 iun. 2013 17:20:28

Am rezolvat mai jos (scuze pentru spam!)

Titan Titan
4 iun. 2013 17:36:26

bine, mă bucur că ai găsit o soluție la problema ta ;-) Ar trebui să verifici SQL-ul cu $getPosts->request în schimb.

birgire birgire
4 iun. 2013 17:51:54
Arată celelalte 2 comentarii
0

Rezolvat prin utilizarea

get_posts($args) în loc de new WP_Query($args);

Nu știu de ce...

4 iun. 2013 17:36:00