From ef30796aaba891ae129e39af1ded659c78796865 Mon Sep 17 00:00:00 2001 From: Tonya Mork Date: Wed, 1 Mar 2023 16:13:15 +0000 Subject: [PATCH] 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: * [https://github.com/WordPress/gutenberg/blob/42dad571eac32c41a7ff34f0da80fcc4e5ceb3bd/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 --- src/wp-includes/blocks.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 5b8871d3f7..9a8c3b06f4 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -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 ); }