Crearea unei bucle 'pagina de articole' bazată pe pagina în sine
Setarea Settings -> Reading -> Posts Page
este configurată la pagina mea 'Știri', iar bucla pentru șablonul home.php
este populată cu articole... perfect.
Totuși, doresc să pot crea o altă buclă (chiar folosind WP_Query
dacă este necesar) care să conțină pagina propriu-zisă pe care am specificat-o ca Posts Page
.
De fiecare dată când încerc să instantiez această buclă, returnează o mulțime de articole în locul paginii pe care am cerut-o. Iată codul meu, compară argumentele cu cererea SQL:
<?php
$page = new WP_Query(array('post_type' => 'page', 'page_id' => 39));
print_r($page);
// CERERE: 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
?>
Poți vedea că cererea SQL este greșită, presupun că pentru că am setat pagina ca Posts Page
, mă împiedică să o folosesc într-o buclă.
Există vreo soluție pentru aceasta? Doresc să folosesc titlul, conținutul și câmpurile personalizate în cadrul șablonului home.php
.
Mulțumesc
Puteți obține pagina selectată pentru postări folosind următorul cod:
$page_for_posts = get_option( 'page_for_posts' );
Apoi, obțineți postarea solicitată cu:
$post = get_post( $page_for_posts );
Și, obțineți datele de care aveți nevoie:
echo apply_filters( 'the_title', $post->post_title );
echo apply_filters( 'the_content', $post->post_content );
echo get_post_meta( $post->ID, $key, $single);

Mulțumesc Mike, am primele două părți, chiar am nevoie să suprascriu bucla. Am încercat să folosesc setup_postdata
dar și asta eșuează... se pare că WP nu vrea să fac asta ;-)

Am formulat prost, deoarece pagina mea 'Știri' este 'Pagina de articole', bucla pe care o populează inițial pentru a afișa o serie de articole, trebuie să creez o buclă nouă doar pentru pagină, suprascriind astfel obiectul global $post
. Astfel funcții precum the_title()
vor funcționa fără a fi nevoie să treci un ID.

Hmm, dacă setup_postdata
chiar nu funcționează, mă întreb dacă există o soluție alternativă pentru asta. Poate poți crea o instrucțiune if în pagina ta?

"Trebuie să creez o nouă buclă doar pentru pagină, suprascriind astfel obiectul global $post. Astfel, funcții precum the_title() vor funcționa fără a fi nevoie să transmit un ID" - Vrei ca bucla ta personalizată să fie înainte sau după bucla principală de interogare? Ce cod ai încercat? Ce s-a întâmplat neașteptat sau nu s-a întâmplat cum te așteptai?

Presupunând că folosești home.php
, că afișezi bucla principală de interogare în mod normal și că dorești să afișezi o buclă secundară folosind informațiile $post
pentru pagina page_for_posts
:
- Definește interogarea personalizată folosind
WP_Query()
și parametrii de postare adecvați. - Țintește obiectul normal de postare pentru pagină, prin `get_option( 'page_for_posts' )
- Afișează bucla personalizată de interogare
- Resetează
$post
, folosindwp_reset_postdata()
. - Afișează bucla principală de interogare
De exemplu:
<?php
/**
* Șablonul pentru indexul postărilor de blog: home.php
*/
get_header();
// Hai să afișăm mai întâi bucla personalizată *primul*
$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();
// Afișează interogarea personalizată ca de obicei,
// folosind toate etichetele normale de șablon de postare,
// cum ar fi the_title(), the_content(), the_permalink(), etc.
endwhile; endif;
// IMPORTANT: Resetează $post
wp_reset_postdata();
// Acum afișează bucla principală de interogare
if ( have_posts() ) : while ( have_posts() ) : the_post();
// Afișare normală a buclei aici,
// folosind toate etichetele normale de șablon de postare
endwhile; endif;
get_footer();
Secretul aici este wp_reset_postdata()
. Aceasta resetează globalul $post
la interogarea buclei principale.
