Opened 11 years ago
Closed 10 years ago
#32833 closed defect (bug) (fixed)
previous_post_link/next_post_link disappear when excluding by post_format
| Reported by: |
|
Owned by: |
|
|---|---|---|---|
| Milestone: | 4.4 | Priority: | normal |
| Severity: | normal | Version: | 4.2.2 |
| Component: | General | Keywords: | has-patch needs-testing |
| Focuses: | Cc: |
Description
The following code gives me back a term_id from get_term_by, but causes the next/previous links to disappear:
<?php print_r(get_taxonomies()); ?>
<?php print_r(get_term_by('slug', 'post-format-aside', 'post_format')->term_id); ?>
<?php previous_post_link('‹ %link', '%title', false, array(get_term_by('slug', 'post-format-aside', 'post_format')->term_id )); ?>
<?php next_post_link('%link ›', '%title', false, array(get_term_by('slug', 'post-format-aside', 'post_format')->term_id )); ?>
The object returned by get_term_by is:
STDCLASS OBJECT ( [TERM_ID] => 10 [NAME] => ASIDE [SLUG] => POST-FORMAT-ASIDE [TERM_GROUP] => 0 [TERM_TAXONOMY_ID] => 10 [TAXONOMY] => POST_FORMAT [DESCRIPTION] => [PARENT] => 0 [COUNT] => 0 [FILTER] => RAW ) UPDATE 2
When I enable the Wordpress query debugging, I see the following query being triggered, which is the empty set.
[mysql> SELECT P.ID FROM WP_POSTS AS P INNER JOIN WP_TERM_RELATIONSHIPS AS TR ON P.ID = TR.OBJECT_ID INNER JOIN WP_TERM_TAXONOMY TT ON TR.TERM_TAXONOMY_ID = TT.TERM_TAXONOMY_ID WHERE P.POST_DATE < '2015-06-01 20:10:00' AND P.POST_TYPE = 'PROJECT' AND TT.TAXONOMY = 'CATEGORY' AND P.ID NOT IN ( SELECT TR.OBJECT_ID FROM WP_TERM_RELATIONSHIPS TR LEFT JOIN WP_TERM_TAXONOMY TT ON (TR.TERM_TAXONOMY_ID = TT.TERM_TAXONOMY_ID) WHERE TT.TERM_ID IN (10) ) AND ( P.POST_STATUS = 'PUBLISH' OR P.POST_STATUS = 'PRIVATE' ) ORDER BY P.POST_DATE DESC ;] Empty set (0.01 sec)
What's strange about the above is that the query appears to be attempting to find the previous post based on the category taxonomy, which I have explicitly asked the function not to do through the query parameters. This seems like a bug in Wordpress to me.
Attachments (1)
Change History (7)
#2
@
10 years ago
See this exchange for the intended purpose: http://wordpress.stackexchange.com/questions/192909/previous-post-link-next-post-link-disappear-when-excluding-by-post-format/193030
#3
@
10 years ago
- Keywords has-patch needs-testing added; close reporter-feedback removed
- Milestone changed from Awaiting Review to 4.4
Thanks for the link.
After some more digging, I managed to find a bug. I'm not 100% sure that this is what's causing your issue, but here goes.
In [29248], the clause that handles the $excluded_terms param in get_adjacent_post() was converted to a subquery of the form AND p.ID NOT IN ( SELECT ... ), where it used to be some sort of JOIN against the taxonomy tables. However, the $join and $where clauses were still being set up as if the taxonomy table were still involved in the $excluded_terms query.
More specifically, the query involved an INNER JOIN against the wp_term_relationships and wp_term_taxonomy tables. The INNER JOIN means that rows from the post table will be missed if they don't also have at least one row in the wp_term_relationships table (and, in most cases, one that matches the $taxonomy param). Usually, this is the case - posts created through the normal WP interface get the category 'Uncategorized'. But I'm betting that items in your 'project' post type don't have *any* rows in wp_term_relationships. As a result, they're not being included in the query.
Fix and unit test demonstrating the problem in [32833.diff]. markshiz, can you please patch your installation to see if this solves the problem for you?
Hi markshiz -
Thanks for the ticket, and sorry for the delay in responding.
I'm not sure I totally understand what you think the incorrect behavior is.
How have you done this? Is it because you've passed
falseto the third param,$in_same_term? If so, note that this is about specific terms, not entire taxonomies.next_post_link()andprevious_post_link()each accept a fifth parameter$taxonomy. The default value of this parameter is'category'. That's why you see a'category'clause in the SQL query. So I don't think there's a bug here.It's hard to say what's happening in the case of the "disappearing" links. Looking at the SQL and the arguments you're passing to the
_post_link()functions, I'd say it's because there are no posts with 'post_type=project' on your installation that belong to any categories and do not belong to the 'post-format-aside' taxonomy. What is it that you *intend* to be doing with these links?