Crearea unei bucle 'pagina de articole' bazată pe pagina în sine

16 ian. 2013, 14:01:27
Vizualizări: 508
Voturi: 0

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

0
Toate răspunsurile la întrebare 2
5

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);
16 ian. 2013 14:11:55
Comentarii

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

Ben Everard Ben Everard
16 ian. 2013 14:18:49

Ce vrei să spui prin "chiar am nevoie să suprascriu bucla"?

Chip Bennett Chip Bennett
16 ian. 2013 14:23:00

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.

Ben Everard Ben Everard
16 ian. 2013 14:36:04

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?

Mike Madern Mike Madern
16 ian. 2013 15:15:54

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

Chip Bennett Chip Bennett
16 ian. 2013 17:43:58
0

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:

  1. Definește interogarea personalizată folosind WP_Query() și parametrii de postare adecvați.
  2. Țintește obiectul normal de postare pentru pagină, prin `get_option( 'page_for_posts' )
  3. Afișează bucla personalizată de interogare
  4. Resetează $post, folosind wp_reset_postdata().
  5. 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.

16 ian. 2013 22:15:03