it-swarm.com.de

Holen Sie sich Beiträge basierend auf Meta-Schlüssel/Wert

Ich habe einen benutzerdefinierten Beitragstyp "custom_author", der ausgewählt wird, wenn ein neuer Beitrag mithilfe eines Metabox-Dropdowns mit dem Feldschlüssel "chosen_author" erstellt wird.

So sieht mein wp_postmeta aus:

enter image description here

Wobei 13088 der Blogpost ist, dem "author" 13112 zugewiesen ist.

Ich versuche, alle Beiträge eines bestimmten Autors wie folgt abzurufen:

$args = array(
        'post_type'     => 'post',
        'post_status'   => 'publish',
        'meta_query' => array(
            array(
                'key' => 'chosen_author',
                'value' => '13112' (tried with and without quotes)
            )
        )
    );

    $getPosts = new WP_Query($args);

Es werden jedoch ALLE meine Beiträge zurückgegeben.

Ich habe ein paar Fehler behoben:

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

und diese Ausgabe

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

Vollständiges Ignorieren des meta_query-Arrays!

Wenn es darauf ankommt, wird dies außerhalb der Schleife verwendet

5
Titan

Behoben mit

get_posts ($ args) anstelle von new WP_Query ($ args);

Keine Ahnung warum ...

3
Titan

Das Problem

Anscheinend speichern Sie die Daten wie folgt:

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

woher bekommst du den meta_value

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

Bei Ihrer ersten Abfrage erhalten Sie geschützte Anführungszeichen:

LIKE '%\"13112\"%'

Methode 1

Wenn Sie das Autorenarray stattdessen mit Zahlen speichern:

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

dann wird der entsprechende meta_value sein

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

Also, wenn Sie die Meta-Abfrage versuchen:

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

der entsprechende SQL-Teil wird sein

LIKE '%:13112;%'

Sie könnten versuchen, dies stattdessen zu verwenden.

Methode 2

Eine andere Möglichkeit besteht darin, die maskierten Anführungszeichen durch nicht maskierte Anführungszeichen zu entfernen:

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

woher

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

aber ich empfehle es nicht.

3
birgire

Auch ich hatte ein ähnliches Problem, konnte die Abfrage jedoch nicht richtig ausführen.

Zum Schreiben der Daten habe ich die folgenden Codes verwendet:

$post_id = 2;
$user_key = 'ldp_system_follows_user_1';
$user_data_new = array(
    'followed'    => 'nofollowed'
);

update_post_meta($post_id, $user_key, $user_data_new);

Der obige Code behielt in db bei, wenn get_post_meta(post_id); ausgeführt wurde

{
  "ldp_system_follows_user_1": [
    "a:1:{s:8:\"followed\";s:8:\"followed\";}"
  ]
}

Ich wollte alle Beitrags-IDs abrufen, die mit den von mir geschriebenen Metadaten übereinstimmen, aber es wurde ein leeres Array zurückgegeben.

$args = array(
        'post_type'     => 'post',
        'post_status'   => 'publish',
        'meta_query'    => array(
                                array(
                                    'key'   => $user_key,
                                    'value' => $user_data_new,
                                    'compare'   => 'LIKE'
                                ))
    );

    return  get_posts($args);

Jede Hilfe wäre sehr dankbar.

0
Loc Pham