WordPress.org

Ready to get started?Download WordPress

Codex

Attention Interested in functions, hooks, classes, or methods? Check out the new WordPress Code Reference!

it:Riferimento funzioni/query posts

Descrizione

query_posts() è il metodo più semplice, anche se non quello preferibile o più efficiente, per modificare la query standard che WordPress utilizza per visualizzare gli articoli. Utilizzare query_posts() per visualizzare articoli diversi da quealli che appaiono normalmente per una specifica URL. (Il metodo migliore è agganciarsi a 'pre_get_posts' e modificare in questo modo la query principale utilizzando is_main_query)

Ad esempio, nella pagina home, normalmente appaiono gli ultimi dieci articoli. Se si desidera visualizzarne solo 5 (e non ci si preoccupa della paginazione), è possibile utilizzare query_posts() in questo modo:

query_posts( 'posts_per_page=5' );

Avvertenze

query_posts() è solo uno dei metodi fra i tanti per interrogare il database e generare un elenco di articoli. Prima di utilizzare query_posts(), assicurarsi di aver ben compreso le problematiche associate.

Alterare il Loop principale

query_posts() è pensato per alterare il loop principale. Una volta utilizzato query_posts(), le variabili globali correlate all'articolo ed i tag dei template verranno modificati. I tag condizionali eseguiti dopo la vostra chiamata a query_posts() verranno anch'essi alterati - ciò può portare o meno al risultato desiderato.

Loop secondari

Per creare elenchi secondari (ad esempio un elenco di articoli correlati posti in fondo alla pagina oppure una lista di link in un widget della sidebar), si provi a creare una nuova istanza di WP_Query oppure ad utilizzare get_posts().

Se si deve utilizzare query_posts(), assicurarsi di richiamare wp_reset_query() dopo averlo utilizzato.

Paginazione

La paginazione non funzionerà correttamente a meno di impostare la variabile di query 'paged' in maniera opportuna: aggiungere i parametri di paginazione

Query SQL aggiuntive

Se si utilizza query_posts in un template di pagina, WordPress avrà già eseguito le query al database e recuperato i record nel momento in cui è arrivato al template di pagina (è in questo modo che sa quale template di pagina servire!). Quindi quando si sovrascrive la query predefinita tramite query_posts() si sta essenzialmente buttando via la query predefinita ed i suoi risultati e si esegue una nuova query sul database.

Ciò non costituisce necessariamente un problema, specialmente se si ha a che fare con un piccolo blog. Gli sviluppatori di grossi siti con grandi database ed un elevato numero di visitatori vorranno considerare delle alternative, ad esempio modificando direttamente la query predefinita (prima che venga chiamata). Il filtro request può essere utilizzato proprio a questo scopo.

I filtri 'parse_query' e 'pre_get_posts' sono un altro metodo per modificare l'oggetto $query che viene utilizzato per generare la query SQL al database.

Utilizzo

<?php

// La Query
query_posts( $args );

// Il Loop
while ( have_posts() ) : the_post();
	echo '<li>';
	the_title();
	echo '</li>';
endwhile;

// Reset Query
wp_reset_query();

?>

Inserire una chiamata a query_posts() in uno dei file dei Template prima che inizi Il Loop. L'oggetto wp_query genererà una nuova query SQL utilizzando i nuovi paramentri. Quando si effettua questa operazione, WordPress ignora lgli altri paramentri ricevuti tramite la URL (quali ad esempio il numero di pagina e la categoria).

Preservare i parametri delle query

Se si desidera mantenere le informazioni sui parametri utilizzati per generare la query corrente e successivamente aggiungere o sovrascrivere alcuni parametri, dovete utilizzare la variabile globale $query_string durante la chiamata a query_posts().

Ad esempio per impostare l'ordine di visualizzazione degli articoli senza modificare il resto della stringa di ricerca, è possibile inserire il seguente codice prima del Il Loop:

global $query_string;
query_posts( $query_string . '&order=ASC' );

Utilizzando query_posts() in questo modo la porzione dei parametri fra apici deve iniziare con un ampersand (&).

In alternativa è possibile unire l'array originale dei parametri con il proprio array di parametri:

global $wp_query;
$args = array_merge( $wp_query->query_vars, array( 'post_type' => 'product' ) );
query_posts( $args );

Combinare parametri

Si sarà notato da alcuni degli esempi precedenti che è possibile combinare i propri paramentri con un ampersand (&), così:

query_posts( 'cat=3&year=2004' );

Articoli della categoria 13, per il mese corrente solo nella pagina principale:

if ( is_home() ) {
	query_posts( $query_string . '&cat=13&monthnum=' . date( 'n', current_time( 'timestamp' ) ) );
}

Dalla versione 2.3 questa combinazione ritornerà gli articoli appartenenti entrambi alle categori 1 E 3, visualizzando solo due (2) articoli, in ordine discendente in base al titolo:

query_posts( array( 'category__and' => array(1,3), 'posts_per_page' => 2, 'orderby' => 'title', 'order' => 'DESC' ) );

Il codice seguente restituisce tutti gli articoli che appartengono alla categoria 1 e che sono contrassegnati dal tag "mele"

query_posts( 'cat=1&tag=mele' );

È possibile cercare per tag multipli usando il +

query_posts( 'cat=1&tag=mele+pere' );

Parametri

Nota: Il dettaglio dei parametri si trovano nell'articolo sulla classe WP_Query sezione Parametri.

I prossimi esempi funzionano anche con l'oggetto WP_Query.

Esempi

Escludere alcune categorie dalla home page

