Czy pobierasz identyfikatory postów z WP_Query?

27

Czy istnieje sposób na odzyskanie tablicy identyfikatorów postów zapytanych z następujących elementów:

$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();

Zagryźć:

Kiedyś wp_list_pluckpobierałem tablicę identyfikatorów postów:

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

Następnie przekonwertowano tablicę na ciąg znaków za pomocą funkcji implode:

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

Przepraszam za dwuznaczne pytanie.

Bogaty
źródło
rick, twoje pytanie jest dwuznaczne. Przed zamieszczeniem pytania proszę bardzo jasno powiedzieć, czego chcesz. Dzięki temu wszyscy nie będą odpowiadać na nieistotne rzeczy. Rzeczywiście potrzebujesz identyfikatorów postów zwróconych w postaci ciągu, a nie tablicy
Pieter Goosen
1
Twój wp_reset_postdatapowinien być w środku nie poza if, w przeciwnym razie możesz przywrócić dane pocztowe, gdy nie została zmieniona
Tom J Nowell
1
Jeśli chcesz tylko identyfikatorów, powinieneś poważnie rozważyć odpowiedź s_ha_dum. To zwróci identyfikatory bez pobierania wielu innych danych z bazy danych, które następnie wyrzucasz.
Chris Rae

Odpowiedzi:

43

Próbować

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

Czytać wp_list_pluck

shanebp
źródło
5
Może to być przydatne, jeśli potrzebujesz również danych dla każdego postu, a nie tylko identyfikatorów postów. W przeciwnym razie wybrałbym rozwiązanie @ s-ha-dum.
Marian
74

Użyj fieldsargumentu w zapytaniu.

pola (ciąg) - Które pola mają zostać zwrócone.
Domyślnie zwracane są wszystkie pola . Istnieją dwie inne opcje: - „ids” - Zwraca tablicę identyfikatorów postów. - 'id => rodzic' - Zwraca tablicę asocjacyjną [rodzic => 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);
s_ha_dum
źródło
12
To powinna być akceptowana odpowiedź, ponieważ tylko odpytuje identyfikatory, dzięki czemu jest o wiele szybsze niż sprawdzanie wszystkiego i „wyrywanie” (zapętlanie i przechowywanie) w nowej tablicy.
Barry Kooij,
Być może trzeba uzyskać identyfikatory PO wykonaniu normalnego wp_query, na przykład po scaleniu dwóch zapytań i potrzebowaniu identyfikatorów, aby wykluczyć wyniki z poprzedniego zapytania.
Trainoasis
2

Korzystanie z rozwiązania @ s-ha-dum jest ekonomiczne, jeśli potrzebujesz tylko identyfikatorów i nie masz wcześniej ustawionego obiektu zapytania.

Oto dlaczego:

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.*";

Ponieważ w przypadku, gdy podasz tylko 'fields' => 'ids'nic więcej, otrzymasz w zamian niż identyfikator.

Jeśli zdecydujesz się na 'fields' => 'id=>parent'(Wygląda naprawdę zabawnie), dostaniesz także identyfikator rodzica.

Jakikolwiek inny sposób użycia 'fields'argumentu nie będzie miał wpływu na WordPress v4.7.

Ale jeśli masz zapytanie, tak jak w przykładzie wp_list_pluck, wykonasz zadanie.

prosti
źródło