Prevenir el filtro pre_get_posts en un tipo de entrada específico

15 feb 2014, 18:00:18
Vistas: 48.1K
Votos: 8

Me estoy encontrando con un problema con el filtro pre_get_post.

Actualmente tengo 4 tipos de entrada. Entradas, Páginas, Eventos y Lugares. He creado un campo personalizado llamado ciudad para los tipos de entrada eventos y lugares.

Al crear el campo personalizado tengo una opción para seleccionar el tipo de entrada en el que quiero mostrar ese campo personalizado.

Ahora, en la parte del frontend he añadido un filtro en pre_get_posts y modificado la consulta principal para obtener todas las entradas de una ciudad específica.

Todo funciona perfectamente en el listado y página individual de eventos y lugares pero este filtro también se aplica en entradas y páginas.

Lo que quiero es, **quiero eliminar este filtro de los tipos de entrada que no incluyen ese campo personalizado.

He intentado con el código $wp_query->query_vars['page_id'] pero ya no funciona.

¿Puede alguien ayudarme a resolver esto?

Para tu información: Mi código se ve así,

add_action( 'pre_get_posts', 'citywise_post_filter' );
function citywise_post_filter($query) {
    global $wp_query;
    if( isset( $_REQUEST['city_filter'] ) ){
        $city = $_REQUEST['city_filter'];
    }else{
        $city = $_SESSION['CURR_CITY'];
    }
    if ( !is_admin() ){
        $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
        $query->set( 'meta_value', $city );
        return;
    }
}

Gracias, Aezaz

0
Todas las respuestas a la pregunta 2
3
21

Mejora tu condicional para incluir una verificación del tipo de publicación que se está consultando. Se puede hacer mediante el método WP_Query::get.

Entonces, donde tengas

if ( !is_admin() ){
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
} 

reemplázalo con

if ( ! is_admin() && in_array ( $query->get('post_type'), array('event','venue') ) ) {
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
}

También ten en cuenta que, como señaló @offroff en su respuesta, al usar este código, el filtro se aplicará a todas las consultas, tanto a las que se activan al visitar una página (consulta principal) como a las que se activan mediante código, usando new WP_Query ($args) (consultas secundarias).

Para evitar que el filtro afecte a las consultas secundarias, agrega una verificación para $query->is_main_query(), por lo que el código queda así:

if ( is_admin() || ! $query->is_main_query() ) return;

if ( in_array ( $query->get('post_type'), array('event','venue') ) ) {
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
}
15 feb 2014 21:25:39
Comentarios

Hola G.M. Muchas gracias. Funciona, pero solo en la página de detalle individual. No puedo obtener el tipo de publicación actual en las páginas de listado de categorías con $query->get('post_type') y get_post_type().

Shaikh Aezaz Shaikh Aezaz
16 feb 2014 09:42:33

@ShaikhAezaz si en las páginas de listado de categorías quieres mezclar tipos de publicaciones como eventos, lugares y publicaciones estándar, probablemente no puedas hacer el truco usando un filtro pre_get_post. Si la taxonomía muestra solo eventos y/o lugares (y ningún otro tipo de publicación) puedes usar is_tax('tu_taxonomia') para añadir otro filtro. Tu objetivo no está muy claro, quizás puedas añadir más detalles en la pregunta.

gmazzap gmazzap
16 feb 2014 19:38:58

G.M. Sí, también tengo otros tipos de publicaciones personalizadas. Y acabo de añadir el campo meta de ciudad a eventos y lugares pero no en otras publicaciones. Así que solo quiero el filtro que devuelva el tipo de publicación actual.

Shaikh Aezaz Shaikh Aezaz
17 feb 2014 19:48:09
2

WordPress tiene una excelente página sobre etiquetas condicionales

Junto con !is_admin() quizás quieras usar && $query->is_main_query()

Al inicio de tu función puedes colocar if(is_single() || is_page()) {return;} si no deseas que el filtro se aplique en esas páginas.

Otras condicionales que podrías utilizar son is_post_type_archive('event') && is_post_type_archive('venue')

Edición: No estoy seguro de entender tu problema, pero ahora creo que esto podría ayudarte:

$query->set('post_type',array('event','venue'));
15 feb 2014 18:18:23
Comentarios

Hola offroff, usé el código que sugirió G.M. y me funciona para páginas de listado de categorías y taxonomías, pero ahora no puedo obtener el tipo de publicación en las páginas de listado de categorías y taxonomías. ¿Conoces alguna solución para esto?

Shaikh Aezaz Shaikh Aezaz
16 feb 2014 11:47:26

Quizás tengas que establecer el tipo de publicación, por ejemplo if(is_category()) {$query->set('post_type',array('event','venue')); }. Es difícil saber cómo resolver tu problema porque no sabemos qué plantillas estás usando.

offroff offroff
16 feb 2014 12:44:19