Use metadatos personalizados en un WC_Product_Query en Woocommerce 3

3 minutos de lectura

avatar de usuario
Rob Teeuwen

Solía ​​​​usar el estándar wordpress WP_Query para obtener productos de woocommerce basados ​​​​en metadatos. Mis productos son pistas y tienen muchas metacolumnas (como género, instrumento, estado de ánimo, etc.). Usando WP_Query, puedo crear una meta_consulta basada en la entrada del usuario desde un formulario, que busca productos que cumplan con los requisitos meta. Todo esto funciona muy bien.

Ahora quiero usar wp_get_products en lugar de WP_Query porque es la nueva forma de obtener productos y se supone que está más preparada para el futuro que la forma anterior. Sin embargo, parece que no puedo entender cómo pasar meta_query a esa función. Se anunció en github que wc_get_products admitiría meta desde la versión 2.8. La única información que puedo encontrar al respecto está en el siguiente enlace: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query (último párrafo).

Intenté pasar meta_query como una matriz de matrices, cada una con 3 pares clave-valor para clave, valor y comparación, al igual que en WP_Query. También traté de agregar meta como Meta: meta-field-name, que es el nombre de los campos reales, solo el nombre en sí mismo sin el prefijo ‘meta’ y algunas otras variedades. Sin embargo, ninguno de estos métodos funciona. ¿Alguien puede decirme si este ‘soporte de parámetros personalizados’ solo se refiere a parámetros personalizados que no sean metacampos, o si estoy haciendo algo mal?

avatar de usuario
LoicTheAztec

Para manejar el producto metadatos personalizados en un WC_Product_Query (situado en wp_postmeta mesa)es bastante simple y funciona, como se explica en el último párrafo de la documentación relacionada.

Pero no maneja múltiples valores y argumentos de comparación como en un WP_Query, si no los configura en la función que extiende meta_query.

Para un producto personalizado clave meta me gusta _volume manejar El volumen tomado por un producto en m3 (metros cubicos)el siguiente código habilitará esa costumbre meta_key con un especifico compare argumento “más grande que”:

add_filter( 'woocommerce_product_data_store_cpt_get_products_query', 'handling_custom_meta_query_keys', 10, 3 );
function handling_custom_meta_query_keys( $wp_query_args, $query_vars, $data_store_cpt ) {
    $meta_key = '_volume'; // The custom meta_key

    if ( ! empty( $query_vars[$meta_key] ) ) {
        $wp_query_args['meta_query'][] = array(
            'key'     => $meta_key,
            'value'   => esc_attr( $query_vars[$meta_key] ),
            'compare' => '>', // <=== Here you can set other comparison arguments
        );
    }
    return $wp_query_args;
}

El código va en el archivo function.php del tema secundario activo (o tema activo).

Ahora solo harás tu consulta sobre este personalizado _volume clave meta basada en el específico 'compare' argumento, a obtener todos los productos que tienen un volumen mayor que '0.2':

$queried_products = wc_get_products( array( '_volume' => '0.2' ) );

Probado y funciona.

Como puede ver, puede seguir usando un WP_Query como muchos desarrolladores de Woocommerce todavía hacen o incluso consultas SQL a través de WordPress WPDB Clase…

La revolución anunciada en torno a esto no va a llegar pronto y supongo que se extenderán WC_Product_Query y WC_Order_query me gusta WP_Query con muchas más características y posibilidades.

Puede agregar esta pequeña función para arreglarlo todo:

add_filter( 'woocommerce_product_data_store_cpt_get_products_query', static function($wp_query_args, $query_vars, $data_store_cpt){
    if ( ! empty( $query_vars['meta_query'] ) ) {$wp_query_args['meta_query'][] = $query_vars['meta_query'];}
    return $wp_query_args;
}, 10, 3 );

Ahora solo pase meta_query a wc_get_products y lo admite :). Probablemente deberían contratarme jajaja.

¿Ha sido útil esta solución?