首页 > 解决方案 > 添加新的“tax_query”数组后,WooCommerce WP_Query 返回空 [已解决]

问题描述

我正在开发一个自定义 PHP,它将输出返回到来自 WordPress 站点的 AJAX 调用。

对 WP_Query 的基本调用有效,并且我正确显示了产品。这将是我传递给它的 $args 对象:

$args = array(
    'post_type'             => 'product',
    'post_status'           => 'publish',
    'ignore_sticky_posts'   => 1,
    'posts_per_page'        => $itemsPerPage, // '12'
    'paged'                 => $page,
    'tax_query'             => array(
        array(
            'taxonomy'      => 'product_cat',
            'field'         => 'term_id',
            'terms'         => 304,
            'operator'      => 'IN' // 'IN', 'NOT IN', 'AND'
        ),
        array(
            'taxonomy'      => 'product_visibility',
            'field'         => 'slug',
            'terms'         => 'exclude-from-catalog',
            'operator'      => 'NOT IN'
        ),
    )
);

问题是,在声明这一点之后,我检查查询参数以查看是否发送了任何过滤器。需要时,我会这样做:

 $arrayQuery = [];
 $arrayQuery["taxonomy"] = $taxonomy;
 $arrayQuery["field"] = "term_id";
 $arrayQuery["terms"] = $arrayTerms;
 $arrayQuery["operator"] = "IN"; 

 array_push($args["tax_query"], $arrayQuery);

在一些循环之后,生成的 $args 如下(从 print_r() 输出):

Array
(
    [post_type] => product
    [post_status] => publish
    [ignore_sticky_posts] => 1
    [posts_per_page] => 12
    [paged] => 1
    [tax_query] => Array
        (
            [0] => Array
                (
                    [taxonomy] => product_cat
                    [field] => term_id
                    [terms] => 304
                    [operator] => IN
                )

            [1] => Array
                (
                    [taxonomy] => product_visibility
                    [field] => slug
                    [terms] => exclude-from-catalog
                    [operator] => NOT IN
                )

            [2] => Array
                (
                    [taxonomy] => pa_expedicion
                    [field] => term_id
                    [terms] => Array
                        (
                            [0] => 469
                        )

                    [operator] => IN
                )
        )
)

使用此对象,结果为空。

经过一些调试,我得到了在 MySQL 上运行的 SQL,就是这个(不要浪费时间阅读了):

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID 
FROM wp_posts  
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)  
LEFT JOIN wp_term_relationships AS tt1 ON (wp_posts.ID = tt1.object_id)
WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (43,44,47,94,96,304) 
  AND 
  wp_posts.ID NOT IN (
                SELECT object_id
                FROM wp_term_relationships
                WHERE term_taxonomy_id IN (7)
            ) 
  AND 
  tt1.term_taxonomy_id IN (469)
) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 12

问题是,经过对 phpMyAdmin 的一些测试,我设法让它返回与过滤器匹配的 6 个项目。

我不得不评论两行:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID 
FROM wp_posts  
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)  
LEFT JOIN wp_term_relationships AS tt1 ON (wp_posts.ID = tt1.object_id)
WHERE 1=1  AND ( 
--  wp_term_relationships.term_taxonomy_id IN (43,44,47,94,96,304) 
--  AND 
  wp_posts.ID NOT IN (
                SELECT object_id
                FROM wp_term_relationships
                WHERE term_taxonomy_id IN (7)
            ) 
  AND 
  tt1.term_taxonomy_id IN (469)
) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 12

但这没有任何意义,不是吗?

退回的产品必须属于这些类别。

我不确定我做错了什么。我不明白为什么添加另一个条件会使它停止工作。我希望有人可以在这里带来一些光明...

提前致谢!

标签: phpwordpresswoocommerce

解决方案


好的,我知道我做错了什么。

在 phpMyAdmin 上调试时,我假设这 6 个产品从我正在寻找的类别返回。

碰巧这个“pa_expedicion”属性也与其他类别的产品共享。

“43,44,47,94,96,304”类别中的所有产品都没有“term_id”469。

我测试了 PHP 脚本,将其更改为某些产品所具有的 467,并且 WP_Query 调用现在按预期返回产品。


推荐阅读