Prevenir el filtro pre_get_posts en un tipo de entrada específico
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
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;
}

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().

@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.

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'));

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?
