Creazione di un loop 'pagina degli articoli' basato sulla pagina stessa

16 gen 2013, 14:01:27
Visualizzazioni: 508
Voti: 0

L'impostazione Impostazioni -> Lettura -> Pagina degli articoli è impostata sulla mia pagina 'News', e il loop per il template home.php è popolato con gli articoli... perfetto.

Tuttavia vorrei anche poter creare un altro loop (anche con WP_Query se necessario) che contenga la pagina effettiva che ho specificato come mia Pagina degli articoli.

Ogni volta che provo a istanziare questo loop mi restituisce un sacco di articoli invece della pagina che ho richiesto, ecco il mio codice, confronta gli argomenti con la richiesta SQL:

<?php

    $page = new WP_Query(array('post_type' => 'page', 'page_id' => 39));
    print_r($page);

    // RICHIESTA: 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

?>

Puoi vedere che la query SQL della richiesta è sbagliata, presumo che poiché ho impostato la pagina come Pagina degli articoli mi stia impedendo di usarla all'interno di un loop.

C'è un modo per aggirare questo problema? Voglio usare il titolo, il contenuto e i campi personalizzati all'interno del template home.php.

Grazie

0
Tutte le risposte alla domanda 2
5

Puoi ottenere la pagina selezionata per gli articoli con il seguente codice:

$page_for_posts = get_option( 'page_for_posts' );

Quindi, ottieni l'articolo richiesto con:

$post = get_post( $page_for_posts );

E, ottieni i dati di cui hai bisogno:

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 gen 2013 14:11:55
Commenti

Grazie Mike, ho le prime due parti, ho davvero bisogno che sovrascriva il loop. Ho provato a usare setup_postdata ma fallisce anche quello... sembra che WP non voglia che io faccia questo ;-)

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

Cosa intendi con "ho davvero bisogno che sovrascriva il loop"?

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

Mi sono espresso male, dato che la mia pagina 'News' è la 'Pagina articoli', il loop che inizialmente popola per visualizzare una serie di articoli, ho bisogno di crearne uno nuovo solo per la pagina, sovrascrivendo così l'oggetto globale $post. In questo modo funzioni come the_title() funzioneranno senza dover passare un ID.

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

Hmm, se setup_postdata davvero non funziona, mi chiedo se esista una soluzione alternativa per questo. Forse puoi creare un'istruzione if nella tua pagina?

Mike Madern Mike Madern
16 gen 2013 15:15:54

"Devo creare un nuovo loop appositamente per la pagina, sovrascrivendo così l'oggetto globale $post. In modo che funzioni come the_title() senza dover passare un ID" - Vuoi che il tuo loop personalizzato venga prima o dopo il loop della query principale? Che codice hai provato? Cosa è accaduto inaspettatamente, o non è accaduto come previsto?

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

Supponendo che tu stia utilizzando home.php, che stai mostrando il loop della query principale come al solito e che vuoi mostrare un loop secondario utilizzando le informazioni $post per la pagina page_for_posts:

  1. Definisci la tua query personalizzata utilizzando WP_Query() e i parametri appropriati per i post.
  2. Individua l'oggetto post normale per la pagina, tramite `get_option( 'page_for_posts' )`
  3. Mostra il tuo loop della query personalizzata
  4. Reimposta $post, utilizzando wp_reset_postdata().
  5. Mostra il loop della query principale

Ad esempio:

<?php
/**
 * File template per l'indice dei post del blog: home.php
 */

get_header();

 // Mostriamo prima il tuo loop personalizzato
$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();
    // Mostra la tua query personalizzata come al solito,
    // utilizzando tutti i normali tag template per i post,
    // come the_title(), the_content(), the_permalink(), ecc.
endwhile; endif;

// IMPORTANTE: Reimposta $post
wp_reset_postdata();

 // Ora mostriamo il loop della query principale
if ( have_posts() ) : while ( have_posts() ) : the_post();
    // Output normale del loop qui,
    // utilizzando tutti i normali tag template per i post
endwhile; endif;

get_footer();

Il segreto qui è wp_reset_postdata(). Reimposta la variabile globale $post alla query del loop principale.

16 gen 2013 22:15:03