Agregar Soporte de Búsqueda en el SKU de WooCommerce con WP_Query y el Parámetro ‘s’

1–2 minutos

Lectura

·

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

La parte de la plantilla ha sido borrada o no está disponible: offcanvas-nav