Inserendo questo codice nel file index.php si otterrà che la home page visualizzerà gli articoli di tutte le categorie accetto la categoria di ID 3.

<?php
if ( is_home() ) {
	query_posts( 'cat=-3' );
}
?>

È possibile anche aggiungere più categorie alla lista di esclusione (testato con WP 3.3.1):

<?php
if ( is_home() ) {
	query_posts( 'cat=-1,-2,-3' );
}
?>

Recuperare un articolo specifico

Per recuperare uno specifico articolo è possibile utilizzare il seguente codice:

query_posts( 'p=5' );

Nota: Se uno specifico articolo è un allegato, si dovrà utilizzare il paramentro attachment_id al posto di p:

query_posts( 'attachment_id=5' );

Se con questa query si desidera utilizzale la funzionalità Leggi altro si dovrà impostare la variabile globale $more a 0.

<?php
// recupera un articolo con ID di 5
query_posts( 'p=5' );

// imposta $more a 0 per ottenere solo la prima parte dell'articolo
global $more;
$more = 0;

// il Loop
while (have_posts()) : the_post();
	the_content( 'Leggi articolo completo »' );
endwhile;
?>

Tutti gli articoli di una categoria

Il paramentro "Le pagine del blog visualizzano al massimo" in Impostazioni > Lettura possono influenzare i risultati. Per sovrascriverne il comportamento aggiungere il paramentro 'posts_per_page'. Ad esempio:

query_posts( array ( 'category_name' => 'my-category-slug', 'posts_per_page' => -1 ) );

Restituisce TUTTI gli articoli della categoria.

Tuttavia, per le sottocategorie (o categorie figlie), 'Il nome categoria' non sempre funziona. Utilizzare al suo posto 'l'abbreviazione'. Si veda Function_Reference/is_category.

if (is_category('category-slug')): 

	 query_posts(array('category_name' => 'my-category-slug', 'posts_per_page' => -1 )); 

endif; 

Feed

I parametri "I feed visualizzano" oppure 'posts_per_rss' in Impostazioni > Lettura sovrascriveranno qualsiasi parametro 'posts_per_page' in una query utilizzata in un feed.

Per ovviare a questo limite utilizzare (ad esempio in un feed ics personalizzato, dove sono necessari tutti gli articoli che trovano una corrispondenza) il filtro "posts_limit" come nel seguente esempio:

if ( isset ( $query->query_vars['feed'] ) and ( $query->query_vars['feed'] == 'ics' ) )
{
	add_filter( 'post_limits', '__return_empty' );
}

Passare delle variabili a query_posts

È possibile passare una variabile alla query con due diversi metodi, in funzione delle proprie necessità your needs. Come per tutti gli esempi precedenti il codice va inserito prima del Loop:

Esempio 1

In questo esempio, si concatenerà la query prima di eseguirla. Prima si asegna la variabile, la si concatena e quindi la si esegue. In questo esempio si sta recuperando da un'altra parte una variabile che definisce una categoria.

// assegna la variabile come la categoria corrente
$categoryvariable = $cat;

// concatena la query
$args = 'cat=' . $categoryvariable . '&orderby=date&order=ASC';

// esegue la query
query_posts( $args );

Esempio 2

In questo esempio i doppi apici indicano a PHP di trattare il contenuto come una espressione. In questo esempio si prende il mese e l'anno corrente e si indica a query_posts() di recuperare gli articoli per il mese/anno correnti ed in questo caso, di elencarli in ordine ascendente così da avere l'articolo più vecchio in cima alla pagina.

$current_year = date('Y');
$current_month = date('m');

query_posts( "cat=22&year=$current_year&monthnum=$current_month&order=ASC" );

Esempio 3

Questo esempio mostra come generare un elenco completo degli articoli, gestendo la paginazione. &Egrave>; possibile utilizzare la $query_string predefinita per dire a query_posts() di recuperare un elenco completo degli articoli. È anche possibile modificare il parametro della query posts_per_page da -1 al numero di articoli che si desidera visualizzare in ciascuna pagina; in quest'ultimo caso probabilmente si vorrà utilizzare posts_nav_link() per navigare nell'archivio appena generato.

query_posts( $query_string . '&posts_per_page=-1' );

Esempio 4

Se non si ha necessità di utilizzare la variabile $query_string, esiste un altro metodo che è più chiaro e leggibile nei casi più complessi. Questo metodo pone i parametri in un array. La stesa query del precedente Esempio 2 può essere riscritta così:

$args = array(
	'cat'      => 22,
	'year'     => $current_year,
	'monthnum' => $current_month,
	'order'    => 'ASC'
);
query_posts( $args );

Come si vede con questo approccio ogni variabile viene posta su uan riga facilitando la lettura del codice.

Esempio 5

È possibile utilizzare lo style con l'array (Esempio 4) per effettuare una query su tassonomie multiple. Basterà fornire l'abbreviazione (slug) della tassonomia in una stringa di valori separati da virgole (ciascun valore sarà un termine). Nell'esempio seguente si richiederanno tutti gli articoli sui film in cui recitano Bruce Campbell oppure Chuck Norris.

$args = array(
	'post_type'=> 'movie',
	'actor'    => 'Bruce Campbell, Chuck Norris',
	'order'    => 'ASC'
);
query_posts( $args );

File sorgente

query_posts() si trova in wp-includes/query.php.

Risorse (in inglese)

Correlati

Query Tags: WP_Query (Classe), get_query_var(), query_posts(), have posts(), the_post(), rewind_posts(), wp_reset_postdata(), wp_reset_query()

See also index of Function Reference and index of Template Tags.