diff --git a/docs/reference-guides/core-blocks.md b/docs/reference-guides/core-blocks.md index a7bf34a80888c9..9668735e079097 100644 --- a/docs/reference-guides/core-blocks.md +++ b/docs/reference-guides/core-blocks.md @@ -602,6 +602,15 @@ An advanced block that allows displaying post types based on different query par - **Supports:** align (full, wide), color (background, gradients, link, text), ~~html~~ - **Attributes:** displayLayout, query, queryId, tagName +## No results + +Contains the block elements used to render content when no query results are found. ([Source](https://github.com/WordPress/gutenberg/tree/trunk/packages/block-library/src/query-no-results)) + +- **Name:** core/query-no-results +- **Category:** theme +- **Supports:** align, color (background, gradients, link, text), ~~html~~, ~~reusable~~ +- **Attributes:** + ## Pagination Displays a paginated navigation to next/previous set of posts, when applicable. ([Source](https://github.com/WordPress/gutenberg/tree/trunk/packages/block-library/src/query-pagination)) diff --git a/lib/blocks.php b/lib/blocks.php index 8a61b1ff8a4a48..4dda3aacfa4e26 100644 --- a/lib/blocks.php +++ b/lib/blocks.php @@ -97,6 +97,7 @@ function gutenberg_reregister_core_block_types() { 'post-title.php' => 'core/post-title', 'query.php' => 'core/query', 'post-template.php' => 'core/post-template', + 'query-no-results.php' => 'core/query-no-results', 'query-pagination.php' => 'core/query-pagination', 'query-pagination-next.php' => 'core/query-pagination-next', 'query-pagination-numbers.php' => 'core/query-pagination-numbers', diff --git a/packages/block-library/src/index.js b/packages/block-library/src/index.js index 52a2b4f3f50b09..6b856cf5437ace 100644 --- a/packages/block-library/src/index.js +++ b/packages/block-library/src/index.js @@ -77,6 +77,7 @@ import * as postTitle from './post-title'; import * as preformatted from './preformatted'; import * as pullquote from './pullquote'; import * as query from './query'; +import * as queryNoResults from './query-no-results'; import * as queryPagination from './query-pagination'; import * as queryPaginationNext from './query-pagination-next'; import * as queryPaginationNumbers from './query-pagination-numbers'; @@ -250,6 +251,7 @@ export const __experimentalRegisterExperimentalCoreBlocks = process.env // Experimental blocks. homeLink, postAuthorName, + queryNoResults, // Full Site Editing blocks. ...( enableFSEBlocks diff --git a/packages/block-library/src/query-no-results/block.json b/packages/block-library/src/query-no-results/block.json new file mode 100644 index 00000000000000..09a03821625a9d --- /dev/null +++ b/packages/block-library/src/query-no-results/block.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "core/query-no-results", + "title": "No results", + "category": "theme", + "description": "Contains the block elements used to render content when no query results are found.", + "parent": [ "core/query" ], + "textdomain": "default", + "usesContext": [ "queryId", "query" ], + "supports": { + "align": true, + "reusable": false, + "html": false, + "color": { + "gradients": true, + "link": true + } + } +} diff --git a/packages/block-library/src/query-no-results/edit.js b/packages/block-library/src/query-no-results/edit.js new file mode 100644 index 00000000000000..e2dba1152a5140 --- /dev/null +++ b/packages/block-library/src/query-no-results/edit.js @@ -0,0 +1,28 @@ +/** + * WordPress dependencies + */ +import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor'; +import { __ } from '@wordpress/i18n'; + +const TEMPLATE = [ + [ + 'core/paragraph', + { + placeholder: __( + 'Add a text or blocks that will display when the query returns no results.' + ), + }, + ], +]; + +export default function QueryNoResultsEdit() { + const blockProps = useBlockProps(); + const innerBlocksProps = useInnerBlocksProps( blockProps, { + template: TEMPLATE, + } ); + return ( + <> +
+ > + ); +} diff --git a/packages/block-library/src/query-no-results/index.js b/packages/block-library/src/query-no-results/index.js new file mode 100644 index 00000000000000..cd0c3209e00a9f --- /dev/null +++ b/packages/block-library/src/query-no-results/index.js @@ -0,0 +1,20 @@ +/** + * WordPress dependencies + */ +import { loop as icon } from '@wordpress/icons'; + +/** + * Internal dependencies + */ +import metadata from './block.json'; +import edit from './edit'; +import save from './save'; + +const { name } = metadata; +export { metadata, name }; + +export const settings = { + icon, + edit, + save, +}; diff --git a/packages/block-library/src/query-no-results/index.php b/packages/block-library/src/query-no-results/index.php new file mode 100644 index 00000000000000..2eddab9a6cb3b4 --- /dev/null +++ b/packages/block-library/src/query-no-results/index.php @@ -0,0 +1,59 @@ +context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page'; + $page = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ]; + $query_args = build_query_vars_from_query_block( $block, $page ); + // Override the custom query with the global query if needed. + $use_global_query = ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ); + if ( $use_global_query ) { + global $wp_query; + if ( $wp_query && isset( $wp_query->query_vars ) && is_array( $wp_query->query_vars ) ) { + $query_args = wp_parse_args( $wp_query->query_vars, $query_args ); + } + } + $query = new WP_Query( $query_args ); + + if ( $query->have_posts() ) { + return ''; + } + + wp_reset_postdata(); + + return sprintf( + '