Creando un bucle 'página de publicaciones' basado en la página misma

16 ene 2013, 14:01:27
Vistas: 508
Votos: 0

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

0
Todas las respuestas a la pregunta 2
5

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);
16 ene 2013 14:11:55
Comentarios

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

Ben Everard Ben Everard
16 ene 2013 14:18:49

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

Chip Bennett Chip Bennett
16 ene 2013 14:23:00

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.

Ben Everard Ben Everard
16 ene 2013 14:36:04

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?

Mike Madern Mike Madern
16 ene 2013 15:15:54

"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?

Chip Bennett Chip Bennett
16 ene 2013 17:43:58
0

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:

  1. Define tu consulta personalizada usando WP_Query() y los parámetros de publicación adecuados.
  2. Apunta al objeto de publicación normal para la página, mediante `get_option( 'page_for_posts' )
  3. Muestra tu bucle de consulta personalizado
  4. Restablece $post, usando wp_reset_postdata().
  5. 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.

16 ene 2013 22:15:03