Afisarea mai multor pagini specifice folosind WP_Query()

28 dec. 2013, 00:08:56
Vizualizări: 16.1K
Voturi: 4

Vreau să afișez paginile 'famous' și 'mschief'.

Folosind acest cod, WP_query() nu returnează niciun rezultat:

$args = array(
'post_type' => 'page',
'pagename' => 'famous,mschief', // parametrul pagename nu acceptă liste separate prin virgulă
'posts_per_page' => 3
);

Acest cod returnează doar una dintre cele 2 pagini:

$args = array(
'post_type' => 'page',
'pagename=famous,mschief', // sintaxă invalidă - ar trebui să fie un array
);

Iar acest cod returnează corect ambele pagini:

$args = array(
'post_type' => 'page',
'pagename=famous,mschief', // funcționează dar nu este modul corect
'posts_per_page' => 3
);

De ce primul fragment de cod (singurul care mi se pare corect) nu funcționează? Și de ce celelalte două produc aceste rezultate?

2
Comentarii

Îmi este greu să înțeleg de ce oricare dintre acestea ar funcționa. Există o eroare de sintaxă gravă în prima variantă, iar celelalte două nu se potrivesc cu niciun model valid pe care îl cunosc. Interesant...

s_ha_dum s_ha_dum
28 dec. 2013 00:28:29

Îmi pare rău, la prima am făcut multe modificări și am lipit ultima versiune, dar chiar și cu sintaxa corectă nu returnează nimic.

drake035 drake035
28 dec. 2013 00:30:21
Toate răspunsurile la întrebare 6
2

Dacă te uiți la obiectul de interogare după ce aceste interogări sunt executate, vei vedea că niciunul dintre aceste exemple nu face ceea ce crezi că fac. Prima problemă este că nu poți amesteca parametrii din șirul de interogare cu cei din array, iar a doua problemă este că pagename poate fi folosit doar pentru a încărca o singură pagină.

În acest exemplu, lipsește un ghilimele de închidere după pagename. Presupunând că este o greșeală de tipar, problema este menționată mai sus - se caută o singură pagină cu slug-ul famousmschief

$args = array(
'post_type' => 'page',
'pagename => 'famous,mschief',
'posts_per_page' => 3
);

În acest exemplu, pagename este ignorat și se face doar o interogare pentru cea mai recentă pagină folosind valoarea implicită a postărilor pe pagină, care pare a fi 1.

$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
);

În acest exemplu, aceeași problemă ca mai sus, dar încarci mai multe pagini, deci se încarcă doar cele trei cele mai recente pagini:

$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
'posts_per_page' => 3
);

Dacă dorești să interoghezi mai multe pagini, folosește argumentul post__in și ID-urile paginilor:

$args = array(
    'post_type' => 'page',
    'post__in' => array( 23,42 )
);
28 dec. 2013 00:29:43
Comentarii

Deci nu există o modalitate directă de a selecta mai mult de o pagină folosind slug-uri? Este păcat, într-adevăr!

drake035 drake035
28 dec. 2013 00:43:27

@drake035: Selectarea unei pagini după slug declanșează interogări suplimentare. Vezi acesta și acesta, așa că nu mă surprinde că nu este ușor să treci o listă. Și, într-adevăr, ar trebui să eviți să folosești acest parametru dacă poți.

s_ha_dum s_ha_dum
28 dec. 2013 01:40:49
0

Atributul post_name__in

Începând cu WordPress 4.4 putem folosi atributul post_name__in al clasei WP_Query. Vezi ticketul trac #33065.

Exemplu:

$args = [
    'post_name__in'      => ['famous', 'mschief'],
    'post_type'          => 'page',
   'ignore_sticky_posts' => 1,
];
16 nov. 2015 20:32:03
0

Pentru prima, ai ghilimele nepotrivite pe a treia linie. Ceea ce pare că ai încercat să faci a fost:

'pagename' => 'famous,mschief',
28 dec. 2013 00:28:49
0

Poți să-ți scrii propria funcție, folosind un posts_where filter

function page_names_query( $n = array() ) {
  static $pages;
  if ( is_null($pages) && ! empty($n) && is_array($n) ) {
    $pages = array_filter( array_map('sanitize_title', $n) );
    if ( ! empty($pages) ) {
      // folosind această funcție în sine pentru a filtra următoarea interogare
      add_filter('posts_where', __FUNCTION__, 999 ); 
      return new WP_Query('post_type=page'); // returnează interogarea filtrată
    } else { // nu au fost transmise nume de pagini valide
      $pages = NULL;
      return new WP_Query('p=-1'); // returnează o interogare WP_Query fără postări
    }
  } elseif( current_filter() === 'posts_where' && ! empty($pages) && is_string($n) ) {
    $w = ' AND post_name IN (';
    global $wpdb;
    foreach ( $pages as $page ) { $w .= $wpdb->prepare('%s,', $page); }
    $pages = NULL; // resetează variabila statică
    remove_filter('posts_where', __FUNCTION__, 999 ); // elimină filtrul
    return $n . rtrim($w, ',') . ')';
  }
}

După aceea, o poți folosi astfel

$query =  page_names_query( array('famous','mschief') ); // returnează o interogare WP_Query

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

// bucla ta aici

endwhile; endif;
wp_reset_post_data();
28 dec. 2013 01:44:09
0

Întrebarea ta necesită clarificări. Presupun că te referi la 2 articole și nu la 2 pagini.

Poți folosi acest cod PHP în fișierul functions.php al temei copil pentru a afișa articole după ID-uri.

add_action( 'pre_get_posts', 'wpsites_display_specific_posts_home_page' );

function wpsites_display_specific_posts_home_page( $query ) {

if( $query->is_main_query() && $query->is_home() ) {

    $query->set( 'post__in', array( 007, 008 ) );

    }
}

Acest cod va afișa doar articolele cu ID-urile 007 și 008 în bucla paginii de start. Dacă folosești o pagină statică ca pagină principală, acest cod va funcționa pe pagina de articole conform setărilor de lectură.

Folosirea ID-urilor este mai bună deoarece acestea rămân aceleași chiar și atunci când modifici slug-ul.

28 dec. 2013 09:17:49
0

adaugă categorie la pagină cu:

function wpc_cat_pages() {
    register_taxonomy_for_object_type('category', 'page');
}
add_action('init', 'wpc_cat_pages');

și afișează-o cu:

$args = array(
        'post_type' => 'page',
        'category' => 'categori',
        'posts_per_page' => 'number post'
);
3 sept. 2018 11:48:23