2009-02-20 5 views
8

Sembra che ci siano tre modi principali per i contenuti in uscita dal Wordpress utilizzando le sue funzioni built-in, con WP_Query essere quello consigliato:Qual è il miglior metodo per creare i propri loop di Wordpress?

Cosa sono le differenze tra loro? (Capisco che WP_Query è la classe e gli altri due sono metodi).

Qual è il modo più pulito per avere più loop sulla stessa pagina, senza che nessuno di essi interferisca tra loro?

Sto cercando esempi su come programmare i loop WP; ad es. Uscita 2 liste post a parte per categoria, con allegati, i meta dati ecc

Questo è il miglior riferimento che ho trovato finora:

risposta

5

Ho usato sia WP_Query che get_posts. In uno dei miei modelli della barra laterale, utilizzo il seguente ciclo per visualizzare i post di una particolare categoria utilizzando i campi personalizzati con una chiave di "category_to_load" che contiene il nome della categoria o slug della categoria. La vera differenza arriva dall'implementazione di entrambi i metodi.

Il metodo get_posts sembra così in alcuni dei miei modelli:

Qualora l'attuazione WP_Query assomiglia a questo:

$blog_posts = new WP_Query('showposts=15'); 

while ($blog_posts->have_posts()) : $blog_posts->the_post(); ?> 

      <div <?php post_class() ?> id="post-<?php the_ID(); ?>" class="blog_post"> 
       <div class="title"> 
        <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2> 
        <span class="date"><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></span> 
       </div> 
       <div class="entry"> 
        <?php the_content(); ?> 
       </div> 
       <p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?> <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p> 
      </div> 

     <?php endwhile; ?> 

La differenza principale è che non c'è bisogno di resettare la variabile globale $ post e inoltre non è necessario impostare i dati del post chiamando setup_postdata ($ post) su ogni oggetto post quando si utilizza WP_query. Puoi anche utilizzare la funzione lovely_posts() della funzione WP_Query, che non è disponibile usando get_posts().

Non si dovrebbe utilizzare la funzione query_posts() a meno che non si intenda realmente perché modifica il ciclo principale per la pagina. Vedi lo docs. Quindi, se stai creando una pagina speciale per visualizzare il tuo blog, chiamare query_posts potrebbe rovinare il ciclo della pagina, quindi dovresti usare WP_Query.

Sono solo i miei due centesimi. Il mio consiglio finale, la tua prima scelta dovrebbe essere WP_Query.

-Chris

+0

Come vi accedere alle pubblicare bambini (allegati, revisioni, ecc). Questa sarebbe una query separata? – meleyal

+0

è possibile utilizzare la funzione get_children(): http://codex.wordpress.org/Function_Reference/get_children. O Puoi usare wp_list_pages - wp_list_pages ('title_li = & child_of ='. $ Post-> ID. '& Show_date = modificato & date_format = $ date_format'); ?>: http://codex.wordpress.org/wp_list_pages se vuoi una lista. -C –

3

Dalla documentazione WP per get_posts:

get_posts() può anche utilizzare i parametri che query_posts() può poiché entrambe le funzioni utilizzano ora internamente lo stesso codice di query del database.

L'unica differenza tra le due funzioni è che get_posts restituisce un array con i record postali, mentre query_posts memorizza i record nella oggetto query per il recupero da parte delle funzioni del modello (has_posts, the_post, ecc).

Entrambi utilizzano l'oggetto WP_Query per eseguire la query.

Creazione di un secondo ciclo è coperto in Wordpress docs. Ci sono alcuni collegamenti lì per altri esempi di loop multipli. Noterai che tutti lo fanno in modo diverso, ma sembrano tutti contenti dei risultati.

1

WP utilizza un oggetto chiamato $wp_query per il ciclo principale. Noi di solito non vediamo questo oggetto perché è nascosto dietro have_posts() e the_post() che sono solo wrapper per $wp_query->have_posts() e $wp_query->the_post()

Se si desidera modificare il ciclo principale è necessario utilizzare query_posts() prima del ciclo.

Se si desidera un altro ciclo, è possibile riutilizzare l'oggetto $wp_query utilizzando query_posts() prima del nuovo ciclo. Questo può essere fatto più volte se necessario.

Se per qualche motivo è necessario mantenere l'oggetto $ wp_query intorno a THEN, è necessario utilizzare WP_Query. E naturalmente, poiché have_posts() e the_post() sono wrapper per l'oggetto $wp_query, non è possibile utilizzarli con WP_Query. Si dovrebbe invece usare $your_query_obj->have_posts() cioè

$sidebar= WP_Query('category_name= sidebar'); 

while($sidebar->have_posts()): $sidebar->the_post(); 
    the_title(); 
    the_content(); 
endwhile; 

Un buon caso in cui WP_Query potrebbe essere migliore di query_posts() è una barra laterale sinistra. Poiché il loop di codice per la barra laterale verrà probabilmente posizionato sopra il loop principale, una chiamata query_posts() avrà modificato l'oggetto $wp_query e ha anche modificato il ciclo principale. In questo caso per utilizzarenel codice della barra laterale sarà necessario utilizzare anche query_posts() prima del ciclo principale per interrogare il contenuto appropriato per quel ciclo.

Quindi utilizzare WP_Query per questo caso manterrà $ wp_query e quindi il ciclo principale non toccato.

Ma ancora una volta, per un caso comune scenario query_posts() è un bel modo per interrogare sul suo sito web:

query_posts('category_name=blog'); 

while(have_posts()): the_post(); 
    the_title(); 
    the_content(); 
endwhile;