custom-post-types – $ query-> set in pre_get_posts está afectando involuntariamente al backend

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.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım