Creando un bucle 'página de publicaciones' basado en la página misma
El ajuste Configuración -> Lectura -> Página de publicaciones
está configurado en mi página 'Noticias', y el bucle para la plantilla home.php
se llena con publicaciones... perfecto.
Sin embargo, también quiero poder crear otro bucle (incluso con WP_Query
si es necesario) que contenga la página real que he especificado como mi Página de publicaciones
.
Cada vez que intento instanciar este bucle, devuelve muchas publicaciones en lugar de la página que he solicitado. Aquí está mi código, compara los argumentos con la solicitud SQL:
<?php
$page = new WP_Query(array('post_type' => 'page', 'page_id' => 39));
print_r($page);
// SOLICITUD: SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'page' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
?>
Puedes ver que la consulta SQL de la solicitud es incorrecta. Supongo que porque he configurado la página como Página de publicaciones
, me impide usarla dentro de un bucle.
¿Hay alguna solución para esto? Quiero usar el título, contenido y campos personalizados dentro de la plantilla home.php
.
Gracias
Puedes obtener la página seleccionada para las publicaciones con el siguiente código:
$page_for_posts = get_option( 'page_for_posts' );
Luego, obtén la publicación solicitada mediante:
$post = get_post( $page_for_posts );
Y obtén los datos que necesitas:
echo apply_filters( 'the_title', $post->post_title );
echo apply_filters( 'the_content', $post->post_content );
echo get_post_meta( $post->ID, $key, $single);

Gracias Mike, tengo las dos primeras partes, realmente necesito que sobrescriba el bucle. Intenté usar setup_postdata
pero eso también falla... parece que WP no quiere que haga esto ;-)

¿Qué quieres decir con "realmente necesito que sobrescriba el bucle"?

Lo expresé mal, como mi página de 'Noticias' es la 'Página de entradas', el bucle que inicialmente se llena para mostrar un rango de entradas, necesito crear un nuevo bucle solo para la página, sobrescribiendo así el objeto global $post
. Para que funciones como the_title()
funcionen sin tener que pasar un ID.

Hmm, si setup_postdata
realmente no funciona, me pregunto si hay una solución alternativa para esto. ¿Quizás puedas crear una declaración if en tu página?

"Necesito crear un nuevo bucle solo para la página, sobrescribiendo así el objeto global $post. Para que funciones como the_title() funcionen sin tener que pasar un ID" - ¿Quieres que tu bucle personalizado esté antes o después del bucle de consulta principal? ¿Qué código has probado? ¿Qué sucedió inesperadamente, o no sucedió como esperabas?

Suponiendo que estás usando home.php
, que muestras el bucle de consulta principal como es habitual y que deseas mostrar un bucle secundario usando la información de $post
para la página page_for_posts
:
- Define tu consulta personalizada usando
WP_Query()
y los parámetros de publicación adecuados. - Apunta al objeto de publicación normal para la página, mediante `get_option( 'page_for_posts' )
- Muestra tu bucle de consulta personalizado
- Restablece
$post
, usandowp_reset_postdata()
. - Muestra el bucle de consulta principal
Por ejemplo:
<?php
/**
* Archivo de plantilla para el índice de publicaciones del blog: home.php
*/
get_header();
// Mostremos primero *tu* bucle personalizado
$home_query_args = array(
'page_id' => get_option( 'page_for_posts' )
);
$home_query = new WP_Query( $home_query_args );
if ( $home_query->have_posts() ) : while ( $home_query->have_posts() ) : $home_query->the_post();
// Muestra tu consulta personalizada como de costumbre,
// usando todas las etiquetas normales de plantilla de publicación,
// como the_title(), the_content(), the_permalink(), etc.
endwhile; endif;
// IMPORTANTE: Restablece $post
wp_reset_postdata();
// Ahora muestra el bucle de consulta principal
if ( have_posts() ) : while ( have_posts() ) : the_post();
// Salida normal del bucle aquí,
// usando todas las etiquetas normales de plantilla de publicación
endwhile; endif;
get_footer();
El ingrediente secreto aquí es wp_reset_postdata()
. Restablece el global $post
a la consulta del bucle principal.
