使用Woocommerce,我正在尝试使用产品类别' Apple'为产品变体制作WP_Query。
$args = array(
'product_cat' => 'Apple',
'post_type' => array('product', 'product_variation'),
'post_status' => 'publish',
'key' => '_visibility',
'value' => 'visible',
'posts_per_page' => 100,
'taxonomy' => 'pa_size',
'meta_value' => '39',
'meta_query' => array(
array(
'key' => '_stock',
'value' => 0,
'compare' => '>'
)
)
);
但我无法在此查询中使用它。如果我删除'product_cat' => 'Apple'
,则查询有效。为什么呢?
答案 0 :(得分:5)
此WP_Query
关于Woocommerce产品存在许多错误:
tax_query
代替。product_visibility
分类标准处理'exclude-from-search'
和'exclude-from-catalog'
条款。有关产品变体的重要说明:
meta_key
前置为" attribute_
"和met_value
term slug 。因此,当使用WP_Query
时,您无法同时查询" product"发布类型和" product_variation"帖子类型因为它们真的不同。
使您的查询适用于" product_variation"邮政类型,您需要一个小实用程序功能,它将获取产品类别的父变量产品(或任何自定义分类作为产品标签...):
// Utility function to get the parent variable product IDs for a any term of a taxonomy
function get_variation_parent_ids_from_term( $term, $taxonomy, $type ){
global $wpdb;
return $wpdb->get_col( "
SELECT DISTINCT p.ID
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}posts as p2 ON p2.post_parent = p.ID
INNER JOIN {$wpdb->prefix}term_relationships as tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->prefix}term_taxonomy as tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND p2.post_status = 'publish'
AND tt.taxonomy = '$taxonomy'
AND t.$type = '$term'
" );
}
代码放在活动子主题(或活动主题)的function.php文件中。经过测试和工作。 WP_Query
以下需要...
此处WP_Query
代码代码 (仅限)与特定产品类别和特定变体属性值相关:
// Settings
$cat_name = 'Apple'; // Product category name
$attr_taxonomy = 'pa_size'; // Product attribute
$attribute_term_slugs = array('39'); // <== Need to be term SLUGs
$query = new WP_Query( array(
'post_type' => 'product_variation',
'post_status' => 'publish',
'posts_per_page' => 100,
'post_parent__in' => get_variation_parent_ids_from_term( $cat_name, 'product_cat', 'name' ), // Variations
'meta_query' => array(
'relation' => 'AND',
array(
'key' => '_stock',
'value' => 0,
'compare' => '>'
),
array(
'key' => 'attribute_'.$attr_taxonomy, // Product variation attribute
'value' => $attribute_term_slugs, // Term slugs only
'compare' => 'IN',
),
),
) );
// Display the queried products count
echo '<p>Product count: ' . $query->post_count . '<p>';
// Displaying raw output for posts
print_pr($query->posts);
经过测试和工作。
答案 1 :(得分:0)
有一些方法可以做到这一点,您可以循环产品并检查产品是否为 variable
,如果为真,您可以添加另一个循环以包含变体,但如果您必须使用 { {1}} 出于任何原因,您都可以使用 WP_Query
过滤器,当您使用 posts_join
时,它将添加一个 tax_query
sql 语句,该语句将比较 LEFT JOIN
中的 post 列1}} 表与 ID
表中的术语关系 wp_posts
列,语句如下所示:
object_id
我们在这里需要做的就是添加一个 wp_term_relationships
语句,该语句将使查询同时查找 post parent ids 并进行如下语句:(在 Woocommerce 产品变体中有一个 post parent,即产品本身)
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
我们将使用 posts_join 过滤器来执行此操作,但请记住,我们需要在触发 wp_query 后立即移除过滤器(您也可以创建一些唯一变量,并且仅在以下情况下更改 OR
语句)变量存在
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id OR wp_posts.post_parent = wp_term_relationships.object_id)