• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

299
Views
Consulta sql de WooCommerce para encontrar productos con una clave meta específica y un valor meta

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) ";
about 3 years ago · Santiago Trujillo
1 answers
Answer question

0

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:

  • La consulta anterior recuperará todos los datos de un producto. Solo usé ID y title para darle un ejemplo.
  • Si su $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.
  • En lugar de codificar el prefijo de las tablas de la base de datos, que de forma predeterminada sería wp_ , he usado {$wpdb->prefix} .
  • También he usado $wpdb->prepare declaración para asegurar la declaración sql.
  • Además, he usado ARRAY_A como segundo argumento en la $wpdb->get_results para obtener los datos como una matriz asociativa.
  • Además, tenga en cuenta que esta consulta está ordenada por fecha, de forma descendente, lo que significa que los productos recientes se mostrarán primero.

Realizando la misma consulta usando 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!

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error