如何在WooCommerce中获取特定用户和特定产品类型的可用类别?

时间:2019-12-01 21:36:43

标签: sql wordpress woocommerce

假设我们有一个使用WooCommerce的市场,这意味着不同的用户在网站上发布产品。目的是编写查询,以查找特定用户和特定产品类型(简单产品,可变产品,外部/关联产品等)的可用类别。

为了更好地理解,这里是一个示例:

  • 我们有3个类别: CatA CatB CatC

  • UserA在CatA下创建了2个简单产品,在CatB下创建了1个变量产品,在CatA下创建了1个变量产品

  • UserB在CatC下创建了1个简单产品,在CatC下创建了1个变量产品

我应该通过运行上述查询获得以下结果:

query(UserA,Simple product) ==> [CatA]
query(UserA,Variable product) ==> [CatA,CatB]
query(UserA,External product) ==> []
query(UserB,Simple product) ==> [CatC]
query(UserB,Variable product) ==> [CatC]

基本上,我需要确定可以确保至少有一种产品用于特定产品类型和特定用户的类别。

到目前为止,我编写了以下查询:

global $wpdb;
$sql = "SELECT t.term_id,t.name, tt.parent FROM $wpdb->terms as t
        LEFT JOIN $wpdb->term_taxonomy as tt on t.term_id = tt.term_id
        LEFT JOIN $wpdb->term_relationships AS tr on tt.term_taxonomy_id = tr.term_taxonomy_id
        LEFT JOIN $wpdb->posts AS p on tr.object_id = p.ID
        WHERE tt.taxonomy = 'product_cat'
        AND p.post_type = 'product'
        AND p.post_status = 'publish'
        AND p.post_author = <USER ID> GROUP BY t.term_id";

$categories = $wpdb->get_results( $sql );

这很好,但只考虑用户而不考虑产品类型。它将返回所有类型的类别。

如何修改查询以考虑产品类型?我尝试添加更多JOIN,但无法使其正确。我需要添加term_relationships.term_taxonomy_id = <ID of the type>term_relationships.object_id = <ID of the product>

或者也许有一种聪明的方法可以使用一些WooCommerce内置函数来获取我需要的东西。

最重要的说明是,我需要能够使用一个查询或一个函数调用来获取此信息。考虑到多次迭代,我可以获得信息。例如,我可以遍历上一个查询的结果并测试每个类别中的产品类型,但我想避免这种情况。

1 个答案:

答案 0 :(得分:0)

我能够通过调整如下查询来解决它:

$sql = "SELECT t.term_id,t.name, tt.parent FROM $wpdb->terms as t
        LEFT JOIN $wpdb->term_taxonomy as tt on t.term_id = tt.term_id
        LEFT JOIN $wpdb->term_relationships AS tr on tt.term_taxonomy_id = tr.term_taxonomy_id
        LEFT JOIN $wpdb->posts AS p on tr.object_id = p.ID
        INNER JOIN $wpdb->term_relationships AS term_relationships ON p.ID = term_relationships.object_id
        WHERE tt.taxonomy = 'product_cat'
        AND term_relationships.term_taxonomy_id = <PRODUCT TYPE ID>
        AND p.post_type = 'product'
        AND p.post_status = 'publish'
        AND p.post_author = <USER ID> GROUP BY t.term_id";

不确定它是否是最佳选择,所以我仍然愿意接受其他解决方案。