Obține postări bazate pe meta key/value
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:
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
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.

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

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.

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