Incluir custom post types en la búsqueda de WordPress WordPress
En WordPress los «tipos» de contenido se llaman post types (tipos de post). Desde WordPress 3.0 se pueden registrar tipos de post personalizados (custom post types) que se suman a los que ya trae WordPress (posts, pages, attachments y menus). Con los post types personalizado y los custom fields puedes definir tu propio tipo de contenido, por ejemplo, libros, recetas, portfolio, términos de un diccionario o cualquier otra cosa que se te ocurra.
Para que un custom post type se incluya en el sistema de búsqueda de WordPress, hay que poner el parámetro exclue_from_search
igual a false
durante el momento de registro del tipo de post:
function cyb_register_post_type() {
$args = array(
'public' => true,
'exclude_from_search' => false,
'label' => 'Books'
);
register_post_type( 'book', $args );
}
add_action( 'init', 'cyb_register_post_type' );
Si el parámetro exclue_from_search
no se específica, tomará el valor contrario al parámetro public
(por defecto true
). No obstante, podemos sobreescribir está configuración en el pre_get_posts action hook dónde podemos añadir nuestro tipo de post al query de búsqueda antes de que se ejecute. ¿Pero por qué iba alguien a querer incluir un tipo de post en la búsqueda si se ha excluido expresamente durante su registro? Bueno, como situaciones hay para todos los gustos, os dejo el código por si alguien lo necesita:
function cyb_include_post_types_in_search($query) {
//Comprobar que es un query de busqueda, que no estamos en admin y que el query principal
if( is_search() && !is_admin() && $query->is_main_query() ) {
$searchable_types = array('post', 'page', 'mi-post-type');
$query->set( 'post_type', $searchable_types );
}
return $query;
}
add_action('pre_get_posts', 'cyb_include_post_types_in_search');
Y si queremos incluir todos los tipos de post registrados, excepto los que no sean «públicos»:
function cyb_include_post_types_in_search($query) {
//Comprobar que es un query de busqueda, que no estamos en admin y que el query principal
if( is_search() && !is_admin() && $query->is_main_query() ) {
$post_types = get_post_types( array('public' => true), 'objects' );
$searchable_types = array();
if($post_types) {
foreach( $post_types as $type) {
$searchable_types[] = $type->name;
}
}
$query->set('post_type', $searchable_types);
}
return $query;
}
add_action('pre_get_posts', 'cyb_include_post_types_in_search');