Pregunta:
Entonces, tengo un tipo de publicación personalizada, 'propiedades'.
Estoy usando archive-properties.php
y necesito establecer algunos parámetros en $query
.
No quiero usar el new WP_Query
ya que encontré algunos problemas en los que un complemento de paginación intentaba paginar el $query
que ya existía desde que estábamos en una página de archivo, si eso tiene algún sentido.
Entonces, ahora mi problema es que, si configuro posts_per_page
en 2
por ejemplo, e inicio sesión en el backend, solo se muestran 2 publicaciones.
Entonces necesito esto para cambiar la consulta en el frontend, pero no en el backend. No sé qué incluir en la declaración if.
function set_query_parameters($query) {
if( is_main_query() && is_post_type_archive( 'properties' ) && !$_SESSION ) {
$query->set('posts_per_page', 12);
$query->set('orderby', array(
'date' => 'DESC',
));
}
return $query;
}
add_action( 'pre_get_posts', 'set_query_parameters' );
Respuesta:
En lo que respecta a su decisión de no usar WP_Query, pre_get_posts
es en realidad una excelente elección, en lugar de crear una nueva instancia de WP_Query. De hecho, pre_get_posts
es exactamente lo que debería usar cuando desee cambiar la consulta principal. En lugar de ejecutar una consulta separada en cada carga de página, modifica los parámetros de la consulta principal antes de que se ejecute. ¡Mucho más eficiente!
Ya casi estás ahí. Solo necesita agregar !is_admin()
a su declaración if
. También debe llamar específicamente a is_main_query()
en el objeto $query
pasado a su función .
Con estos dos cambios, su declaración if
ahora leería:
if( !is_admin() && $query->is_main_query() && is_post_type_archive( 'properties' ) && !$_SESSION ) {
También vale la pena señalar que no es necesario devolver un valor a una acción de WordPress, a diferencia de un filtro . Con pre_get_posts
, el argumento se pasa por referencia, por lo que cualquier cambio que realice en su variable $query
tendrá efecto automáticamente.