Mostrar varias páginas específicas usando WP_Query()
Quiero mostrar las páginas 'famous' y 'mschief'.
Usando este código, WP_query() no devuelve ningún resultado:
$args = array(
'post_type' => 'page',
'pagename' => 'famous,mschief', // Formato incorrecto para múltiples páginas
'posts_per_page' => 3
);
Este código devuelve solo una de las 2 páginas:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief', // Formato de cadena de consulta, no recomendado
);
Y este código devuelve correctamente las 2 páginas:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief', // Formato alternativo que funciona
'posts_per_page' => 3
);
¿Por qué el primer fragmento de código (el único correcto para mí) no funciona? ¿Y por qué los otros dos producen estos resultados?

Si observas el objeto de consulta después de ejecutar esas consultas, verás que ninguno de esos ejemplos está haciendo lo que crees que hacen. El primer problema es que no puedes mezclar parámetros de cadena de consulta y arreglos, y el segundo problema es que pagename
solo puede usarse para cargar una única página.
En este caso, te falta una comilla de cierre después de pagename
. Asumiendo que es un error tipográfico, el problema ya mencionado persiste - está buscando una sola página con el slug famousmschief
$args = array(
'post_type' => 'page',
'pagename => 'famous,mschief',
'posts_per_page' => 3
);
En este otro, pagename
está siendo ignorado y simplemente está consultando la página más reciente usando el valor predeterminado de publicaciones por página, que parece ser 1.
$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
);
En este último, mismo problema que el anterior, pero estás cargando más páginas, por lo que simplemente carga las tres páginas más recientes:
$args = array(
'post_type' => 'page',
'pagename=famous,mschief',
'posts_per_page' => 3
);
Si deseas consultar múltiples páginas, usa el argumento post__in
con los IDs de las páginas:
$args = array(
'post_type' => 'page',
'post__in' => array( 23,42 )
);

¿Entonces no hay una forma directa de seleccionar más de una página usando slugs? ¡Eso es realmente malo!

El atributo post_name__in
A partir de WordPress 4.4 podemos usar el atributo post_name__in
de la clase WP_Query
. Ver el ticket de trac #33065.
Ejemplo:
$args = [
'post_name__in' => ['famoso', 'principal'],
'post_type' => 'page',
'ignore_sticky_posts' => 1,
];

Puedes escribir tu propia función, usando 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 esta misma función para filtrar la siguiente consulta
add_filter('posts_where', __FUNCTION__, 999 );
return new WP_Query('post_type=page'); // devuelve la consulta filtrada
} else { // no se pasaron nombres de página válidos
$pages = NULL;
return new WP_Query('p=-1'); // devuelve una WP_Query sin posts
}
} 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; // reinicia la variable estática
remove_filter('posts_where', __FUNCTION__, 999 ); // elimina el filtro
return $n . rtrim($w, ',') . ')';
}
}
después puedes usarla así
$query = page_names_query( array('famous','mschief') ); // devuelve una WP_Query
if ( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post();
// tu loop aquí
endwhile; endif;
wp_reset_post_data();

Tu pregunta necesita aclaración. Supongo que te refieres a 2 entradas en lugar de 2 páginas.
Puedes usar este código PHP en el archivo functions.php de tu tema hijo para mostrar entradas por sus IDs.
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 ) );
}
}
Este código solo mostrará las entradas con los IDs 007 y 008 en el loop de tu página de inicio. Si estás usando una página estática como portada, este código funcionará en tu página de entradas según tu configuración de lectura.
Usar IDs es mejor ya que permanecen iguales incluso cuando cambias el slug.

agregar categoría a la página con:
function wpc_cat_pages() {
register_taxonomy_for_object_type('category', 'page');
}
add_action('init', 'wpc_cat_pages');
y mostrarla con:
$args = array(
'post_type' => 'page',
'category' => 'categori',
'posts_per_page' => 'number post'
);
