Mostrar varias páginas específicas usando WP_Query()

28 dic 2013, 00:08:56
Vistas: 16.1K
Votos: 4

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?

2
Comentarios

Me cuesta entender por qué alguno de esos debería funcionar. Hay un error de sintaxis grave en el primero y los otros dos no coinciden con ningún patrón válido que conozca. Interesante...

s_ha_dum s_ha_dum
28 dic 2013 00:28:29

Disculpa, en el primero lo cambié muchas veces y pegué la última versión, pero incluso con la sintaxis correcta no devuelve nada.

drake035 drake035
28 dic 2013 00:30:21
Todas las respuestas a la pregunta 6
2

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 )
);
28 dic 2013 00:29:43
Comentarios

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

drake035 drake035
28 dic 2013 00:43:27

@drake035: Seleccionar una página por slug genera consultas adicionales. Mira esto y esto, así que no me sorprende que no sea fácil pasar una lista. Y, en realidad, deberías evitar usar ese parámetro si puedes.

s_ha_dum s_ha_dum
28 dic 2013 01:40:49
0

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,
];
16 nov 2015 20:32:03
0

Para el primero, tienes comillas que no coinciden en la tercera línea. Lo que parece que intentabas hacer era:

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

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();
28 dic 2013 01:44:09
0

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.

28 dic 2013 09:17:49
0

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'
);
3 sept 2018 11:48:23