En WordPress, el parámetro s de WP_Query permite realizar búsquedas en el título y contenido de los posts, pero no en los metadatos, como el _sku de WooCommerce. Si necesitas incluir campos como el SKU en tu búsqueda, debes extender la funcionalidad de WP_Query.
A continuación, mostramos cómo puedes realizar búsquedas tanto en el contenido como en los metadatos (como el SKU) usando un filtro para modificar la consulta SQL.
Uso Básico de WP_Query con ‘s’
Por defecto, WP_Query busca en los campos post_title y post_content al usar el parámetro s. Sin embargo, si quieres buscar también en el campo _sku, que es un campo meta de WooCommerce, necesitarás personalizar la consulta con un filtro.
Ejemplo básico de WP_Query:
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
);
if (!empty($search)) {
$args['s'] = $search;
}
$query = new WP_Query($args); Este código busca el término $search en el título y el contenido del post (en este caso, productos). Sin embargo, esta búsqueda no incluye metadatos como _sku.
Limitación de s y Búsqueda en Metadatos
La principal limitación del parámetro s es que solo busca en los campos post_title y post_content. Si deseas realizar una búsqueda en un campo meta, como el _sku de WooCommerce, necesitas personalizar la consulta SQL de WP_Query utilizando el filtro posts_where.
Personalizando la Consulta para Incluir _sku
Para buscar también en los metadatos como _sku, podemos usar un filtro posts_where que modifica la cláusula WHERE de la consulta SQL de WP_Query. Este filtro permite incluir una subconsulta SQL que busque en el campo _sku dentro de los metadatos de los productos.
Aquí tienes un ejemplo de cómo hacerlo:
function custom_search_by_sku($where, $query) {
if ($query->is_search() && !empty($query->query_vars['s'])) {
global $wpdb;
$search = esc_sql($query->query_vars['s']);
$where .= " OR EXISTS (SELECT 1 FROM {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_sku' AND {$wpdb->postmeta}.meta_value LIKE '%{$search}%')";
}
return $where;
}
add_filter('posts_where', 'custom_search_by_sku', 10, 2); Este filtro modifica la consulta SQL para incluir el campo _sku en la búsqueda. Ahora, cuando realices una búsqueda, también se buscará en los SKU de los productos de WooCommerce, además del título y el contenido.