Opened 20 months ago
Last modified 14 months ago
#60984 new defect (bug)
WP_Query is returning the two same post instead of one
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Milestone: | Awaiting Review | Priority: | normal |
| Severity: | normal | Version: | 6.5 |
| Component: | Query | Keywords: | |
| Focuses: | Cc: |
Description
WP_Query is returning two same posts when hooked into pre_get_post with a certain condition.
Steps to reproduce the issue
- Add a hook into the
pre_get_postwith a condition for a certain post type. - Set the
post__inquery variable to a specific ID of the same post type. - Set the
posts_per_pageto 1
I tested this using the Query Loop block, and it always rendered two same posts instead of one.
The query block settings
<!-- wp:query {"queryId":148,"query":{"perPage":"1","pages":0,"offset":0,"postType":"quote","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false,"parents":[]},"align":"wide"} -->
The PHP pre_get_posts includes the hotfix for this issue.
<?php <?php /** * Modifies the query for the Quote of the Day post type. * * @param WP_Query $query The WP_Query instance (passed by reference). * * @return void */ function wporg_modify_quote_of_the_day_query( WP_Query $query ): void { if ( ! $query->is_home() || 'quote' !== $query->get( 'post_type' ) ) { return; } // Prevent infinite loops. remove_action( 'pre_get_posts', __FUNCTION__ ); $daily_quote = wporg_get_daily_quote(); // Custom function that return a WP_Post (quote CPT) instance. $daily_quote_id = $daily_quote instanceof WP_Post ? $daily_quote->ID : null; $query->set( 'post__in', array( $daily_quote_id ) ); $query->set( 'posts_per_page', 1 ); // Hotfix: Two quote CPTs are being displayed. $query->set( 'ignore_sticky_posts', true ); // Re-add the action. add_action( 'pre_get_posts', __FUNCTION__ ); } add_action( 'pre_get_posts', 'wporg_modify_quote_of_the_day_query' );
The issues seem to be in the class-wp-query.php file where the sticky post is being processed. Thus, the post__in is being applied twice in the query.
Attachments (1)
Note: See
TracTickets for help on using
tickets.
Query Loop block rendered two CPT post instead of one