WordPress
Ciclo principale alternato (pre_get_posts filter)
Ricerca…
Sintassi
- add_action ('pre_get_posts', 'callback_function_name');
- function callback_function_name ($ query) {}
- // per PHP 5.3.0 o successivo
- add_action ('pre_get_posts', function ($ query) {});
Parametri
Parametro | Dettagli |
---|---|
$ query | (WP_Query) Oggetto loop |
Osservazioni
Se si utilizza PHP 5.3.0 o successivo, è possibile utilizzare chiusure ( funzioni anonime )
add_action( 'pre_get_posts', function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
});
Targeting di loop ancora più specifico
Diciamo che vogliamo cambiare il ciclo principale , solo per tassonomia specifica o tipo di post.
Targeting solo del ciclo principale sulla pagina di archivio del tipo di book
.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
if( !is_post_type_archive( 'book' ) ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
// - and we are on 'book' post type archive page
}
Puoi anche controllare la categoria, il tag o la pagina di archivio della tassonomia personalizzata usando is_category()
, is_tag()
e is_tax()
.
Puoi utilizzare qualsiasi tag condizionale disponibile in WordPress.
Mostra i post di una sola categoria
add_action( 'pre_get_posts', 'single_category' );
function single_category( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '1' );
return;
}
I messaggi pre-get filtrano l'utilizzo di base
A volte vorresti cambiare la query principale su WordPress.
Il filtro pre_get_posts
è la strada da percorrere.
Ad esempio, usando pre_get_posts
puoi dire al loop principale di mostrare solo 5 post. O per mostrare i post solo da una categoria, o escludendo qualsiasi categoria ecc.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
// here goes logic of your filter
}
Come puoi vedere, stiamo passando l'oggetto query loop principale nel nostro argomento della funzione callback.
Nota importante qui: stiamo passando argomento come riferimento . Significa che non abbiamo bisogno di restituire query o impostare alcuna globalità per farlo funzionare. Poiché $query
è un riferimento all'oggetto query principale, tutte le modifiche apportate al nostro oggetto si riflettono immediatamente nell'oggetto loop principale.
Escludi categoria dall'elenco di post modifica condividi
add_action( 'pre_get_posts', 'single_category_exclude' );
function single_category_exclude( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '-1' );
return;
}
Cambia posts_per_page per il ciclo principale
Tutto ciò che dobbiamo fare è usare il metodo set()
dell'oggetto $query
.
Ci vogliono due argomenti, prima quello che vogliamo impostare e in secondo luogo quale valore impostare.
add_action( 'pre_get_posts', 'change_posts_per_page' );
function change_posts_per_page( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'posts_per_page', 5 );
return;
}
Targeting del solo ciclo principale di WordPress
WordPress sta applicando il filtro pre_get_posts
letteralmente a qualsiasi loop generato. Significa che tutti i cambiamenti che stiamo apportando nella nostra funzione di callback sono applicati a tutti i loop in uscita.
Ovviamente non è quello che vogliamo nella maggior parte degli scenari.
Nella maggior parte dei casi vorremmo scegliere come target solo il ciclo principale e solo per gli schermi non di amministrazione.
Possiamo usare is_main_query()
metodo e is_admin()
funzione globale per controllare se siamo nel posto giusto.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
}