WordPress
Bucle principal alternante (filtro pre_get_posts)
Buscar..
Sintaxis
- add_action ('pre_get_posts', 'callback_function_name');
- función callback_function_name ($ consulta) {}
- // para PHP 5.3.0 o superior
- add_action ('pre_get_posts', función ($ consulta) {});
Parámetros
Parámetro | Detalles |
---|---|
$ consulta | (WP_Query) objeto de bucle |
Observaciones
Si está utilizando PHP 5.3.0 o superior, puede usar cierres ( funciones anónimas )
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
});
Aún más específica la orientación de bucle
Digamos que queremos cambiar el bucle principal , solo para taxonomía específica o tipo de publicación.
Apuntando solo al bucle principal en la página de archivo del tipo de publicación de 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
}
También puede consultar la categoría, etiqueta o página de archivo de taxonomía personalizada utilizando is_category()
, is_tag()
e is_tax()
.
Puedes usar cualquier etiqueta condicional disponible en WordPress.
Mostrar publicaciones de una sola categoría
add_action( 'pre_get_posts', 'single_category' );
function single_category( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '1' );
return;
}
Filtrar el uso básico antes de las entradas.
A veces te gustaría cambiar la consulta principal de WordPress.
Filtrar pre_get_posts
es el camino a seguir.
Por ejemplo, al usar pre_get_posts
, puede indicar al bucle principal que muestre solo 5 publicaciones. O para mostrar publicaciones solo de una categoría, o excluyendo cualquier categoría, etc.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
// here goes logic of your filter
}
Como puede ver, estamos pasando el objeto de consulta del bucle principal a nuestro argumento de función de devolución de llamada.
Nota importante aquí: estamos pasando el argumento como referencia . Esto significa que no es necesario que devolvamos la consulta ni configuremos ninguna variable global para que funcione. Como $query
es una referencia al objeto de consulta principal, todos los cambios que hacemos en nuestro objeto se reflejan inmediatamente en el objeto de bucle principal.
Excluir categoría de la lista de publicaciones editar compartir
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;
}
Cambiar posts_per_page por bucle principal
Todo lo que necesitamos hacer es usar el método set()
del objeto $query
.
Toma dos argumentos, primero lo que queremos establecer y segundo qué valor configurar.
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;
}
Apuntando solo al bucle principal de WordPress
WordPress está aplicando el filtro pre_get_posts
a literalmente cualquier bucle que genere. Significa que todos los cambios que estamos haciendo en nuestra función de devolución de llamada se aplican a todos los bucles que salen.
Obviamente no es lo que queremos en la mayoría de los escenarios.
En la mayoría de los casos, nos gustaría dirigirnos solo al bucle principal , y solo para pantallas que no sean de administrador.
Podemos utilizar is_main_query()
método y is_admin()
la función global para comprobar si estamos en el lugar correcto.
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
}