Visualizzare pagine specifiche con WP_Query() in WordPress
Voglio visualizzare le pagine 'famous' e 'mschief'.
Utilizzando questo codice, WP_query() non restituisce alcun risultato:
$args = array(
'post_type' => 'page',
'pagename' => 'famous,mschief', // Parametro errato per multiple pagine
'posts_per_page' => 3
);
Questo codice restituisce una delle 2 pagine:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief', // Sintassi errata per array
);
E questo codice restituisce correttamente entrambe le pagine:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief', // Funziona ma sintassi non standard
'posts_per_page' => 3
);
Perché il primo pezzo di codice (l'unico corretto secondo me) non funziona? E perché gli altri due producono questi risultati?

Se osservi l'oggetto della query dopo che queste query sono eseguite, vedrai che nessuno di questi esempi sta facendo ciò che pensi. Il primo problema è che non puoi mescolare parametri nella stringa della query e parametri in array, e il secondo problema è che pagename
può essere utilizzato solo per caricare una singola pagina.
In questo esempio, manca una virgoletta di chiusura dopo pagename
. Supponendo che sia un errore di battitura, il problema è quello menzionato sopra - sta cercando una singola pagina con slug famousmschief
$args = array(
'post_type' => 'page',
'pagename => 'famous,mschief',
'posts_per_page' => 3
);
In questo esempio, pagename
viene ignorato e sta semplicemente interrogando la pagina più recente utilizzando il valore predefinito di post per pagina, che sembra essere 1.
$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
);
In questo esempio, stesso problema del precedente, ma stai caricando più pagine, quindi sta semplicemente caricando le tre pagine più recenti:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
'posts_per_page' => 3
);
Se vuoi interrogare più pagine, utilizza l'argomento post__in
e gli ID delle pagine:
$args = array(
'post_type' => 'page',
'post__in' => array( 23,42 )
);

Quindi non esiste un modo diretto per selezionare più pagine utilizzando gli slug? È davvero un peccato!

L'attributo post_name__in
A partire da WordPress 4.4 possiamo utilizzare l'attributo post_name__in
della classe WP_Query
. Vedi il ticket trac #33065.
Esempio:
$args = [
'post_name__in' => ['famous', 'mschief'],
'post_type' => 'page',
'ignore_sticky_posts' => 1,
];

Puoi scrivere la tua funzione, utilizzando 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) ) {
// usando questa funzione stessa per filtrare la query successiva
add_filter('posts_where', __FUNCTION__, 999 );
return new WP_Query('post_type=page'); // restituisce la query filtrata
} else { // nessun nome di pagina valido passato
$pages = NULL;
return new WP_Query('p=-1'); // restituisce una WP_Query senza post
}
} 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; // resetta la variabile statica
remove_filter('posts_where', __FUNCTION__, 999 ); // rimuove il filtro
return $n . rtrim($w, ',') . ')';
}
}
dopo di che puoi usarla così
$query = page_names_query( array('famous','mschief') ); // restituisce una WP_Query
if ( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post();
// il tuo loop qui
endwhile; endif;
wp_reset_postdata();

La tua domanda necessita di chiarimenti. Immagino tu ti riferisca a 2 articoli piuttosto che a 2 pagine.
Puoi utilizzare questo codice PHP nel file functions.php del tuo child theme per visualizzare articoli specifici tramite i loro ID.
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 ) );
}
}
Questo codice visualizzerà solo gli articoli con ID 007 e 008 nel loop della tua homepage. Se stai utilizzando una pagina statica come front page, questo codice funzionerà nella tua pagina degli articoli secondo le impostazioni di lettura.
L'uso degli ID è preferibile perché rimangono gli stessi anche quando modifichi lo slug.

aggiungi una categoria alla pagina con:
function wpc_cat_pages() {
// Registra la tassonomia 'category' per il post type 'page'
register_taxonomy_for_object_type('category', 'page');
}
// Esegui la funzione durante l'inizializzazione di WordPress
add_action('init', 'wpc_cat_pages');
e visualizzala con:
$args = array(
'post_type' => 'page', // Tipo di post: pagina
'category' => 'categoria', // Slug della categoria
'posts_per_page' => 'numero_di_post' // Numero di post da mostrare
);
