Afisarea mai multor pagini specifice folosind WP_Query()
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?

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

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

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,
];

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

Î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.

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