php - 添加新的“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
但这没有任何意义,不是吗?
退回的产品必须属于这些类别。
我不确定我做错了什么。我不明白为什么添加另一个条件会使它停止工作。我希望有人可以在这里带来一些光明...
提前致谢!
解决方案
好的,我知道我做错了什么。
在 phpMyAdmin 上调试时,我假设这 6 个产品从我正在寻找的类别返回。
碰巧这个“pa_expedicion”属性也与其他类别的产品共享。
“43,44,47,94,96,304”类别中的所有产品都没有“term_id”469。
我测试了 PHP 脚本,将其更改为某些产品所具有的 467,并且 WP_Query 调用现在按预期返回产品。
推荐阅读
- python - 如何将pyspark聚合函数结果输出为字符串?
- c++ - 当我在我的姓名输入部分输入超过 1 个单词时,代码会无限次保存数据
- reactjs - 有没有更好的方法可以根据数据类型从同一组件中的 API 获取不同的数据?
- visual-studio - Visual Studio 不显示文件夹和类
- javascript - 如何阻止可拖动元素从画布中拖动
- rust - Rust - 返回对结构拥有的 Vec 中元素的可变引用
- sql-server - 在创建临时表时或在填充临时表后向临时表添加索引更好吗?
- batch-file - 使用 %~dp0 将文件路径替换为批处理文件
- amazon-web-services - 无法连接到 aws elastic beanstalk 上的 datomic
- cucumber - 如何在 Jira Xray 中为场景大纲添加预场景?