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.


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


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.