Editor: Exclude non-sticky posts in Query Loop Block when set to "Only".

Fixes a front-end issue to not include non-sticky posts in the Query Loop block when it's "Sticky Post" is set to "Only", meaning only show sticky posts.

This change was made in Gutenberg between 5.8 to 6.0, but was not merged into Core.

Reference:
* [42dad571ea/lib/compat/wordpress-6.1/blocks.php (L171-L183) Gutenberg code]

Follow-up to [50945].

Props RavanH, sc0ttkclark, ocean90, sc0ttkclark, hellofromTonya, ntsekouras.
Fixes #57822.

git-svn-id: https://develop.svn.wordpress.org/trunk@55447 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Tonya Mork
2023-03-01 16:13:15 +00:00
parent 6d0a691b84
commit ef30796aab

View File

@@ -1265,7 +1265,15 @@ function build_query_vars_from_query_block( $block, $page ) {
if ( isset( $block->context['query']['sticky'] ) && ! empty( $block->context['query']['sticky'] ) ) {
$sticky = get_option( 'sticky_posts' );
if ( 'only' === $block->context['query']['sticky'] ) {
$query['post__in'] = $sticky;
/*
* Passing an empty array to post__in will return have_posts() as true (and all posts will be returned).
* Logic should be used before hand to determine if WP_Query should be used in the event that the array
* being passed to post__in is empty.
*
* @see https://core.trac.wordpress.org/ticket/28099
*/
$query['post__in'] = ! empty( $sticky ) ? $sticky : array( 0 );
$query['ignore_sticky_posts'] = 1;
} else {
$query['post__not_in'] = array_merge( $query['post__not_in'], $sticky );
}