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?
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 WordPressWPDB
Clase…La revolución anunciada en torno a esto no va a llegar pronto y supongo que se extenderán
WC_Product_Query
yWC_Order_query
me gustaWP_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.