Cum să obții ID-urile postărilor din WP_Query?

21 oct. 2014, 18:01:37
Vizualizări: 94.9K
Voturi: 49

Există vreo metodă prin care pot obține un array cu ID-urile postărilor din următorul query:

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

Follow Up:

Am folosit wp_list_pluck pentru a obține un array cu ID-urile postărilor:

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

Apoi am convertit array-ul într-un string folosind funcția implode:

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

Îmi cer scuze pentru întrebarea ambiguă.

3
Comentarii

Rick, întrebarea ta este ambiguă. Te rog să fii foarte clar în legătură cu ce dorești înainte de a posta o întrebare. Acest lucru va salva pe toți de la a răspunde la lucruri irelevante. De fapt, ai nevoie de ID-urile postărilor returnate sub formă de șir, nu ca array

Pieter Goosen Pieter Goosen
21 oct. 2014 19:01:11

Funcția ta wp_reset_postdata ar trebui să fie în interiorul, nu în afara instrucțiunii if, altfel s-ar putea să resetezi datele postării atunci când acestea nu au fost modificate

Tom J Nowell Tom J Nowell
21 oct. 2014 19:19:20

Dacă vrei doar ID-urile, ar trebui să iei în serios răspunsul lui s_ha_dum. Acesta va returna ID-urile fără a prelua și alte date inutile din baza de date pe care apoi le vei arunca.

Chris Rae Chris Rae
27 feb. 2015 23:51:03
Toate răspunsurile la întrebare 5
4
135

Folosește argumentul fields în interogarea ta.

fields (string) - Ce câmpuri să returneze. Toate câmpurile sunt returnate implicit. Există alte două opțiuni: - 'ids' - Returnează un array de ID-uri de postări. - 'id=>parent' - Returnează un array asociativ [ parent => ID, … ].

https://developer.wordpress.org/reference/classes/wp_query/#return-fields-parameter

$latest = new WP_Query( array (
    'orderby'               => 'rand',
    'posts_per_page'        => 3,
    'fields' => 'ids'
));
var_dump($latest->posts);
21 oct. 2014 18:23:00
Comentarii

Acesta ar trebui să fie răspunsul acceptat, deoarece interoghează doar ID-urile, făcându-l mult mai rapid decât interogarea tuturor datelor și apoi 'extragerea' lor (iterare și re-stocare) într-un nou array.

Barry Kooij Barry Kooij
5 feb. 2016 18:31:24

Poate ai nevoie să obții ID-uri DUPĂ ce o interogare wp_query normală a fost deja executată, de exemplu când unifici două interogări ulterior și ai nevoie de ID-uri pentru a exclude rezultatele din interogarea anterioară.

trainoasis trainoasis
5 aug. 2019 12:09:10

Vă mulțumesc pentru partajarea acestei soluții, printre răspunsurile la această întrebare, aceasta este cea mai eficientă.

Marcos Buarque Marcos Buarque
26 nov. 2020 16:36:23

Acesta ar trebui să fie răspunsul acceptat 100%

MikeeeG MikeeeG
11 iul. 2023 14:15:34
1
59

Încearcă

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

Citește despre wp_list_pluck

21 oct. 2014 18:16:56
Comentarii

Acest lucru poate fi util dacă ai nevoie și de întregul set de date pentru fiecare articol, nu doar de ID-urile articolelor. În caz contrar, aș opta pentru soluția propusă de @s-ha-dum.

Marian Marian
31 mar. 2017 11:09:45
0

Vă sugerez această soluție

get_posts([
  'posts_per_page' => -1,
  'post_status' => 'publish',
  'post_type' => 'some-custom-post-type',
  'fields' => 'ids',
]);

și ca rezultat veți obține un array cu ID-uri în interior ;)

array (size=5)
  0 => int 81002
  1 => int 77885
  2 => int 77180
  3 => int 74722
  4 => int 73312
3 sept. 2020 11:23:32
0

Folosirea soluției de la @s-ha-dum este eficientă din punct de vedere economic dacă ai nevoie doar să obții ID-urile și nu ai un obiect de interogare setat anterior.

Iată de ce:

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

Pentru că în cazul în care specifici doar 'fields' => 'ids' nu vei primi înapoi decât ID-urile.

Dacă ai folosi 'fields' => 'id=>parent' (pare destul de amuzant) vei obține și ID-urile părinte.

Orice altă modalitate de utilizare a argumentului 'fields' nu va avea niciun efect începând cu WordPress v4.7.

Dar în cazul în care ai interogarea ca în exemplu, wp_list_pluck va face treaba.

28 dec. 2016 02:01:02
1

De ce să nu folosești funcția get_the_ID()? Doar împărtășesc codul loop-ului și acesta afișează toate ID-urile postărilor din interogare.

// Bucla Loop
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();     
                    
            echo '<li>' . get_the_ID() . '</li>';
        }
    } else {
        // nicio postare găsită
        $string = "nicio postare găsită";
    }
12 iul. 2021 22:27:41
Comentarii

Cred că scopul a fost probabil să obținem ID-urile într-un array pentru a face altceva cu ele, nu pentru a le afișa efectiv. Folosirea loop-ului pentru asta pare un exces.

Rup Rup
13 iul. 2021 01:47:13