Estoy tratando de obtener productos con un campo personalizado con condición de valor de DB.
El campo personalizado se llama: "_filtered_product" .
Quiero obtener productos solo con valor = 1
Esta es la consulta SQL que he escrito.
$view_low_filt_sql = "LEFT JOIN $wpdb->postmeta manage ON (p.ID = manage.post_id AND manage.meta_key = '_manage_stock') LEFT JOIN $wpdb->postmeta stock ON (p.ID = stock.post_id AND stock.meta_key = '_stock') LEFT JOIN $wpdb->postmeta threshold ON (p.ID = threshold.post_id AND threshold.meta_key = '_low_inventory_number') LEFT JOIN $wpdb->postmeta filtered ON (p.ID = filtered.post_id AND filtered.meta_key = '_filtered_product') WHERE (p.post_type = 'product' OR p.post_type = 'product_variation') AND (p.post_status = 'publish' OR p.post_status = 'private' OR p.post_status = 'draft') AND manage.meta_value = 'yes' AND threshold.meta_value IS NOT NULL AND filtered.meta_value = '1' AND IFNULL(CAST(stock.meta_value AS SIGNED),0) <= CAST(threshold.meta_value AS SIGNED) ";
No estoy seguro de por qué desea escribir su propia sql query
para esta tarea simple, ¡mientras que podría usar wp_query
!
Dicho esto, podría usar el siguiente fragmento de código para obtener todos los productos con una clave meta específica y un valor meta:
global $wpdb; $meta_key = '_filtered_product'; $meta_value = '1'; $sql_statement = "SELECT {$wpdb->prefix}posts.* FROM {$wpdb->prefix}posts INNER JOIN {$wpdb->prefix}postmeta ON ( {$wpdb->prefix}posts.ID = {$wpdb->prefix}postmeta.post_id ) WHERE 1=1 AND ( ( {$wpdb->prefix}postmeta.meta_key = '{$meta_key}' AND {$wpdb->prefix}postmeta.meta_value = '{$meta_value}' ) ) AND {$wpdb->prefix}posts.post_type = 'product' AND ({$wpdb->prefix}posts.post_status = 'publish' OR {$wpdb->prefix}posts.post_status = 'private') GROUP BY {$wpdb->prefix}posts.ID ORDER BY {$wpdb->prefix}posts.post_date DESC"; $sql = $wpdb->prepare($sql_statement); $sql_results = $wpdb->get_results($sql, ARRAY_A); if ($sql_results) { foreach ($sql_results as $result) { echo "<p>Product id: " . $result['ID'] . " and product title: " . $result['post_title'] . "<p>"; } } else { echo "Sorry can't find anything at the moment!"; } wp_reset_postdata();
Lo que generará esto:
Product id: {the product id} and product title: {the product name that matches the query}
Nota:
ID
y title
para darle un ejemplo.$meta_value
es una cadena, entonces está todo listo, lo que significa que he escrito la consulta, asumiendo que su metavalor es una cadena. Sin embargo, si NO lo es, utilice este {$meta_value}
en lugar de '{$meta_value}'
.$wpdb
global y aproveché sus propiedades y métodos.wp_
, he usado {$wpdb->prefix}
.$wpdb->prepare
declaración para asegurar la declaración sql.ARRAY_A
como segundo argumento en la $wpdb->get_results
para obtener los datos como una matriz asociativa.wp_query
: $meta_key = '_filtered_product'; $meta_value = '1'; $args = array( 'post_type' => 'product', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => $meta_key, 'value' => $meta_value, 'compare' => '=', ) ) ); $woo_custom_query = new WP_Query($args); if ($woo_custom_query->have_posts()) { while ($woo_custom_query->have_posts()) { $woo_custom_query->the_post(); the_title(); } } else { echo "Sorry can't find anything at the moment!"; } wp_reset_postdata();
¡Esta respuesta ha sido completamente probada en woocommerce 5.x+
y funciona bien!