WooCommerce SQL 查询查找具有特定元键和元值的产品

Vla*_*pov 2 php mysql sql wordpress woocommerce

我正在尝试从数据库获取具有值条件的自定义字段的产品。

自定义字段名为:"_filtered_product"
我只想获得价值 = 1的产品

这是我写的 SQL 查询。

$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)
  ";
Run Code Online (Sandbox Code Playgroud)

Ruv*_*vee 5

不知道为什么你想自己编写sql query这个简单的任务,而你可以使用wp_query

话虽这么说,您可以使用以下代码片段来获取具有特定元键和元值的所有产品:

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();

Run Code Online (Sandbox Code Playgroud)

这将输出:

Product id: {the product id} and product title: {the product name that matches the query} 
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 上面的查询将检索产品的所有数据。我只是用IDandtitle给你举个例子。
  • 如果您的$meta_value元值是字符串,那么您就已准备就绪,这意味着我已经编写了查询,假设您的元值是字符串。但是,如果不是,则使用它{$meta_value}代替'{$meta_value}'.
  • 我使用了 global$wpdb并利用了它的属性和方法。
  • wp_我没有使用硬编码数据库表前缀(默认情况下为 ) ,而是使用{$wpdb->prefix}.
  • 我还使用$wpdb->preparestatement 来保护sql 语句。
  • 另外,我用作函数ARRAY_A中的第二个参数$wpdb->get_results,以将数据作为关联数组获取!
  • 另外,请注意,此查询是按日期降序排序的,这意味着最近的产品将首先输出!

使用以下命令执行相同的查询wp_query

Product id: {the product id} and product title: {the product name that matches the query} 
Run Code Online (Sandbox Code Playgroud)

这个答案已经在 woocommerce 上经过充分测试5.x+并且工作正常!