[wp-trac] [WordPress Trac] #47802: WP_Query get_posts sometimes inserts contradictory taxonomy queries
WordPress Trac
noreply at wordpress.org
Tue Jul 30 18:15:54 UTC 2019
#47802: WP_Query get_posts sometimes inserts contradictory taxonomy queries
--------------------------+-----------------------------
Reporter: nstevensdc | Owner: (none)
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: General | Version:
Severity: normal | Keywords:
Focuses: |
--------------------------+-----------------------------
In our website, we have a custom taxonomy called 'section.' It figures
prominently in a query we're doing. Here's a (lightly anonymized) dump of
the array we pass to the WP_Query constructor, before calling get_posts()
on the query created:
{{{
[posts_per_page] => 25
[post_type] => post
[tax_query] => Array
(
[0] => Array
(
[operator] => IN
[taxonomy] => section
[field] => slug
[terms] => Array
(
[0] => section1
[1] => section2
[2] => section3
[3] => section4
)
)
[1] => Array
(
[operator] => NOT IN
[taxonomy] => section
[field] => slug
[terms] => Array
(
[0] => section5
)
)
[relation] => AND
)
[orderby] => post_date
[order] => DESC
}}}
We had a problem where many posts that should be returned here, are not.
After much digging, I found the problem in get_posts. specifically in the
segment of code commented:
{{{
/*
* Set 'taxonomy', 'term', and 'term_id' to the
* first taxonomy other than 'post_tag' or
'category'.
*/
}}}
It's true, the code is doing just that. It's adding a taxonomy parameter.
But it's picking up one of the sections that is supposed to be one of
several possibilities the section can be IN, not required. It then makes
that one single section required in an appended AND! Sample (again,
lightly anonymized) SQL segment of the obviously self-contradictory
conditions created (where 1001-1005 are the IDs corresponding to sections
1-5)
{{{
wp_term_relationships.term_taxonomy_id IN (1001, 1002, 1003, 1004)
AND
wp_posts.ID NOT IN (
SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (1005)
)
AND
tt1.term_taxonomy_id IN (1001)
)
}}}
That third clause, the final IN (1001) is being added by get_posts in the
above-commented section. That's why we only get a fraction of the posts
we're supposed to get. It's effectively overriding most of our IN list!
I can work around this by prepending to my tax_query an effective no-op
using some custom taxonomy, but this seems like a problem that should be
addressed in the WP core.
thank you,
--
Ticket URL: <https://core.trac.wordpress.org/ticket/47802>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list