-
Notifications
You must be signed in to change notification settings - Fork 4.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a filter to build_query_vars_from_query_block
#43590
Changes from 4 commits
9364159
241b84d
288b06e
b8a6f9b
c1d5e3f
7367392
3cd0f8a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -205,3 +205,145 @@ function gutenberg_block_type_metadata_multiple_view_scripts( $metadata ) { | |
return $metadata; | ||
} | ||
add_filter( 'block_type_metadata', 'gutenberg_block_type_metadata_multiple_view_scripts' ); | ||
|
||
/** | ||
* Helper function that constructs a WP_Query args array from | ||
* a `Query` block properties. | ||
* | ||
* It's used in QueryLoop, QueryPaginationNumbers and QueryPaginationNext blocks. | ||
* | ||
* `build_query_vars_from_query_block` was introduced in 5.8, for 6.1 we just need | ||
* to update that function and not create a new one. | ||
* | ||
* @param WP_Block $block Block instance. | ||
* @param int $page Current query's page. | ||
* | ||
* @return array Returns the constructed WP_Query arguments. | ||
*/ | ||
function gutenberg_build_query_vars_from_query_block( $block, $page ) { | ||
$query = array( | ||
'post_type' => 'post', | ||
'order' => 'DESC', | ||
'orderby' => 'date', | ||
'post__not_in' => array(), | ||
); | ||
|
||
if ( isset( $block->context['query'] ) ) { | ||
if ( ! empty( $block->context['query']['postType'] ) ) { | ||
$post_type_param = $block->context['query']['postType']; | ||
if ( is_post_type_viewable( $post_type_param ) ) { | ||
$query['post_type'] = $post_type_param; | ||
} | ||
} | ||
if ( isset( $block->context['query']['sticky'] ) && ! empty( $block->context['query']['sticky'] ) ) { | ||
$sticky = get_option( 'sticky_posts' ); | ||
if ( 'only' === $block->context['query']['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 ); | ||
} | ||
} | ||
if ( ! empty( $block->context['query']['exclude'] ) ) { | ||
$excluded_post_ids = array_map( 'intval', $block->context['query']['exclude'] ); | ||
$excluded_post_ids = array_filter( $excluded_post_ids ); | ||
$query['post__not_in'] = array_merge( $query['post__not_in'], $excluded_post_ids ); | ||
} | ||
if ( | ||
isset( $block->context['query']['perPage'] ) && | ||
is_numeric( $block->context['query']['perPage'] ) | ||
) { | ||
$per_page = absint( $block->context['query']['perPage'] ); | ||
$offset = 0; | ||
|
||
if ( | ||
isset( $block->context['query']['offset'] ) && | ||
is_numeric( $block->context['query']['offset'] ) | ||
) { | ||
$offset = absint( $block->context['query']['offset'] ); | ||
} | ||
|
||
$query['offset'] = ( $per_page * ( $page - 1 ) ) + $offset; | ||
$query['posts_per_page'] = $per_page; | ||
} | ||
|
||
// We need to migrate `categoryIds` and `tagIds` to `tax_query` for backwards compatibility. | ||
if ( ! empty( $block->context['query']['categoryIds'] ) || ! empty( $block->context['query']['tagIds'] ) ) { | ||
$tax_query = array(); | ||
if ( ! empty( $block->context['query']['categoryIds'] ) ) { | ||
$tax_query[] = array( | ||
'taxonomy' => 'category', | ||
'terms' => array_filter( array_map( 'intval', $block->context['query']['categoryIds'] ) ), | ||
'include_children' => false, | ||
); | ||
} | ||
if ( ! empty( $block->context['query']['tagIds'] ) ) { | ||
$tax_query[] = array( | ||
'taxonomy' => 'post_tag', | ||
'terms' => array_filter( array_map( 'intval', $block->context['query']['tagIds'] ) ), | ||
'include_children' => false, | ||
); | ||
} | ||
$query['tax_query'] = $tax_query; | ||
} | ||
if ( ! empty( $block->context['query']['taxQuery'] ) ) { | ||
$query['tax_query'] = array(); | ||
foreach ( $block->context['query']['taxQuery'] as $taxonomy => $terms ) { | ||
if ( is_taxonomy_viewable( $taxonomy ) && ! empty( $terms ) ) { | ||
$query['tax_query'][] = array( | ||
'taxonomy' => $taxonomy, | ||
'terms' => array_filter( array_map( 'intval', $terms ) ), | ||
'include_children' => false, | ||
); | ||
} | ||
} | ||
} | ||
if ( | ||
isset( $block->context['query']['order'] ) && | ||
in_array( strtoupper( $block->context['query']['order'] ), array( 'ASC', 'DESC' ), true ) | ||
) { | ||
$query['order'] = strtoupper( $block->context['query']['order'] ); | ||
} | ||
if ( isset( $block->context['query']['orderBy'] ) ) { | ||
$query['orderby'] = $block->context['query']['orderBy']; | ||
} | ||
if ( ! empty( $block->context['query']['author'] ) ) { | ||
$query['author'] = $block->context['query']['author']; | ||
} | ||
if ( ! empty( $block->context['query']['search'] ) ) { | ||
$query['s'] = $block->context['query']['search']; | ||
} | ||
if ( ! empty( $block->context['query']['parents'] ) && is_post_type_hierarchical( $query['post_type'] ) ) { | ||
$query['post_parent__in'] = array_filter( array_map( 'intval', $block->context['query']['parents'] ) ); | ||
} | ||
} | ||
|
||
/** | ||
* Filters the arguments which will be passed to `WP_Query` for the Query Loop Block | ||
ntsekouras marked this conversation as resolved.
Show resolved
Hide resolved
|
||
* | ||
* Anything to this filter should be compatible with the `WP_Query` API to form | ||
sunyatasattva marked this conversation as resolved.
Show resolved
Hide resolved
|
||
* the query context which will be passed down to the Query Loop Block's children. | ||
* This can help, for example, to include additional settings or meta queries not | ||
* directly supported by the core Query Loop Block, and extend its capabilities. | ||
Comment on lines
+333
to
+334
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this is the key part of the comment. Anything already supported by the block should be done by the block. For example we have special handling for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yea, I see that. I guess that's the risk with many filters, right? Each developer needs to be responsible and see what kind of side effects they might be introducing… |
||
* | ||
* Please note that this will only influence the query that will be rendered on the | ||
* front-end. The editor preview is not affected by this filter. Also, worth noting | ||
* that the editor preview uses the REST API, so, ideally, one should aim to provide | ||
* attributes which are also compatible with the REST API, in order to be able to | ||
* implement identical queries on both sides. | ||
* | ||
* @since 6.1.0 | ||
* | ||
* @param array $query Array containing parameters for `WP_Query` as parsed by the block context. | ||
* @param WP_Block $block Block instance. | ||
* @param int $page Current query's page. | ||
*/ | ||
return apply_filters( 'query_loop_block_query_vars', $query, $block, $page ); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interestingly enough this code from here was close to the 6.0 release and didn't land there, so we should have moved this file to
compat/6.1
either way.. Good timing for this change 😄