Post-IDs von WP_Query abrufen?


27

Gibt es eine Möglichkeit, eine Reihe von Post-IDs abzurufen, die aus den folgenden Quellen abgefragt wurden:

$latest = new WP_Query( array (
    'orderby'               => 'rand',
    'posts_per_page'        => 3
));

if ( $latest -> have_posts() ) : while ( $latest -> have_posts() ) : $latest -> the_post();

    get_template_part( 'templates/content', 'post' );

endwhile; endif; wp_reset_postdata();

Nachverfolgen:

Früher habe ich wp_list_pluckeine Reihe von Post-IDs abgerufen:

$post_ids = wp_list_pluck( $latest->posts, 'ID' );

Dann konvertierte das Array mit der Implode-Funktion in einen String:

$post_ids_string = implode( ',', $post_ids );

Entschuldigen Sie die zweideutige Frage.


Rick, deine Frage ist nicht eindeutig. Machen Sie sich bitte klar, was Sie möchten, bevor Sie eine Frage stellen. Dies erspart jedem die Beantwortung irrelevanter Fragen. Sie müssen die Post-IDs tatsächlich in einer Zeichenfolge zurückgeben, nicht in einem Array
Pieter Goosen

1
Sie wp_reset_postdatasollten sich innerhalb und nicht außerhalb der if-Anweisung befinden. Andernfalls können Sie die Post-Daten zurücksetzen, wenn sie nicht geändert wurden
Tom J Nowell

1
Wenn Sie nur die IDs wünschen, sollten Sie die Antwort von s_ha_dum ernsthaft in Betracht ziehen. Dadurch werden die IDs zurückgegeben, ohne dass auch viele andere Daten aus der Datenbank abgerufen werden, die Sie dann wegwerfen.
Chris Rae

Antworten:


43

Versuchen

$post_ids = wp_list_pluck( $latest->posts, 'ID' );

Lesen wp_list_pluck


5
Dies kann nützlich sein, wenn Sie auch die gesamten Daten für jeden Beitrag benötigen, nicht nur die Beitrags-IDs. Ansonsten würde ich mich für die Lösung von @s-ha-dum entscheiden.
Marian

74

Verwenden Sie das fieldsArgument in Ihrer Abfrage.

fields (string) - Welche Felder zurückgegeben werden sollen. Alle Felder werden
standardmäßig zurückgegeben. Es gibt zwei weitere Optionen: - 'ids' - Gibt ein Array von Beitrags-IDs zurück. - 'id => parent' - Liefert ein assoziatives Array [parent => ID,…].

http://codex.wordpress.org/Class_Reference/WP_Query#Return_Fields_Parameter

$latest = new WP_Query( array (
    'orderby'               => 'rand',
    'posts_per_page'        => 3,
    'fields' => 'ids'
));
var_dump($latest->posts);

12
Dies sollte die akzeptierte Antwort sein, da nur die IDs abgefragt werden, was es viel schneller macht, als alles abzufragen und in einem neuen Array zu "rupfen" (Schleifen und erneutes Speichern).
Barry Kooij

Möglicherweise müssen Sie IDs abrufen, NACHDEM die normale wp_query bereits ausgeführt wurde, z. B. wenn Sie zwei Abfragen nacheinander zusammenführen und IDs benötigen, um Ergebnisse von der vorherigen Abfrage auszuschließen.
trainoasis

2

Die Verwendung der Lösung von @ s-ha-dum ist wirtschaftlich, wenn Sie nur die IDs abrufen müssen und keine vorherigen Abfrageobjekte festgelegt haben.

Hier ist warum:

switch ( $q['fields'] ) {
    case 'ids':
        $fields = "$wpdb->posts.ID";
        break;
    case 'id=>parent':
        $fields = "$wpdb->posts.ID, $wpdb->posts.post_parent";
        break;
    default:
        $fields = "$wpdb->posts.*";

Denn in dem Fall, dass Sie nur 'fields' => 'ids'nichts angeben , erhalten Sie als Gegenleistung nur die IDs.

Wenn du mitgehen würdest 'fields' => 'id=>parent'(sieht wirklich lustig aus), bekommst du auch die Eltern-IDs.

Eine andere Verwendung von 'fields'Argumenten hat ab WordPress 4.7 keine Auswirkungen.

Aber falls Sie die Abfrage wie im Beispiel wp_list_pluckhaben, erledigen Sie den Job.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.