???????????????
???????????????
Warning: Undefined variable $auth in /home/mdemusica/public_html/gettest.php on line 544
Warning: Trying to access array offset on value of type null in /home/mdemusica/public_html/gettest.php on line 544
Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 181
Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 182
Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 183
Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 184
Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 185
',
$wrapper_attributes,
$term_count
);
}
/**
* Registers the `core/term-count` block on the server.
*
* @since 6.9.0
*/
function register_block_core_term_count() {
register_block_type_from_metadata(
__DIR__ . '/term-count',
array(
'render_callback' => 'render_block_core_term_count',
)
);
}
add_action( 'init', 'register_block_core_term_count' );
comment-edit-link/style.min.css 0000644 00000000062 15143517315 0012523 0 ustar 00 .wp-block-comment-edit-link{box-sizing:border-box} comment-edit-link/style-rtl.min.css 0000644 00000000062 15143517315 0013322 0 ustar 00 .wp-block-comment-edit-link{box-sizing:border-box} comment-edit-link/style.css 0000644 00000000067 15143517315 0011746 0 ustar 00 .wp-block-comment-edit-link{
box-sizing:border-box;
} comment-edit-link/style-rtl.css 0000644 00000000067 15143517315 0012545 0 ustar 00 .wp-block-comment-edit-link{
box-sizing:border-box;
} comment-edit-link/block.json 0000644 00000002644 15143517315 0012064 0 ustar 00 {
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "core/comment-edit-link",
"title": "Comment Edit Link",
"category": "theme",
"ancestor": [ "core/comment-template" ],
"description": "Displays a link to edit the comment in the WordPress Dashboard. This link is only visible to users with the edit comment capability.",
"textdomain": "default",
"usesContext": [ "commentId" ],
"attributes": {
"linkTarget": {
"type": "string",
"default": "_self"
},
"textAlign": {
"type": "string"
}
},
"supports": {
"html": false,
"color": {
"link": true,
"gradients": true,
"text": false,
"__experimentalDefaultControls": {
"background": true,
"link": true
}
},
"spacing": {
"margin": true,
"padding": true,
"__experimentalDefaultControls": {
"margin": false,
"padding": false
}
},
"typography": {
"fontSize": true,
"lineHeight": true,
"__experimentalFontFamily": true,
"__experimentalFontWeight": true,
"__experimentalFontStyle": true,
"__experimentalTextTransform": true,
"__experimentalTextDecoration": true,
"__experimentalLetterSpacing": true,
"__experimentalDefaultControls": {
"fontSize": true
}
},
"interactivity": {
"clientNavigation": true
},
"__experimentalBorder": {
"radius": true,
"color": true,
"width": true,
"style": true
}
},
"style": "wp-block-comment-edit-link"
}
image.php 0000644 00000033000 15143517315 0006340 0 ustar 00 set_bookmark( 'here' );
$opener = $this->bookmarks['here'];
// Allow comments within the definition of “empty.”
while ( $this->next_token() && '#comment' === $this->get_token_name() ) {
continue;
}
if ( 'FIGCAPTION' !== $this->get_tag() || ! $this->is_tag_closer() ) {
return false;
}
$this->set_bookmark( 'here' );
$closer = $this->bookmarks['here'];
return new WP_HTML_Span( $opener->start, $closer->start + $closer->length - $opener->start );
}
};
if ( ! $processor->next_tag( 'img' ) || ! $processor->get_attribute( 'src' ) ) {
return '';
}
$has_id_binding = isset( $attributes['metadata']['bindings']['id'] ) && isset( $attributes['id'] );
// Ensure the `wp-image-id` classname on the image block supports block bindings.
if ( $has_id_binding ) {
// If there's a mismatch with the 'wp-image-' class and the actual id, the id was
// probably overridden by block bindings. Update it to the correct value.
// See https://github.com/WordPress/gutenberg/issues/62886 for why this is needed.
$id = $attributes['id'];
$image_classnames = $processor->get_attribute( 'class' );
$class_with_binding_value = "wp-image-$id";
if ( is_string( $image_classnames ) && ! str_contains( $image_classnames, $class_with_binding_value ) ) {
$image_classnames = preg_replace( '/wp-image-(\d+)/', $class_with_binding_value, $image_classnames );
$processor->set_attribute( 'class', $image_classnames );
}
}
// For backwards compatibility, the data-id html attribute is only set for
// image blocks nested in a gallery. Detect if the image is in a gallery by
// checking the data-id attribute.
// See the `block_core_gallery_data_id_backcompatibility` function.
if ( isset( $attributes['data-id'] ) ) {
// If there's a binding for the `id`, the `id` attribute is used for the
// value, since `data-id` does not support block bindings.
// Else the `data-id` is used for backwards compatibility, since
// third parties may be filtering its value.
$data_id = $has_id_binding ? $attributes['id'] : $attributes['data-id'];
$processor->set_attribute( 'data-id', $data_id );
}
/*
* If the `caption` attribute is empty and we encounter a `` element,
* we take note of its span so we can remove it later.
*/
if ( $processor->next_tag( 'FIGCAPTION' ) && empty( $attributes['caption'] ) ) {
$figcaption_span = $processor->block_core_image_extract_empty_figcaption_element();
}
$link_destination = isset( $attributes['linkDestination'] ) ? $attributes['linkDestination'] : 'none';
$lightbox_settings = block_core_image_get_lightbox_settings( $block->parsed_block );
/*
* If the lightbox is enabled and the image is not linked, adds the filter and
* the JavaScript view file.
*/
if (
isset( $lightbox_settings ) &&
'none' === $link_destination &&
isset( $lightbox_settings['enabled'] ) &&
true === $lightbox_settings['enabled']
) {
wp_enqueue_script_module( '@wordpress/block-library/image/view' );
/*
* This render needs to happen in a filter with priority 15 to ensure that
* it runs after the duotone filter and that duotone styles are applied to
* the image in the lightbox. Lightbox has to work with any plugins that
* might use filters as well. Removing this can be considered in the future
* if the way the blocks are rendered changes, or if a new kind of filter is
* introduced.
*/
add_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15, 2 );
} else {
/*
* Remove the filter if previously added by other Image blocks.
*/
remove_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15 );
}
$output = $processor->get_updated_html();
if ( ! empty( $figcaption_span ) ) {
return substr( $output, 0, $figcaption_span->start ) . substr( $output, $figcaption_span->start + $figcaption_span->length );
}
return $output;
}
/**
* Adds the lightboxEnabled flag to the block data.
*
* This is used to determine whether the lightbox should be rendered or not.
*
* @since 6.4.0
*
* @param array $block Block data.
*
* @return array|null Filtered block data.
*/
function block_core_image_get_lightbox_settings( $block ) {
// Gets the lightbox setting from the block attributes.
if ( isset( $block['attrs']['lightbox'] ) ) {
$lightbox_settings = $block['attrs']['lightbox'];
}
if ( ! isset( $lightbox_settings ) ) {
$lightbox_settings = wp_get_global_settings( array( 'lightbox' ), array( 'block_name' => 'core/image' ) );
// If not present in global settings, check the top-level global settings.
//
// NOTE: If no block-level settings are found, the previous call to
// `wp_get_global_settings` will return the whole `theme.json` structure in
// which case we can check if the "lightbox" key is present at the top-level
// of the global settings and use its value.
if ( isset( $lightbox_settings['lightbox'] ) ) {
$lightbox_settings = wp_get_global_settings( array( 'lightbox' ) );
}
}
return $lightbox_settings ?? null;
}
/**
* Adds the directives and layout needed for the lightbox behavior.
*
* @since 6.4.0
*
* @param string $block_content Rendered block content.
* @param array $block Block object.
*
* @return string Filtered block content.
*/
function block_core_image_render_lightbox( $block_content, $block ) {
/*
* If there's no IMG tag in the block then return the given block content
* as-is. There's nothing that this code can knowingly modify to add the
* lightbox behavior.
*/
$processor = new WP_HTML_Tag_Processor( $block_content );
if ( $processor->next_tag( 'figure' ) ) {
$processor->set_bookmark( 'figure' );
}
if ( ! $processor->next_tag( 'img' ) ) {
return $block_content;
}
$alt = $processor->get_attribute( 'alt' );
$img_uploaded_src = $processor->get_attribute( 'src' );
$img_class_names = $processor->get_attribute( 'class' );
$img_styles = $processor->get_attribute( 'style' );
$img_width = 'none';
$img_height = 'none';
$aria_label = __( 'Enlarge' );
$dialog_aria_label = __( 'Enlarged image' );
if ( isset( $block['attrs']['id'] ) ) {
$img_uploaded_src = wp_get_attachment_url( $block['attrs']['id'] );
$img_metadata = wp_get_attachment_metadata( $block['attrs']['id'] );
$img_width = $img_metadata['width'] ?? 'none';
$img_height = $img_metadata['height'] ?? 'none';
}
// Figure.
$processor->seek( 'figure' );
$figure_class_names = $processor->get_attribute( 'class' );
$figure_styles = $processor->get_attribute( 'style' );
// Create unique id and set the image metadata in the state.
$unique_image_id = uniqid();
wp_interactivity_state(
'core/image',
array(
'metadata' => array(
$unique_image_id => array(
'uploadedSrc' => $img_uploaded_src,
'figureClassNames' => $figure_class_names,
'figureStyles' => $figure_styles,
'imgClassNames' => $img_class_names,
'imgStyles' => $img_styles,
'targetWidth' => $img_width,
'targetHeight' => $img_height,
'scaleAttr' => $block['attrs']['scale'] ?? false,
'ariaLabel' => $dialog_aria_label,
'alt' => $alt,
),
),
)
);
$processor->add_class( 'wp-lightbox-container' );
$processor->set_attribute( 'data-wp-interactive', 'core/image' );
$processor->set_attribute(
'data-wp-context',
wp_json_encode(
array(
'imageId' => $unique_image_id,
),
JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
)
);
$processor->set_attribute( 'data-wp-key', $unique_image_id );
// Image.
$processor->next_tag( 'img' );
$processor->set_attribute( 'data-wp-init', 'callbacks.setButtonStyles' );
$processor->set_attribute( 'data-wp-on--load', 'callbacks.setButtonStyles' );
$processor->set_attribute( 'data-wp-on-window--resize', 'callbacks.setButtonStyles' );
// Sets an event callback on the `img` because the `figure` element can also
// contain a caption, and we don't want to trigger the lightbox when the
// caption is clicked.
$processor->set_attribute( 'data-wp-on--click', 'actions.showLightbox' );
$processor->set_attribute( 'data-wp-class--hide', 'state.isContentHidden' );
$processor->set_attribute( 'data-wp-class--show', 'state.isContentVisible' );
$body_content = $processor->get_updated_html();
// Adds a button alongside image in the body content.
$img = null;
preg_match( '/]+>/', $body_content, $img );
$button =
$img[0]
. '';
$body_content = preg_replace( '/]+>/', $button, $body_content );
add_action( 'wp_footer', 'block_core_image_print_lightbox_overlay' );
return $body_content;
}
/**
* @since 6.5.0
*/
function block_core_image_print_lightbox_overlay() {
$close_button_label = esc_attr__( 'Close' );
// If the current theme does NOT have a `theme.json`, or the colors are not
// defined, it needs to set the background color & close button color to some
// default values because it can't get them from the Global Styles.
$background_color = '#fff';
$close_button_color = '#000';
if ( wp_theme_has_theme_json() ) {
$global_styles_color = wp_get_global_styles( array( 'color' ) );
if ( ! empty( $global_styles_color['background'] ) ) {
$background_color = esc_attr( $global_styles_color['background'] );
}
if ( ! empty( $global_styles_color['text'] ) ) {
$close_button_color = esc_attr( $global_styles_color['text'] );
}
}
echo <<
%2$s',
$wrapper_attributes,
$calendar
);
$monthnum = $previous_monthnum;
$year = $previous_year;
return $output;
}
/**
* Registers the `core/calendar` block on server.
*
* @since 5.2.0
*/
function register_block_core_calendar() {
register_block_type_from_metadata(
__DIR__ . '/calendar',
array(
'render_callback' => 'render_block_core_calendar',
)
);
}
add_action( 'init', 'register_block_core_calendar' );
/**
* Returns whether or not there are any published posts.
*
* Used to hide the calendar block when there are no published posts.
* This compensates for a known Core bug: https://core.trac.wordpress.org/ticket/12016
*
* @since 5.9.0
*
* @return bool Has any published posts or not.
*/
function block_core_calendar_has_published_posts() {
// Multisite already has an option that stores the count of the published posts.
// Let's use that for multisites.
if ( is_multisite() ) {
return 0 < (int) get_option( 'post_count' );
}
// On single sites we try our own cached option first.
$has_published_posts = get_option( 'wp_calendar_block_has_published_posts', null );
if ( null !== $has_published_posts ) {
return (bool) $has_published_posts;
}
// No cache hit, let's update the cache and return the cached value.
return block_core_calendar_update_has_published_posts();
}
/**
* Queries the database for any published post and saves
* a flag whether any published post exists or not.
*
* @since 5.9.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @return bool Has any published posts or not.
*/
function block_core_calendar_update_has_published_posts() {
global $wpdb;
$has_published_posts = (bool) $wpdb->get_var( "SELECT 1 as test FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1" );
update_option( 'wp_calendar_block_has_published_posts', $has_published_posts );
return $has_published_posts;
}
// We only want to register these functions and actions when
// we are on single sites. On multi sites we use `post_count` option.
if ( ! is_multisite() ) {
/**
* Handler for updating the has published posts flag when a post is deleted.
*
* @since 5.9.0
*
* @param int $post_id Deleted post ID.
*/
function block_core_calendar_update_has_published_post_on_delete( $post_id ) {
$post = get_post( $post_id );
if ( ! $post || 'publish' !== $post->post_status || 'post' !== $post->post_type ) {
return;
}
block_core_calendar_update_has_published_posts();
}
/**
* Handler for updating the has published posts flag when a post status changes.
*
* @since 5.9.0
*
* @param string $new_status The status the post is changing to.
* @param string $old_status The status the post is changing from.
* @param WP_Post $post Post object.
*/
function block_core_calendar_update_has_published_post_on_transition_post_status( $new_status, $old_status, $post ) {
if ( $new_status === $old_status ) {
return;
}
if ( 'post' !== get_post_type( $post ) ) {
return;
}
if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
return;
}
block_core_calendar_update_has_published_posts();
}
add_action( 'delete_post', 'block_core_calendar_update_has_published_post_on_delete' );
add_action( 'transition_post_status', 'block_core_calendar_update_has_published_post_on_transition_post_status', 10, 3 );
}
tag-cloud/style.min.css 0000644 00000000767 15143517315 0011076 0 ustar 00 .wp-block-tag-cloud{box-sizing:border-box}.wp-block-tag-cloud.aligncenter{justify-content:center;text-align:center}.wp-block-tag-cloud a{display:inline-block;margin-right:5px}.wp-block-tag-cloud span{display:inline-block;margin-left:5px;text-decoration:none}:root :where(.wp-block-tag-cloud.is-style-outline){display:flex;flex-wrap:wrap;gap:1ch}:root :where(.wp-block-tag-cloud.is-style-outline a){border:1px solid;font-size:unset!important;margin-right:0;padding:1ch 2ch;text-decoration:none!important} tag-cloud/editor.min.css 0000644 00000000135 15143517315 0011211 0 ustar 00 .wp-block-tag-cloud .wp-block-tag-cloud{border:none;border-radius:inherit;margin:0;padding:0} tag-cloud/style-rtl.min.css 0000644 00000000766 15143517315 0011674 0 ustar 00 .wp-block-tag-cloud{box-sizing:border-box}.wp-block-tag-cloud.aligncenter{justify-content:center;text-align:center}.wp-block-tag-cloud a{display:inline-block;margin-left:5px}.wp-block-tag-cloud span{display:inline-block;margin-right:5px;text-decoration:none}:root :where(.wp-block-tag-cloud.is-style-outline){display:flex;flex-wrap:wrap;gap:1ch}:root :where(.wp-block-tag-cloud.is-style-outline a){border:1px solid;font-size:unset!important;margin-left:0;padding:1ch 2ch;text-decoration:none!important} tag-cloud/style.css 0000644 00000001074 15143517315 0010304 0 ustar 00 .wp-block-tag-cloud{
box-sizing:border-box;
}
.wp-block-tag-cloud.aligncenter{
justify-content:center;
text-align:center;
}
.wp-block-tag-cloud a{
display:inline-block;
margin-right:5px;
}
.wp-block-tag-cloud span{
display:inline-block;
margin-left:5px;
text-decoration:none;
}
:root :where(.wp-block-tag-cloud.is-style-outline){
display:flex;
flex-wrap:wrap;
gap:1ch;
}
:root :where(.wp-block-tag-cloud.is-style-outline a){
border:1px solid;
font-size:unset !important;
margin-right:0;
padding:1ch 2ch;
text-decoration:none !important;
} tag-cloud/style-rtl.css 0000644 00000001073 15143517315 0011102 0 ustar 00 .wp-block-tag-cloud{
box-sizing:border-box;
}
.wp-block-tag-cloud.aligncenter{
justify-content:center;
text-align:center;
}
.wp-block-tag-cloud a{
display:inline-block;
margin-left:5px;
}
.wp-block-tag-cloud span{
display:inline-block;
margin-right:5px;
text-decoration:none;
}
:root :where(.wp-block-tag-cloud.is-style-outline){
display:flex;
flex-wrap:wrap;
gap:1ch;
}
:root :where(.wp-block-tag-cloud.is-style-outline a){
border:1px solid;
font-size:unset !important;
margin-left:0;
padding:1ch 2ch;
text-decoration:none !important;
} tag-cloud/editor-rtl.min.css 0000644 00000000135 15143517315 0012010 0 ustar 00 .wp-block-tag-cloud .wp-block-tag-cloud{border:none;border-radius:inherit;margin:0;padding:0} tag-cloud/block.json 0000644 00000002650 15143517315 0010420 0 ustar 00 {
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "core/tag-cloud",
"title": "Tag Cloud",
"category": "widgets",
"description": "A cloud of popular keywords, each sized by how often it appears.",
"textdomain": "default",
"attributes": {
"numberOfTags": {
"type": "number",
"default": 45,
"minimum": 1,
"maximum": 100
},
"taxonomy": {
"type": "string",
"default": "post_tag"
},
"showTagCounts": {
"type": "boolean",
"default": false
},
"smallestFontSize": {
"type": "string",
"default": "8pt"
},
"largestFontSize": {
"type": "string",
"default": "22pt"
}
},
"styles": [
{ "name": "default", "label": "Default", "isDefault": true },
{ "name": "outline", "label": "Outline" }
],
"supports": {
"html": false,
"align": true,
"spacing": {
"margin": true,
"padding": true
},
"typography": {
"lineHeight": true,
"__experimentalFontFamily": true,
"__experimentalFontWeight": true,
"__experimentalFontStyle": true,
"__experimentalTextTransform": true,
"__experimentalLetterSpacing": true
},
"interactivity": {
"clientNavigation": true
},
"__experimentalBorder": {
"radius": true,
"color": true,
"width": true,
"style": true,
"__experimentalDefaultControls": {
"radius": true,
"color": true,
"width": true,
"style": true
}
}
},
"editorStyle": "wp-block-tag-cloud-editor"
}
tag-cloud/editor-rtl.css 0000644 00000000153 15143517315 0011226 0 ustar 00 .wp-block-tag-cloud .wp-block-tag-cloud{
border:none;
border-radius:inherit;
margin:0;
padding:0;
} tag-cloud/editor.css 0000644 00000000153 15143517315 0010427 0 ustar 00 .wp-block-tag-cloud .wp-block-tag-cloud{
border:none;
border-radius:inherit;
margin:0;
padding:0;
} post-content/style.min.css 0000644 00000000051 15143517315 0011636 0 ustar 00 .wp-block-post-content{display:flow-root} post-content/style-rtl.min.css 0000644 00000000051 15143517315 0012435 0 ustar 00 .wp-block-post-content{display:flow-root} post-content/style.css 0000644 00000000056 15143517315 0011061 0 ustar 00 .wp-block-post-content{
display:flow-root;
} post-content/style-rtl.css 0000644 00000000056 15143517315 0011660 0 ustar 00 .wp-block-post-content{
display:flow-root;
} post-content/block.json 0000644 00000003313 15143517315 0011173 0 ustar 00 {
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "core/post-content",
"title": "Content",
"category": "theme",
"description": "Displays the contents of a post or page.",
"textdomain": "default",
"usesContext": [ "postId", "postType", "queryId" ],
"attributes": {
"tagName": {
"type": "string",
"default": "div"
}
},
"example": {
"viewportWidth": 350
},
"supports": {
"align": [ "wide", "full" ],
"html": false,
"layout": true,
"background": {
"backgroundImage": true,
"backgroundSize": true,
"__experimentalDefaultControls": {
"backgroundImage": true
}
},
"dimensions": {
"minHeight": true
},
"spacing": {
"blockGap": true,
"padding": true,
"margin": true,
"__experimentalDefaultControls": {
"margin": false,
"padding": false
}
},
"color": {
"gradients": true,
"heading": true,
"link": true,
"__experimentalDefaultControls": {
"background": false,
"text": false
}
},
"typography": {
"fontSize": true,
"lineHeight": true,
"__experimentalFontFamily": true,
"__experimentalFontWeight": true,
"__experimentalFontStyle": true,
"__experimentalTextTransform": true,
"__experimentalTextDecoration": true,
"__experimentalLetterSpacing": true,
"__experimentalDefaultControls": {
"fontSize": true
}
},
"interactivity": {
"clientNavigation": true
},
"__experimentalBorder": {
"radius": true,
"color": true,
"width": true,
"style": true,
"__experimentalDefaultControls": {
"radius": true,
"color": true,
"width": true,
"style": true
}
}
},
"style": "wp-block-post-content",
"editorStyle": "wp-block-post-content-editor"
}
rss.php 0000644 00000011001 15143517315 0006062 0 ustar 00
' . __( 'Adding an RSS feed to this site’s homepage is not supported, as it could lead to a loop that slows down your site. Try using another block, like the Latest Posts block, to list posts from the site.' ) . '
',
block_core_home_link_build_li_wrapper_attributes( $block->context ),
esc_url( home_url() ),
$aria_current,
wp_kses_post( $attributes['label'] )
);
}
/**
* Register the home block
*
* @since 6.0.0
*
* @uses render_block_core_home_link()
* @throws WP_Error An WP_Error exception parsing the block definition.
*/
function register_block_core_home_link() {
register_block_type_from_metadata(
__DIR__ . '/home-link',
array(
'render_callback' => 'render_block_core_home_link',
)
);
}
add_action( 'init', 'register_block_core_home_link' );
navigation.php 0000644 00000140616 15143517315 0007431 0 ustar 00 wrapper.
*
* @since 6.5.0
*
* @var array
*/
private static $needs_list_item_wrapper = array(
'core/site-title',
'core/site-logo',
'core/social-links',
);
/**
* Keeps track of all the navigation names that have been seen.
*
* @since 6.5.0
*
* @var array
*/
private static $seen_menu_names = array();
/**
* Returns whether or not this is responsive navigation.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return bool Returns whether or not this is responsive navigation.
*/
private static function is_responsive( $attributes ) {
/**
* This is for backwards compatibility after the `isResponsive` attribute was been removed.
*/
$has_old_responsive_attribute = ! empty( $attributes['isResponsive'] ) && $attributes['isResponsive'];
return isset( $attributes['overlayMenu'] ) && 'never' !== $attributes['overlayMenu'] || $has_old_responsive_attribute;
}
/**
* Returns whether or not a navigation has a submenu.
*
* @since 6.5.0
*
* @param WP_Block_List $inner_blocks The list of inner blocks.
* @return bool Returns whether or not a navigation has a submenu and also sets the member variable.
*/
private static function has_submenus( $inner_blocks ) {
if ( true === static::$has_submenus ) {
return static::$has_submenus;
}
foreach ( $inner_blocks as $inner_block ) {
// If this is a page list then work out if any of the pages have children.
if ( 'core/page-list' === $inner_block->name ) {
$all_pages = get_pages(
array(
'sort_column' => 'menu_order,post_title',
'order' => 'asc',
)
);
foreach ( (array) $all_pages as $page ) {
if ( $page->post_parent ) {
static::$has_submenus = true;
break;
}
}
}
// If this is a navigation submenu then we know we have submenus.
if ( 'core/navigation-submenu' === $inner_block->name ) {
static::$has_submenus = true;
break;
}
}
return static::$has_submenus;
}
/**
* Determine whether the navigation blocks is interactive.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @param WP_Block_List $inner_blocks The list of inner blocks.
* @return bool Returns whether or not to load the view script.
*/
private static function is_interactive( $attributes, $inner_blocks ) {
$has_submenus = static::has_submenus( $inner_blocks );
$is_responsive_menu = static::is_responsive( $attributes );
return ( $has_submenus && ( $attributes['openSubmenusOnClick'] || $attributes['showSubmenuIcon'] ) ) || $is_responsive_menu;
}
/**
* Returns whether or not a block needs a list item wrapper.
*
* @since 6.5.0
*
* @param WP_Block $block The block.
* @return bool Returns whether or not a block needs a list item wrapper.
*/
private static function does_block_need_a_list_item_wrapper( $block ) {
/**
* Filter the list of blocks that need a list item wrapper.
*
* Affords the ability to customize which blocks need a list item wrapper when rendered
* within a core/navigation block.
* This is useful for blocks that are not list items but should be wrapped in a list
* item when used as a child of a navigation block.
*
* @since 6.5.0
*
* @param array $needs_list_item_wrapper The list of blocks that need a list item wrapper.
*/
$needs_list_item_wrapper = apply_filters( 'block_core_navigation_listable_blocks', static::$needs_list_item_wrapper );
return in_array( $block->name, $needs_list_item_wrapper, true );
}
/**
* Returns the markup for a single inner block.
*
* @since 6.5.0
*
* @param WP_Block $inner_block The inner block.
* @return string Returns the markup for a single inner block.
*/
private static function get_markup_for_inner_block( $inner_block ) {
$inner_block_content = $inner_block->render();
if ( ! empty( $inner_block_content ) ) {
if ( static::does_block_need_a_list_item_wrapper( $inner_block ) ) {
return '
' . $inner_block_content . '
';
}
}
return $inner_block_content;
}
/**
* Returns the html for the inner blocks of the navigation block.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @param WP_Block_List $inner_blocks The list of inner blocks.
* @return string Returns the html for the inner blocks of the navigation block.
*/
private static function get_inner_blocks_html( $attributes, $inner_blocks ) {
$has_submenus = static::has_submenus( $inner_blocks );
$is_interactive = static::is_interactive( $attributes, $inner_blocks );
$style = static::get_styles( $attributes );
$class = static::get_classes( $attributes );
$container_attributes = get_block_wrapper_attributes(
array(
'class' => 'wp-block-navigation__container ' . $class,
'style' => $style,
)
);
$inner_blocks_html = '';
$is_list_open = false;
foreach ( $inner_blocks as $inner_block ) {
$inner_block_markup = static::get_markup_for_inner_block( $inner_block );
$p = new WP_HTML_Tag_Processor( $inner_block_markup );
$is_list_item = $p->next_tag( 'LI' );
if ( $is_list_item && ! $is_list_open ) {
$is_list_open = true;
$inner_blocks_html .= sprintf(
'
';
}
$inner_blocks_html .= $inner_block_markup;
}
if ( $is_list_open ) {
$inner_blocks_html .= '';
}
// Add directives to the submenu if needed.
if ( $has_submenus && $is_interactive ) {
$tags = new WP_HTML_Tag_Processor( $inner_blocks_html );
$inner_blocks_html = block_core_navigation_add_directives_to_submenu( $tags, $attributes );
}
return $inner_blocks_html;
}
/**
* Gets the inner blocks for the navigation block from the navigation post.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return WP_Block_List Returns the inner blocks for the navigation block.
*/
private static function get_inner_blocks_from_navigation_post( $attributes ) {
$navigation_post = get_post( $attributes['ref'] );
if ( ! isset( $navigation_post ) ) {
return new WP_Block_List( array(), $attributes );
}
// Only published posts are valid. If this is changed then a corresponding change
// must also be implemented in `use-navigation-menu.js`.
if ( 'publish' === $navigation_post->post_status ) {
$parsed_blocks = parse_blocks( $navigation_post->post_content );
// 'parse_blocks' includes a null block with '\n\n' as the content when
// it encounters whitespace. This code strips it.
$blocks = block_core_navigation_filter_out_empty_blocks( $parsed_blocks );
// Re-serialize, and run Block Hooks algorithm to inject hooked blocks.
// TODO: See if we can move the apply_block_hooks_to_content_from_post_object() call
// before the parse_blocks() call further above, to avoid the extra serialization/parsing.
$markup = serialize_blocks( $blocks );
$markup = apply_block_hooks_to_content_from_post_object( $markup, $navigation_post );
$blocks = parse_blocks( $markup );
// TODO - this uses the full navigation block attributes for the
// context which could be refined.
return new WP_Block_List( $blocks, $attributes );
}
}
/**
* Gets the inner blocks for the navigation block from the fallback.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return WP_Block_List Returns the inner blocks for the navigation block.
*/
private static function get_inner_blocks_from_fallback( $attributes ) {
$fallback_blocks = block_core_navigation_get_fallback_blocks();
// Fallback my have been filtered so do basic test for validity.
if ( empty( $fallback_blocks ) || ! is_array( $fallback_blocks ) ) {
return new WP_Block_List( array(), $attributes );
}
return new WP_Block_List( $fallback_blocks, $attributes );
}
/**
* Gets the inner blocks for the navigation block.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @param WP_Block $block The parsed block.
* @return WP_Block_List Returns the inner blocks for the navigation block.
*/
private static function get_inner_blocks( $attributes, $block ) {
$inner_blocks = $block->inner_blocks;
// Ensure that blocks saved with the legacy ref attribute name (navigationMenuId) continue to render.
if ( array_key_exists( 'navigationMenuId', $attributes ) ) {
$attributes['ref'] = $attributes['navigationMenuId'];
}
// If:
// - the gutenberg plugin is active
// - `__unstableLocation` is defined
// - we have menu items at the defined location
// - we don't have a relationship to a `wp_navigation` Post (via `ref`).
// ...then create inner blocks from the classic menu assigned to that location.
if (
defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN &&
array_key_exists( '__unstableLocation', $attributes ) &&
! array_key_exists( 'ref', $attributes ) &&
! empty( block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] ) )
) {
$inner_blocks = block_core_navigation_get_inner_blocks_from_unstable_location( $attributes );
}
// Load inner blocks from the navigation post.
if ( array_key_exists( 'ref', $attributes ) ) {
$inner_blocks = static::get_inner_blocks_from_navigation_post( $attributes );
}
// If there are no inner blocks then fallback to rendering an appropriate fallback.
if ( empty( $inner_blocks ) ) {
$inner_blocks = static::get_inner_blocks_from_fallback( $attributes );
}
/**
* Filter navigation block $inner_blocks.
* Allows modification of a navigation block menu items.
*
* @since 6.1.0
*
* @param \WP_Block_List $inner_blocks
*/
$inner_blocks = apply_filters( 'block_core_navigation_render_inner_blocks', $inner_blocks );
$post_ids = block_core_navigation_get_post_ids( $inner_blocks );
if ( $post_ids ) {
_prime_post_caches( $post_ids, false, false );
}
return $inner_blocks;
}
/**
* Gets the name of the current navigation, if it has one.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return string Returns the name of the navigation.
*/
private static function get_navigation_name( $attributes ) {
$navigation_name = $attributes['ariaLabel'] ?? '';
if ( ! empty( $navigation_name ) ) {
return $navigation_name;
}
// Load the navigation post.
if ( array_key_exists( 'ref', $attributes ) ) {
$navigation_post = get_post( $attributes['ref'] );
if ( ! isset( $navigation_post ) ) {
return $navigation_name;
}
// Only published posts are valid. If this is changed then a corresponding change
// must also be implemented in `use-navigation-menu.js`.
if ( 'publish' === $navigation_post->post_status ) {
$navigation_name = $navigation_post->post_title;
// This is used to count the number of times a navigation name has been seen,
// so that we can ensure every navigation has a unique id.
if ( isset( static::$seen_menu_names[ $navigation_name ] ) ) {
++static::$seen_menu_names[ $navigation_name ];
} else {
static::$seen_menu_names[ $navigation_name ] = 1;
}
}
}
return $navigation_name;
}
/**
* Returns the layout class for the navigation block.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return string Returns the layout class for the navigation block.
*/
private static function get_layout_class( $attributes ) {
$layout_justification = array(
'left' => 'items-justified-left',
'right' => 'items-justified-right',
'center' => 'items-justified-center',
'space-between' => 'items-justified-space-between',
);
$layout_class = '';
if (
isset( $attributes['layout']['justifyContent'] ) &&
isset( $layout_justification[ $attributes['layout']['justifyContent'] ] )
) {
$layout_class .= $layout_justification[ $attributes['layout']['justifyContent'] ];
}
if ( isset( $attributes['layout']['orientation'] ) && 'vertical' === $attributes['layout']['orientation'] ) {
$layout_class .= ' is-vertical';
}
if ( isset( $attributes['layout']['flexWrap'] ) && 'nowrap' === $attributes['layout']['flexWrap'] ) {
$layout_class .= ' no-wrap';
}
return $layout_class;
}
/**
* Return classes for the navigation block.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return string Returns the classes for the navigation block.
*/
private static function get_classes( $attributes ) {
// Restore legacy classnames for submenu positioning.
$layout_class = static::get_layout_class( $attributes );
$colors = block_core_navigation_build_css_colors( $attributes );
$font_sizes = block_core_navigation_build_css_font_sizes( $attributes );
$is_responsive_menu = static::is_responsive( $attributes );
// Manually add block support text decoration as CSS class.
$text_decoration = $attributes['style']['typography']['textDecoration'] ?? null;
$text_decoration_class = sprintf( 'has-text-decoration-%s', $text_decoration );
$classes = array_merge(
$colors['css_classes'],
$font_sizes['css_classes'],
$is_responsive_menu ? array( 'is-responsive' ) : array(),
$layout_class ? array( $layout_class ) : array(),
$text_decoration ? array( $text_decoration_class ) : array()
);
return implode( ' ', $classes );
}
/**
* Get styles for the navigation block.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return string Returns the styles for the navigation block.
*/
private static function get_styles( $attributes ) {
$colors = block_core_navigation_build_css_colors( $attributes );
$font_sizes = block_core_navigation_build_css_font_sizes( $attributes );
$block_styles = isset( $attributes['styles'] ) ? $attributes['styles'] : '';
return $block_styles . $colors['inline_styles'] . $font_sizes['inline_styles'];
}
/**
* Get the responsive container markup
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @param WP_Block_List $inner_blocks The list of inner blocks.
* @param string $inner_blocks_html The markup for the inner blocks.
* @return string Returns the container markup.
*/
private static function get_responsive_container_markup( $attributes, $inner_blocks, $inner_blocks_html ) {
$is_interactive = static::is_interactive( $attributes, $inner_blocks );
$colors = block_core_navigation_build_css_colors( $attributes );
$modal_unique_id = wp_unique_id( 'modal-' );
$is_hidden_by_default = isset( $attributes['overlayMenu'] ) && 'always' === $attributes['overlayMenu'];
$responsive_container_classes = array(
'wp-block-navigation__responsive-container',
$is_hidden_by_default ? 'hidden-by-default' : '',
implode( ' ', $colors['overlay_css_classes'] ),
);
$open_button_classes = array(
'wp-block-navigation__responsive-container-open',
$is_hidden_by_default ? 'always-shown' : '',
);
$should_display_icon_label = isset( $attributes['hasIcon'] ) && true === $attributes['hasIcon'];
$toggle_button_icon = '';
if ( isset( $attributes['icon'] ) ) {
if ( 'menu' === $attributes['icon'] ) {
$toggle_button_icon = '';
}
}
$toggle_button_content = $should_display_icon_label ? $toggle_button_icon : __( 'Menu' );
$toggle_close_button_icon = '';
$toggle_close_button_content = $should_display_icon_label ? $toggle_close_button_icon : __( 'Close' );
$toggle_aria_label_open = $should_display_icon_label ? 'aria-label="' . __( 'Open menu' ) . '"' : ''; // Open button label.
$toggle_aria_label_close = $should_display_icon_label ? 'aria-label="' . __( 'Close menu' ) . '"' : ''; // Close button label.
// Add Interactivity API directives to the markup if needed.
$open_button_directives = '';
$responsive_container_directives = '';
$responsive_dialog_directives = '';
$close_button_directives = '';
if ( $is_interactive ) {
$open_button_directives = '
data-wp-on--click="actions.openMenuOnClick"
data-wp-on--keydown="actions.handleMenuKeydown"
';
$responsive_container_directives = '
data-wp-class--has-modal-open="state.isMenuOpen"
data-wp-class--is-menu-open="state.isMenuOpen"
data-wp-watch="callbacks.initMenu"
data-wp-on--keydown="actions.handleMenuKeydown"
data-wp-on--focusout="actions.handleMenuFocusout"
tabindex="-1"
';
$responsive_dialog_directives = '
data-wp-bind--aria-modal="state.ariaModal"
data-wp-bind--aria-label="state.ariaLabel"
data-wp-bind--role="state.roleAttribute"
';
$close_button_directives = '
data-wp-on--click="actions.closeMenuOnClick"
';
$responsive_container_content_directives = '
data-wp-watch="callbacks.focusFirstElement"
';
}
$overlay_inline_styles = esc_attr( safecss_filter_attr( $colors['overlay_inline_styles'] ) );
return sprintf(
'
%2$s
',
esc_attr( $modal_unique_id ),
$inner_blocks_html,
$toggle_aria_label_open,
$toggle_aria_label_close,
esc_attr( trim( implode( ' ', $responsive_container_classes ) ) ),
esc_attr( trim( implode( ' ', $open_button_classes ) ) ),
( ! empty( $overlay_inline_styles ) ) ? "style=\"$overlay_inline_styles\"" : '',
$toggle_button_content,
$toggle_close_button_content,
$open_button_directives,
$responsive_container_directives,
$responsive_dialog_directives,
$close_button_directives,
$responsive_container_content_directives
);
}
/**
* Get the wrapper attributes
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @param WP_Block_List $inner_blocks A list of inner blocks.
* @return string Returns the navigation block markup.
*/
private static function get_nav_wrapper_attributes( $attributes, $inner_blocks ) {
$nav_menu_name = static::get_unique_navigation_name( $attributes );
$is_interactive = static::is_interactive( $attributes, $inner_blocks );
$is_responsive_menu = static::is_responsive( $attributes );
$style = static::get_styles( $attributes );
$class = static::get_classes( $attributes );
$extra_attributes = array(
'class' => $class,
'style' => $style,
);
if ( ! empty( $nav_menu_name ) ) {
$extra_attributes['aria-label'] = $nav_menu_name;
}
$wrapper_attributes = get_block_wrapper_attributes( $extra_attributes );
if ( $is_responsive_menu ) {
$nav_element_directives = static::get_nav_element_directives( $is_interactive );
$wrapper_attributes .= ' ' . $nav_element_directives;
}
return $wrapper_attributes;
}
/**
* Gets the nav element directives.
*
* @since 6.5.0
*
* @param bool $is_interactive Whether the block is interactive.
* @return string the directives for the navigation element.
*/
private static function get_nav_element_directives( $is_interactive ) {
if ( ! $is_interactive ) {
return '';
}
// When adding to this array be mindful of security concerns.
$nav_element_context = wp_interactivity_data_wp_context(
array(
'overlayOpenedBy' => array(
'click' => false,
'hover' => false,
'focus' => false,
),
'type' => 'overlay',
'roleAttribute' => '',
'ariaLabel' => __( 'Menu' ),
)
);
$nav_element_directives = '
data-wp-interactive="core/navigation" '
. $nav_element_context;
return $nav_element_directives;
}
/**
* Handle view script module loading.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @param WP_Block $block The parsed block.
* @param WP_Block_List $inner_blocks The list of inner blocks.
*/
private static function handle_view_script_module_loading( $attributes, $block, $inner_blocks ) {
if ( static::is_interactive( $attributes, $inner_blocks ) ) {
wp_enqueue_script_module( '@wordpress/block-library/navigation/view' );
}
}
/**
* Returns the markup for the navigation block.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @param WP_Block_List $inner_blocks The list of inner blocks.
* @return string Returns the navigation wrapper markup.
*/
private static function get_wrapper_markup( $attributes, $inner_blocks ) {
$inner_blocks_html = static::get_inner_blocks_html( $attributes, $inner_blocks );
if ( static::is_responsive( $attributes ) ) {
return static::get_responsive_container_markup( $attributes, $inner_blocks, $inner_blocks_html );
}
return $inner_blocks_html;
}
/**
* Returns a unique name for the navigation.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return string Returns a unique name for the navigation.
*/
private static function get_unique_navigation_name( $attributes ) {
$nav_menu_name = static::get_navigation_name( $attributes );
// If the menu name has been used previously then append an ID
// to the name to ensure uniqueness across a given post.
if ( isset( static::$seen_menu_names[ $nav_menu_name ] ) && static::$seen_menu_names[ $nav_menu_name ] > 1 ) {
$count = static::$seen_menu_names[ $nav_menu_name ];
$nav_menu_name = $nav_menu_name . ' ' . ( $count );
}
return $nav_menu_name;
}
/**
* Renders the navigation block.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @param string $content The saved content.
* @param WP_Block $block The parsed block.
* @return string Returns the navigation block markup.
*/
public static function render( $attributes, $content, $block ) {
/**
* Deprecated:
* The rgbTextColor and rgbBackgroundColor attributes
* have been deprecated in favor of
* customTextColor and customBackgroundColor ones.
* Move the values from old attrs to the new ones.
*/
if ( isset( $attributes['rgbTextColor'] ) && empty( $attributes['textColor'] ) ) {
$attributes['customTextColor'] = $attributes['rgbTextColor'];
}
if ( isset( $attributes['rgbBackgroundColor'] ) && empty( $attributes['backgroundColor'] ) ) {
$attributes['customBackgroundColor'] = $attributes['rgbBackgroundColor'];
}
unset( $attributes['rgbTextColor'], $attributes['rgbBackgroundColor'] );
$inner_blocks = static::get_inner_blocks( $attributes, $block );
// Prevent navigation blocks referencing themselves from rendering.
if ( block_core_navigation_block_contains_core_navigation( $inner_blocks ) ) {
return '';
}
static::handle_view_script_module_loading( $attributes, $block, $inner_blocks );
return sprintf(
'',
static::get_nav_wrapper_attributes( $attributes, $inner_blocks ),
static::get_wrapper_markup( $attributes, $inner_blocks )
);
}
}
// These functions are used for the __unstableLocation feature and only active
// when the gutenberg plugin is active.
if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
/**
* Returns the menu items for a WordPress menu location.
*
* @since 5.9.0
*
* @param string $location The menu location.
* @return array Menu items for the location.
*/
function block_core_navigation_get_menu_items_at_location( $location ) {
if ( empty( $location ) ) {
return;
}
// Build menu data. The following approximates the code in
// `wp_nav_menu()` and `gutenberg_output_block_nav_menu`.
// Find the location in the list of locations, returning early if the
// location can't be found.
$locations = get_nav_menu_locations();
if ( ! isset( $locations[ $location ] ) ) {
return;
}
// Get the menu from the location, returning early if there is no
// menu or there was an error.
$menu = wp_get_nav_menu_object( $locations[ $location ] );
if ( ! $menu || is_wp_error( $menu ) ) {
return;
}
$menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'update_post_term_cache' => false ) );
_wp_menu_item_classes_by_context( $menu_items );
return $menu_items;
}
/**
* Sorts a standard array of menu items into a nested structure keyed by the
* id of the parent menu.
*
* @since 5.9.0
*
* @param array $menu_items Menu items to sort.
* @return array An array keyed by the id of the parent menu where each element
* is an array of menu items that belong to that parent.
*/
function block_core_navigation_sort_menu_items_by_parent_id( $menu_items ) {
$sorted_menu_items = array();
foreach ( (array) $menu_items as $menu_item ) {
$sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
}
unset( $menu_items, $menu_item );
$menu_items_by_parent_id = array();
foreach ( $sorted_menu_items as $menu_item ) {
$menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
}
return $menu_items_by_parent_id;
}
/**
* Gets the inner blocks for the navigation block from the unstable location attribute.
*
* @since 6.5.0
*
* @param array $attributes The block attributes.
* @return WP_Block_List Returns the inner blocks for the navigation block.
*/
function block_core_navigation_get_inner_blocks_from_unstable_location( $attributes ) {
$menu_items = block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] );
if ( empty( $menu_items ) ) {
return new WP_Block_List( array(), $attributes );
}
$menu_items_by_parent_id = block_core_navigation_sort_menu_items_by_parent_id( $menu_items );
$parsed_blocks = block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[0], $menu_items_by_parent_id );
return new WP_Block_List( $parsed_blocks, $attributes );
}
}
/**
* Add Interactivity API directives to the navigation-submenu and page-list
* blocks markup using the Tag Processor.
*
* @since 6.3.0
*
* @param WP_HTML_Tag_Processor $tags Markup of the navigation block.
* @param array $block_attributes Block attributes.
*
* @return string Submenu markup with the directives injected.
*/
function block_core_navigation_add_directives_to_submenu( $tags, $block_attributes ) {
while ( $tags->next_tag(
array(
'tag_name' => 'LI',
'class_name' => 'has-child',
)
) ) {
// Add directives to the parent `
`.
$tags->set_attribute( 'data-wp-interactive', 'core/navigation' );
$tags->set_attribute( 'data-wp-context', '{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu", "modal": null, "previousFocus": null }' );
$tags->set_attribute( 'data-wp-watch', 'callbacks.initMenu' );
$tags->set_attribute( 'data-wp-on--focusout', 'actions.handleMenuFocusout' );
$tags->set_attribute( 'data-wp-on--keydown', 'actions.handleMenuKeydown' );
// This is a fix for Safari. Without it, Safari doesn't change the active
// element when the user clicks on a button. It can be removed once we add
// an overlay to capture the clicks, instead of relying on the focusout
// event.
$tags->set_attribute( 'tabindex', '-1' );
if ( ! isset( $block_attributes['openSubmenusOnClick'] ) || false === $block_attributes['openSubmenusOnClick'] ) {
$tags->set_attribute( 'data-wp-on--mouseenter', 'actions.openMenuOnHover' );
$tags->set_attribute( 'data-wp-on--mouseleave', 'actions.closeMenuOnHover' );
}
// Add directives to the toggle submenu button.
if ( $tags->next_tag(
array(
'tag_name' => 'BUTTON',
'class_name' => 'wp-block-navigation-submenu__toggle',
)
) ) {
$tags->set_attribute( 'data-wp-on--click', 'actions.toggleMenuOnClick' );
$tags->set_attribute( 'data-wp-bind--aria-expanded', 'state.isMenuOpen' );
// The `aria-expanded` attribute for SSR is already added in the submenu block.
}
// Add directives to the submenu.
if ( $tags->next_tag(
array(
'tag_name' => 'UL',
'class_name' => 'wp-block-navigation__submenu-container',
)
) ) {
$tags->set_attribute( 'data-wp-on--focus', 'actions.openMenuOnFocus' );
}
// Iterate through subitems if exist.
block_core_navigation_add_directives_to_submenu( $tags, $block_attributes );
}
return $tags->get_updated_html();
}
/**
* Build an array with CSS classes and inline styles defining the colors
* which will be applied to the navigation markup in the front-end.
*
* @since 5.9.0
*
* @param array $attributes Navigation block attributes.
*
* @return array Colors CSS classes and inline styles.
*/
function block_core_navigation_build_css_colors( $attributes ) {
$colors = array(
'css_classes' => array(),
'inline_styles' => '',
'overlay_css_classes' => array(),
'overlay_inline_styles' => '',
);
// Text color.
$has_named_text_color = array_key_exists( 'textColor', $attributes );
$has_custom_text_color = array_key_exists( 'customTextColor', $attributes );
// If has text color.
if ( $has_custom_text_color || $has_named_text_color ) {
// Add has-text-color class.
$colors['css_classes'][] = 'has-text-color';
}
if ( $has_named_text_color ) {
// Add the color class.
$colors['css_classes'][] = sprintf( 'has-%s-color', $attributes['textColor'] );
} elseif ( $has_custom_text_color ) {
// Add the custom color inline style.
$colors['inline_styles'] .= sprintf( 'color: %s;', $attributes['customTextColor'] );
}
// Background color.
$has_named_background_color = array_key_exists( 'backgroundColor', $attributes );
$has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
// If has background color.
if ( $has_custom_background_color || $has_named_background_color ) {
// Add has-background class.
$colors['css_classes'][] = 'has-background';
}
if ( $has_named_background_color ) {
// Add the background-color class.
$colors['css_classes'][] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
} elseif ( $has_custom_background_color ) {
// Add the custom background-color inline style.
$colors['inline_styles'] .= sprintf( 'background-color: %s;', $attributes['customBackgroundColor'] );
}
// Overlay text color.
$has_named_overlay_text_color = array_key_exists( 'overlayTextColor', $attributes );
$has_custom_overlay_text_color = array_key_exists( 'customOverlayTextColor', $attributes );
// If has overlay text color.
if ( $has_custom_overlay_text_color || $has_named_overlay_text_color ) {
// Add has-text-color class.
$colors['overlay_css_classes'][] = 'has-text-color';
}
if ( $has_named_overlay_text_color ) {
// Add the overlay color class.
$colors['overlay_css_classes'][] = sprintf( 'has-%s-color', $attributes['overlayTextColor'] );
} elseif ( $has_custom_overlay_text_color ) {
// Add the custom overlay color inline style.
$colors['overlay_inline_styles'] .= sprintf( 'color: %s;', $attributes['customOverlayTextColor'] );
}
// Overlay background color.
$has_named_overlay_background_color = array_key_exists( 'overlayBackgroundColor', $attributes );
$has_custom_overlay_background_color = array_key_exists( 'customOverlayBackgroundColor', $attributes );
// If has overlay background color.
if ( $has_custom_overlay_background_color || $has_named_overlay_background_color ) {
// Add has-background class.
$colors['overlay_css_classes'][] = 'has-background';
}
if ( $has_named_overlay_background_color ) {
// Add the overlay background-color class.
$colors['overlay_css_classes'][] = sprintf( 'has-%s-background-color', $attributes['overlayBackgroundColor'] );
} elseif ( $has_custom_overlay_background_color ) {
// Add the custom overlay background-color inline style.
$colors['overlay_inline_styles'] .= sprintf( 'background-color: %s;', $attributes['customOverlayBackgroundColor'] );
}
return $colors;
}
/**
* Build an array with CSS classes and inline styles defining the font sizes
* which will be applied to the navigation markup in the front-end.
*
* @since 5.9.0
*
* @param array $attributes Navigation block attributes.
*
* @return array Font size CSS classes and inline styles.
*/
function block_core_navigation_build_css_font_sizes( $attributes ) {
// CSS classes.
$font_sizes = array(
'css_classes' => array(),
'inline_styles' => '',
);
$has_named_font_size = array_key_exists( 'fontSize', $attributes );
$has_custom_font_size = array_key_exists( 'customFontSize', $attributes );
if ( $has_named_font_size ) {
// Add the font size class.
$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $attributes['fontSize'] );
} elseif ( $has_custom_font_size ) {
// Add the custom font size inline style.
$font_sizes['inline_styles'] = sprintf( 'font-size: %spx;', $attributes['customFontSize'] );
}
return $font_sizes;
}
/**
* Returns the top-level submenu SVG chevron icon.
*
* @since 5.9.0
*
* @return string
*/
function block_core_navigation_render_submenu_icon() {
return '';
}
/**
* Filter out empty "null" blocks from the block list.
* 'parse_blocks' includes a null block with '\n\n' as the content when
* it encounters whitespace. This is not a bug but rather how the parser
* is designed.
*
* @since 5.9.0
*
* @param array $parsed_blocks the parsed blocks to be normalized.
* @return array the normalized parsed blocks.
*/
function block_core_navigation_filter_out_empty_blocks( $parsed_blocks ) {
$filtered = array_filter(
$parsed_blocks,
static function ( $block ) {
return isset( $block['blockName'] );
}
);
// Reset keys.
return array_values( $filtered );
}
/**
* Returns true if the navigation block contains a nested navigation block.
*
* @since 6.2.0
*
* @param WP_Block_List $inner_blocks Inner block instance to be normalized.
* @return bool true if the navigation block contains a nested navigation block.
*/
function block_core_navigation_block_contains_core_navigation( $inner_blocks ) {
foreach ( $inner_blocks as $block ) {
if ( 'core/navigation' === $block->name ) {
return true;
}
if ( $block->inner_blocks && block_core_navigation_block_contains_core_navigation( $block->inner_blocks ) ) {
return true;
}
}
return false;
}
/**
* Retrieves the appropriate fallback to be used on the front of the
* site when there is no menu assigned to the Nav block.
*
* This aims to mirror how the fallback mechanic for wp_nav_menu works.
* See https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information.
*
* @since 5.9.0
*
* @return array the array of blocks to be used as a fallback.
*/
function block_core_navigation_get_fallback_blocks() {
$page_list_fallback = array(
array(
'blockName' => 'core/page-list',
'innerContent' => array(),
'attrs' => array(),
),
);
$registry = WP_Block_Type_Registry::get_instance();
// If `core/page-list` is not registered then return empty blocks.
$fallback_blocks = $registry->is_registered( 'core/page-list' ) ? $page_list_fallback : array();
$navigation_post = WP_Navigation_Fallback::get_fallback();
// Use the first non-empty Navigation as fallback if available.
if ( $navigation_post ) {
$parsed_blocks = parse_blocks( $navigation_post->post_content );
$maybe_fallback = block_core_navigation_filter_out_empty_blocks( $parsed_blocks );
// Normalizing blocks may result in an empty array of blocks if they were all `null` blocks.
// In this case default to the (Page List) fallback.
$fallback_blocks = ! empty( $maybe_fallback ) ? $maybe_fallback : $fallback_blocks;
// Run Block Hooks algorithm to inject hooked blocks.
// We have to run it here because we need the post ID of the Navigation block to track ignored hooked blocks.
// TODO: See if we can move the apply_block_hooks_to_content_from_post_object() call
// before the parse_blocks() call further above, to avoid the extra serialization/parsing.
$markup = serialize_blocks( $fallback_blocks );
$markup = apply_block_hooks_to_content_from_post_object( $markup, $navigation_post );
$fallback_blocks = parse_blocks( $markup );
}
/**
* Filters the fallback experience for the Navigation block.
*
* Returning a falsey value will opt out of the fallback and cause the block not to render.
* To customise the blocks provided return an array of blocks - these should be valid
* children of the `core/navigation` block.
*
* @since 5.9.0
*
* @param array[] $fallback_blocks default fallback blocks provided by the default block mechanic.
*/
return apply_filters( 'block_core_navigation_render_fallback', $fallback_blocks );
}
/**
* Iterate through all inner blocks recursively and get navigation link block's post IDs.
*
* @since 6.0.0
*
* @param WP_Block_List $inner_blocks Block list class instance.
*
* @return array Array of post IDs.
*/
function block_core_navigation_get_post_ids( $inner_blocks ) {
$post_ids = array_map( 'block_core_navigation_from_block_get_post_ids', iterator_to_array( $inner_blocks ) );
return array_unique( array_merge( ...$post_ids ) );
}
/**
* Get post IDs from a navigation link block instance.
*
* @since 6.0.0
*
* @param WP_Block $block Instance of a block.
*
* @return array Array of post IDs.
*/
function block_core_navigation_from_block_get_post_ids( $block ) {
$post_ids = array();
if ( $block->inner_blocks ) {
$post_ids = block_core_navigation_get_post_ids( $block->inner_blocks );
}
if ( 'core/navigation-link' === $block->name || 'core/navigation-submenu' === $block->name ) {
if ( $block->attributes && isset( $block->attributes['kind'] ) && 'post-type' === $block->attributes['kind'] && isset( $block->attributes['id'] ) ) {
$post_ids[] = $block->attributes['id'];
}
}
return $post_ids;
}
/**
* Renders the `core/navigation` block on server.
*
* @since 5.9.0
*
* @param array $attributes The block attributes.
* @param string $content The saved content.
* @param WP_Block $block The parsed block.
*
* @return string Returns the navigation block markup.
*/
function render_block_core_navigation( $attributes, $content, $block ) {
return WP_Navigation_Block_Renderer::render( $attributes, $content, $block );
}
/**
* Register the navigation block.
*
* @since 5.9.0
*
* @uses render_block_core_navigation()
* @throws WP_Error An WP_Error exception parsing the block definition.
*/
function register_block_core_navigation() {
register_block_type_from_metadata(
__DIR__ . '/navigation',
array(
'render_callback' => 'render_block_core_navigation',
)
);
}
add_action( 'init', 'register_block_core_navigation' );
/**
* Filter that changes the parsed attribute values of navigation blocks contain typographic presets to contain the values directly.
*
* @since 5.9.0
*
* @param array $parsed_block The block being rendered.
*
* @return array The block being rendered without typographic presets.
*/
function block_core_navigation_typographic_presets_backcompatibility( $parsed_block ) {
if ( 'core/navigation' === $parsed_block['blockName'] ) {
$attribute_to_prefix_map = array(
'fontStyle' => 'var:preset|font-style|',
'fontWeight' => 'var:preset|font-weight|',
'textDecoration' => 'var:preset|text-decoration|',
'textTransform' => 'var:preset|text-transform|',
);
foreach ( $attribute_to_prefix_map as $style_attribute => $prefix ) {
if ( ! empty( $parsed_block['attrs']['style']['typography'][ $style_attribute ] ) ) {
$prefix_len = strlen( $prefix );
$attribute_value = &$parsed_block['attrs']['style']['typography'][ $style_attribute ];
if ( 0 === strncmp( $attribute_value, $prefix, $prefix_len ) ) {
$attribute_value = substr( $attribute_value, $prefix_len );
}
if ( 'textDecoration' === $style_attribute && 'strikethrough' === $attribute_value ) {
$attribute_value = 'line-through';
}
}
}
}
return $parsed_block;
}
add_filter( 'render_block_data', 'block_core_navigation_typographic_presets_backcompatibility' );
/**
* Turns menu item data into a nested array of parsed blocks
*
* @since 5.9.0
*
* @deprecated 6.3.0 Use WP_Navigation_Fallback::parse_blocks_from_menu_items() instead.
*
* @param array $menu_items An array of menu items that represent
* an individual level of a menu.
* @param array $menu_items_by_parent_id An array keyed by the id of the
* parent menu where each element is an
* array of menu items that belong to
* that parent.
* @return array An array of parsed block data.
*/
function block_core_navigation_parse_blocks_from_menu_items( $menu_items, $menu_items_by_parent_id ) {
_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::parse_blocks_from_menu_items' );
if ( empty( $menu_items ) ) {
return array();
}
$blocks = array();
foreach ( $menu_items as $menu_item ) {
$class_name = ! empty( $menu_item->classes ) ? implode( ' ', (array) $menu_item->classes ) : null;
$id = ( null !== $menu_item->object_id && 'custom' !== $menu_item->object ) ? $menu_item->object_id : null;
$opens_in_new_tab = null !== $menu_item->target && '_blank' === $menu_item->target;
$rel = ( null !== $menu_item->xfn && '' !== $menu_item->xfn ) ? $menu_item->xfn : null;
$kind = null !== $menu_item->type ? str_replace( '_', '-', $menu_item->type ) : 'custom';
$block = array(
'blockName' => isset( $menu_items_by_parent_id[ $menu_item->ID ] ) ? 'core/navigation-submenu' : 'core/navigation-link',
'attrs' => array(
'className' => $class_name,
'description' => $menu_item->description,
'id' => $id,
'kind' => $kind,
'label' => $menu_item->title,
'opensInNewTab' => $opens_in_new_tab,
'rel' => $rel,
'title' => $menu_item->attr_title,
'type' => $menu_item->object,
'url' => $menu_item->url,
),
);
$block['innerBlocks'] = isset( $menu_items_by_parent_id[ $menu_item->ID ] )
? block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[ $menu_item->ID ], $menu_items_by_parent_id )
: array();
$block['innerContent'] = array_map( 'serialize_block', $block['innerBlocks'] );
$blocks[] = $block;
}
return $blocks;
}
/**
* Get the classic navigation menu to use as a fallback.
*
* @since 6.2.0
*
* @deprecated 6.3.0 Use WP_Navigation_Fallback::get_classic_menu_fallback() instead.
*
* @return object WP_Term The classic navigation.
*/
function block_core_navigation_get_classic_menu_fallback() {
_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_classic_menu_fallback' );
$classic_nav_menus = wp_get_nav_menus();
// If menus exist.
if ( $classic_nav_menus && ! is_wp_error( $classic_nav_menus ) ) {
// Handles simple use case where user has a classic menu and switches to a block theme.
// Returns the menu assigned to location `primary`.
$locations = get_nav_menu_locations();
if ( isset( $locations['primary'] ) ) {
$primary_menu = wp_get_nav_menu_object( $locations['primary'] );
if ( $primary_menu ) {
return $primary_menu;
}
}
// Returns a menu if `primary` is its slug.
foreach ( $classic_nav_menus as $classic_nav_menu ) {
if ( 'primary' === $classic_nav_menu->slug ) {
return $classic_nav_menu;
}
}
// Otherwise return the most recently created classic menu.
usort(
$classic_nav_menus,
static function ( $a, $b ) {
return $b->term_id - $a->term_id;
}
);
return $classic_nav_menus[0];
}
}
/**
* Converts a classic navigation to blocks.
*
* @since 6.2.0
*
* @deprecated 6.3.0 Use WP_Navigation_Fallback::get_classic_menu_fallback_blocks() instead.
*
* @param object $classic_nav_menu WP_Term The classic navigation object to convert.
* @return array the normalized parsed blocks.
*/
function block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ) {
_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_classic_menu_fallback_blocks' );
// BEGIN: Code that already exists in wp_nav_menu().
$menu_items = wp_get_nav_menu_items( $classic_nav_menu->term_id, array( 'update_post_term_cache' => false ) );
// Set up the $menu_item variables.
_wp_menu_item_classes_by_context( $menu_items );
$sorted_menu_items = array();
foreach ( (array) $menu_items as $menu_item ) {
$sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
}
unset( $menu_items, $menu_item );
// END: Code that already exists in wp_nav_menu().
$menu_items_by_parent_id = array();
foreach ( $sorted_menu_items as $menu_item ) {
$menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
}
$inner_blocks = block_core_navigation_parse_blocks_from_menu_items(
isset( $menu_items_by_parent_id[0] )
? $menu_items_by_parent_id[0]
: array(),
$menu_items_by_parent_id
);
return serialize_blocks( $inner_blocks );
}
/**
* If there's a classic menu then use it as a fallback.
*
* @since 6.2.0
*
* @deprecated 6.3.0 Use WP_Navigation_Fallback::create_classic_menu_fallback() instead.
*
* @return array the normalized parsed blocks.
*/
function block_core_navigation_maybe_use_classic_menu_fallback() {
_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::create_classic_menu_fallback' );
// See if we have a classic menu.
$classic_nav_menu = block_core_navigation_get_classic_menu_fallback();
if ( ! $classic_nav_menu ) {
return;
}
// If we have a classic menu then convert it to blocks.
$classic_nav_menu_blocks = block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu );
if ( empty( $classic_nav_menu_blocks ) ) {
return;
}
// Create a new navigation menu from the classic menu.
$wp_insert_post_result = wp_insert_post(
array(
'post_content' => $classic_nav_menu_blocks,
'post_title' => $classic_nav_menu->name,
'post_name' => $classic_nav_menu->slug,
'post_status' => 'publish',
'post_type' => 'wp_navigation',
),
true // So that we can check whether the result is an error.
);
if ( is_wp_error( $wp_insert_post_result ) ) {
return;
}
// Fetch the most recently published navigation which will be the classic one created above.
return block_core_navigation_get_most_recently_published_navigation();
}
/**
* Finds the most recently published `wp_navigation` Post.
*
* @since 6.1.0
*
* @deprecated 6.3.0 Use WP_Navigation_Fallback::get_most_recently_published_navigation() instead.
*
* @return WP_Post|null the first non-empty Navigation or null.
*/
function block_core_navigation_get_most_recently_published_navigation() {
_deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_most_recently_published_navigation' );
// Default to the most recently created menu.
$parsed_args = array(
'post_type' => 'wp_navigation',
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
'order' => 'DESC',
'orderby' => 'date',
'post_status' => 'publish',
'posts_per_page' => 1, // get only the most recent.
);
$navigation_post = new WP_Query( $parsed_args );
if ( count( $navigation_post->posts ) > 0 ) {
return $navigation_post->posts[0];
}
return null;
}
query-pagination/style.min.css 0000644 00000001374 15143517315 0012506 0 ustar 00 .wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination.aligncenter{justify-content:center} query-pagination/editor.min.css 0000644 00000000373 15143517315 0012632 0 ustar 00 .wp-block[data-align=center]>.wp-block-query-pagination{justify-content:center}:where(.editor-styles-wrapper) .wp-block-query-pagination{max-width:100%}:where(.editor-styles-wrapper) .wp-block-query-pagination.block-editor-block-list__layout{margin:0} query-pagination/style-rtl.min.css 0000644 00000001376 15143517315 0013307 0 ustar 00 .wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-query-pagination.aligncenter{justify-content:center} query-pagination/style.css 0000644 00000001453 15143517315 0011722 0 ustar 00 .wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{
margin-inline-start:auto;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{
margin-inline-end:auto;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{
display:inline-block;
margin-right:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){
transform:scaleX(1);
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow{
display:inline-block;
margin-left:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){
transform:scaleX(1);
}
.wp-block-query-pagination.aligncenter{
justify-content:center;
} query-pagination/style-rtl.css 0000644 00000001457 15143517315 0012525 0 ustar 00 .wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{
margin-inline-start:auto;
}
.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{
margin-inline-end:auto;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{
display:inline-block;
margin-left:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){
transform:scaleX(-1);;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow{
display:inline-block;
margin-right:1ch;
}
.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){
transform:scaleX(-1);;
}
.wp-block-query-pagination.aligncenter{
justify-content:center;
} query-pagination/editor-rtl.min.css 0000644 00000000373 15143517315 0013431 0 ustar 00 .wp-block[data-align=center]>.wp-block-query-pagination{justify-content:center}:where(.editor-styles-wrapper) .wp-block-query-pagination{max-width:100%}:where(.editor-styles-wrapper) .wp-block-query-pagination.block-editor-block-list__layout{margin:0} query-pagination/block.json 0000644 00000003053 15143517315 0012033 0 ustar 00 {
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "core/query-pagination",
"title": "Pagination",
"category": "theme",
"ancestor": [ "core/query" ],
"allowedBlocks": [
"core/query-pagination-previous",
"core/query-pagination-numbers",
"core/query-pagination-next"
],
"description": "Displays a paginated navigation to next/previous set of posts, when applicable.",
"textdomain": "default",
"attributes": {
"paginationArrow": {
"type": "string",
"default": "none"
},
"showLabel": {
"type": "boolean",
"default": true
}
},
"usesContext": [ "queryId", "query" ],
"providesContext": {
"paginationArrow": "paginationArrow",
"showLabel": "showLabel"
},
"supports": {
"align": true,
"reusable": false,
"html": false,
"color": {
"gradients": true,
"link": true,
"__experimentalDefaultControls": {
"background": true,
"text": true,
"link": true
}
},
"layout": {
"allowSwitching": false,
"allowInheriting": false,
"default": {
"type": "flex"
}
},
"typography": {
"fontSize": true,
"lineHeight": true,
"__experimentalFontFamily": true,
"__experimentalFontWeight": true,
"__experimentalFontStyle": true,
"__experimentalTextTransform": true,
"__experimentalTextDecoration": true,
"__experimentalLetterSpacing": true,
"__experimentalDefaultControls": {
"fontSize": true
}
},
"interactivity": {
"clientNavigation": true
}
},
"editorStyle": "wp-block-query-pagination-editor",
"style": "wp-block-query-pagination"
}
query-pagination/editor-rtl.css 0000644 00000000415 15143517315 0012644 0 ustar 00 .wp-block[data-align=center]>.wp-block-query-pagination{
justify-content:center;
}
:where(.editor-styles-wrapper) .wp-block-query-pagination{
max-width:100%;
}
:where(.editor-styles-wrapper) .wp-block-query-pagination.block-editor-block-list__layout{
margin:0;
} query-pagination/editor.css 0000644 00000000415 15143517315 0012045 0 ustar 00 .wp-block[data-align=center]>.wp-block-query-pagination{
justify-content:center;
}
:where(.editor-styles-wrapper) .wp-block-query-pagination{
max-width:100%;
}
:where(.editor-styles-wrapper) .wp-block-query-pagination.block-editor-block-list__layout{
margin:0;
} post-comments-form.php 0000644 00000005365 15143517315 0011044 0 ustar 00 context['postId'] ) ) {
return '';
}
if ( post_password_required( $block->context['postId'] ) ) {
return;
}
$classes = array( 'comment-respond' ); // See comment further below.
if ( isset( $attributes['textAlign'] ) ) {
$classes[] = 'has-text-align-' . $attributes['textAlign'];
}
if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
$classes[] = 'has-link-color';
}
$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );
add_filter( 'comment_form_defaults', 'post_comments_form_block_form_defaults' );
ob_start();
comment_form( array(), $block->context['postId'] );
$form = ob_get_clean();
remove_filter( 'comment_form_defaults', 'post_comments_form_block_form_defaults' );
// We use the outermost wrapping `` returned by `comment_form()`
// which is identified by its default classname `comment-respond` to inject
// our wrapper attributes. This way, it is guaranteed that all styling applied
// to the block is carried along when the comment form is moved to the location
// of the 'Reply' link that the user clicked by Core's `comment-reply.js` script.
$form = str_replace( 'class="comment-respond"', $wrapper_attributes, $form );
// Enqueue the comment-reply script.
wp_enqueue_script( 'comment-reply' );
return $form;
}
/**
* Registers the `core/post-comments-form` block on the server.
*
* @since 6.0.0
*/
function register_block_core_post_comments_form() {
register_block_type_from_metadata(
__DIR__ . '/post-comments-form',
array(
'render_callback' => 'render_block_core_post_comments_form',
)
);
}
add_action( 'init', 'register_block_core_post_comments_form' );
/**
* Use the button block classes for the form-submit button.
*
* @since 6.0.0
*
* @param array $fields The default comment form arguments.
*
* @return array Returns the modified fields.
*/
function post_comments_form_block_form_defaults( $fields ) {
if ( wp_is_block_theme() ) {
$fields['submit_button'] = '';
$fields['submit_field'] = '
%1$s %2$s
';
}
return $fields;
}
post-title.php 0000644 00000004132 15143517315 0007366 0 ustar 00 context['postId'] ) ) {
return '';
}
/**
* The `$post` argument is intentionally omitted so that changes are reflected when previewing a post.
* See: https://github.com/WordPress/gutenberg/pull/37622#issuecomment-1000932816.
*/
$title = get_the_title();
if ( ! $title ) {
return '';
}
$tag_name = 'h2';
if ( isset( $attributes['level'] ) ) {
$tag_name = 0 === $attributes['level'] ? 'p' : 'h' . (int) $attributes['level'];
}
if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) {
$rel = ! empty( $attributes['rel'] ) ? 'rel="' . esc_attr( $attributes['rel'] ) . '"' : '';
$title = sprintf( '%4$s', esc_url( get_the_permalink( $block->context['postId'] ) ), esc_attr( $attributes['linkTarget'] ), $rel, $title );
}
$classes = array();
if ( isset( $attributes['textAlign'] ) ) {
$classes[] = 'has-text-align-' . $attributes['textAlign'];
}
if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
$classes[] = 'has-link-color';
}
$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );
return sprintf(
'<%1$s %2$s>%3$s%1$s>',
$tag_name,
$wrapper_attributes,
$title
);
}
/**
* Registers the `core/post-title` block on the server.
*
* @since 5.8.0
*/
function register_block_core_post_title() {
register_block_type_from_metadata(
__DIR__ . '/post-title',
array(
'render_callback' => 'render_block_core_post_title',
)
);
}
add_action( 'init', 'register_block_core_post_title' );
site-tagline.php 0000644 00000002263 15143517315 0007652 0 ustar 00 $align_class_name ) );
if ( isset( $attributes['level'] ) && 0 !== $attributes['level'] ) {
$tag_name = 'h' . (int) $attributes['level'];
}
return sprintf(
'<%1$s %2$s>%3$s%1$s>',
$tag_name,
$wrapper_attributes,
$site_tagline
);
}
/**
* Registers the `core/site-tagline` block on the server.
*
* @since 5.8.0
*/
function register_block_core_site_tagline() {
register_block_type_from_metadata(
__DIR__ . '/site-tagline',
array(
'render_callback' => 'render_block_core_site_tagline',
)
);
}
add_action( 'init', 'register_block_core_site_tagline' );
query-no-results/block.json 0000644 00000001605 15143517315 0012016 0 ustar 00 {
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"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.",
"ancestor": [ "core/query" ],
"textdomain": "default",
"usesContext": [ "queryId", "query" ],
"supports": {
"align": true,
"reusable": false,
"html": false,
"color": {
"gradients": true,
"link": true
},
"typography": {
"fontSize": true,
"lineHeight": true,
"__experimentalFontFamily": true,
"__experimentalFontWeight": true,
"__experimentalFontStyle": true,
"__experimentalTextTransform": true,
"__experimentalTextDecoration": true,
"__experimentalLetterSpacing": true,
"__experimentalDefaultControls": {
"fontSize": true
}
},
"interactivity": {
"clientNavigation": true
}
}
}
spacer/style.min.css 0000644 00000000034 15143517315 0010457 0 ustar 00 .wp-block-spacer{clear:both} spacer/editor.min.css 0000644 00000001664 15143517315 0010617 0 ustar 00 .block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;height:100%;min-height:8px;min-width:8px;position:absolute;width:100%;z-index:1}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{background:#0000001a}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{background:#ffffff26}.block-library-spacer__resize-container{clear:both}.block-library-spacer__resize-container:not(.is-resizing){height:100%!important;width:100%!important}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.block-library-spacer__resize-container.resize-horizontal{height:100%!important;margin-bottom:0} spacer/style-rtl.min.css 0000644 00000000034 15143517315 0011256 0 ustar 00 .wp-block-spacer{clear:both} spacer/style.css 0000644 00000000041 15143517315 0007673 0 ustar 00 .wp-block-spacer{
clear:both;
} spacer/style-rtl.css 0000644 00000000041 15143517315 0010472 0 ustar 00 .wp-block-spacer{
clear:both;
} spacer/editor-rtl.min.css 0000644 00000001664 15143517315 0011416 0 ustar 00 .block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;height:100%;min-height:8px;min-width:8px;position:absolute;width:100%;z-index:1}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{background:#0000001a}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{background:#ffffff26}.block-library-spacer__resize-container{clear:both}.block-library-spacer__resize-container:not(.is-resizing){height:100%!important;width:100%!important}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.block-library-spacer__resize-container.resize-horizontal{height:100%!important;margin-bottom:0} spacer/block.json 0000644 00000001245 15143517315 0010015 0 ustar 00 {
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "core/spacer",
"title": "Spacer",
"category": "design",
"description": "Add white space between blocks and customize its height.",
"textdomain": "default",
"attributes": {
"height": {
"type": "string",
"default": "100px"
},
"width": {
"type": "string"
}
},
"usesContext": [ "orientation" ],
"supports": {
"anchor": true,
"spacing": {
"margin": [ "top", "bottom" ],
"__experimentalDefaultControls": {
"margin": true
}
},
"interactivity": {
"clientNavigation": true
}
},
"editorStyle": "wp-block-spacer-editor",
"style": "wp-block-spacer"
}
spacer/editor-rtl.css 0000644 00000001775 15143517315 0010637 0 ustar 00 .block-editor-block-list__block[data-type="core/spacer"]:before{
content:"";
display:block;
height:100%;
min-height:8px;
min-width:8px;
position:absolute;
width:100%;
z-index:1;
}
.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{
background:#0000001a;
}
.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{
background:#ffffff26;
}
.block-library-spacer__resize-container{
clear:both;
}
.block-library-spacer__resize-container:not(.is-resizing){
height:100% !important;
width:100% !important;
}
.block-library-spacer__resize-container .components-resizable-box__handle:before{
content:none;
}
.block-library-spacer__resize-container.resize-horizontal{
height:100% !important;
margin-bottom:0;
} spacer/editor.css 0000644 00000001775 15143517315 0010040 0 ustar 00 .block-editor-block-list__block[data-type="core/spacer"]:before{
content:"";
display:block;
height:100%;
min-height:8px;
min-width:8px;
position:absolute;
width:100%;
z-index:1;
}
.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{
background:#0000001a;
}
.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{
background:#ffffff26;
}
.block-library-spacer__resize-container{
clear:both;
}
.block-library-spacer__resize-container:not(.is-resizing){
height:100% !important;
width:100% !important;
}
.block-library-spacer__resize-container .components-resizable-box__handle:before{
content:none;
}
.block-library-spacer__resize-container.resize-horizontal{
height:100% !important;
margin-bottom:0;
} footnotes/style.min.css 0000644 00000000437 15143517315 0011231 0 ustar 00 .editor-styles-wrapper,.entry-content{counter-reset:footnotes}a[data-fn].fn{counter-increment:footnotes;display:inline-flex;font-size:smaller;text-decoration:none;text-indent:-9999999px;vertical-align:super}a[data-fn].fn:after{content:"[" counter(footnotes) "]";float:left;text-indent:0} footnotes/style-rtl.min.css 0000644 00000000440 15143517315 0012022 0 ustar 00 .editor-styles-wrapper,.entry-content{counter-reset:footnotes}a[data-fn].fn{counter-increment:footnotes;display:inline-flex;font-size:smaller;text-decoration:none;text-indent:-9999999px;vertical-align:super}a[data-fn].fn:after{content:"[" counter(footnotes) "]";float:right;text-indent:0} footnotes/style.css 0000644 00000000507 15143517315 0010445 0 ustar 00 .editor-styles-wrapper,.entry-content{
counter-reset:footnotes;
}
a[data-fn].fn{
counter-increment:footnotes;
display:inline-flex;
font-size:smaller;
text-decoration:none;
text-indent:-9999999px;
vertical-align:super;
}
a[data-fn].fn:after{
content:"[" counter(footnotes) "]";
float:left;
text-indent:0;
} footnotes/style-rtl.css 0000644 00000000510 15143517315 0011236 0 ustar 00 .editor-styles-wrapper,.entry-content{
counter-reset:footnotes;
}
a[data-fn].fn{
counter-increment:footnotes;
display:inline-flex;
font-size:smaller;
text-decoration:none;
text-indent:-9999999px;
vertical-align:super;
}
a[data-fn].fn:after{
content:"[" counter(footnotes) "]";
float:right;
text-indent:0;
} footnotes/block.json 0000644 00000002604 15143517315 0010560 0 ustar 00 {
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "core/footnotes",
"title": "Footnotes",
"category": "text",
"description": "Display footnotes added to the page.",
"keywords": [ "references" ],
"textdomain": "default",
"usesContext": [ "postId", "postType" ],
"supports": {
"__experimentalBorder": {
"radius": true,
"color": true,
"width": true,
"style": true,
"__experimentalDefaultControls": {
"radius": false,
"color": false,
"width": false,
"style": false
}
},
"color": {
"background": true,
"link": true,
"text": true,
"__experimentalDefaultControls": {
"link": true,
"text": true
}
},
"html": false,
"multiple": false,
"reusable": false,
"inserter": false,
"spacing": {
"margin": true,
"padding": true,
"__experimentalDefaultControls": {
"margin": false,
"padding": false
}
},
"typography": {
"fontSize": true,
"lineHeight": true,
"__experimentalFontFamily": true,
"__experimentalTextDecoration": true,
"__experimentalFontStyle": true,
"__experimentalFontWeight": true,
"__experimentalLetterSpacing": true,
"__experimentalTextTransform": true,
"__experimentalWritingMode": true,
"__experimentalDefaultControls": {
"fontSize": true
}
},
"interactivity": {
"clientNavigation": true
}
},
"style": "wp-block-footnotes"
}
page-list-item/block.json 0000644 00000002125 15143517315 0011357 0 ustar 00 {
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "core/page-list-item",
"title": "Page List Item",
"category": "widgets",
"parent": [ "core/page-list" ],
"description": "Displays a page inside a list of all pages.",
"keywords": [ "page", "menu", "navigation" ],
"textdomain": "default",
"attributes": {
"id": {
"type": "number"
},
"label": {
"type": "string"
},
"title": {
"type": "string"
},
"link": {
"type": "string"
},
"hasChildren": {
"type": "boolean"
}
},
"usesContext": [
"textColor",
"customTextColor",
"backgroundColor",
"customBackgroundColor",
"overlayTextColor",
"customOverlayTextColor",
"overlayBackgroundColor",
"customOverlayBackgroundColor",
"fontSize",
"customFontSize",
"showSubmenuIcon",
"style",
"openSubmenusOnClick"
],
"supports": {
"reusable": false,
"html": false,
"lock": false,
"inserter": false,
"__experimentalToolbar": false,
"interactivity": {
"clientNavigation": true
}
},
"editorStyle": "wp-block-page-list-editor",
"style": "wp-block-page-list"
}
post-date.php 0000644 00000007060 15143517315 0007165 0 ustar 00 'modified',
);
} else {
$source_args = array(
'field' => 'date',
);
}
$attributes['datetime'] = $source->get_value( $source_args, $block, 'datetime' );
}
if ( isset( $source_args['field'] ) && 'modified' === $source_args['field'] ) {
$classes[] = 'wp-block-post-date__modified-date';
}
if ( empty( $attributes['datetime'] ) ) {
// If the `datetime` attribute is set but empty, it could be because Block Bindings
// set it that way. This can happen e.g. if the block is bound to the
// post's last modified date, and the latter lies before the publish date.
// (See https://github.com/WordPress/gutenberg/pull/46839 where this logic was originally
// implemented.)
// In this case, we have to respect and return the empty value.
return '';
}
$unformatted_date = $attributes['datetime'];
$post_timestamp = strtotime( $unformatted_date );
if ( isset( $attributes['format'] ) && 'human-diff' === $attributes['format'] ) {
if ( $post_timestamp > time() ) {
// translators: %s: human-readable time difference.
$formatted_date = sprintf( __( '%s from now' ), human_time_diff( $post_timestamp ) );
} else {
// translators: %s: human-readable time difference.
$formatted_date = sprintf( __( '%s ago' ), human_time_diff( $post_timestamp ) );
}
} else {
$format = empty( $attributes['format'] ) ? get_option( 'date_format' ) : $attributes['format'];
$formatted_date = wp_date( $format, $post_timestamp );
}
if ( isset( $attributes['textAlign'] ) ) {
$classes[] = 'has-text-align-' . $attributes['textAlign'];
}
if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
$classes[] = 'has-link-color';
}
$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );
if ( isset( $attributes['isLink'] ) && $attributes['isLink'] && isset( $block->context['postId'] ) ) {
$formatted_date = sprintf( '%2s', get_the_permalink( $block->context['postId'] ), $formatted_date );
}
return sprintf(
'',
$wrapper_attributes,
$unformatted_date,
$formatted_date
);
}
/**
* Registers the `core/post-date` block on the server.
*
* @since 5.8.0
*/
function register_block_core_post_date() {
register_block_type_from_metadata(
__DIR__ . '/post-date',
array(
'render_callback' => 'render_block_core_post_date',
)
);
}
add_action( 'init', 'register_block_core_post_date' );
comment-template.php 0000644 00000010616 15143517315 0010541 0 ustar 00 comment_ID;
$filter_block_context = static function ( $context ) use ( $comment_id ) {
$context['commentId'] = $comment_id;
return $context;
};
/*
* We set commentId context through the `render_block_context` filter so
* that dynamically inserted blocks (at `render_block` filter stage)
* will also receive that context.
*
* Use an early priority to so that other 'render_block_context' filters
* have access to the values.
*/
add_filter( 'render_block_context', $filter_block_context, 1 );
/*
* We construct a new WP_Block instance from the parsed block so that
* it'll receive any changes made by the `render_block_data` filter.
*/
$block_content = ( new WP_Block( $block->parsed_block ) )->render( array( 'dynamic' => false ) );
remove_filter( 'render_block_context', $filter_block_context, 1 );
$children = $comment->get_children();
/*
* We need to create the CSS classes BEFORE recursing into the children.
* This is because comment_class() uses globals like `$comment_alt`
* and `$comment_thread_alt` which are order-sensitive.
*
* The `false` parameter at the end means that we do NOT want the function
* to `echo` the output but to return a string.
* See https://developer.wordpress.org/reference/functions/comment_class/#parameters.
*/
$comment_classes = comment_class( '', $comment->comment_ID, $comment->comment_post_ID, false );
// If the comment has children, recurse to create the HTML for the nested
// comments.
if ( ! empty( $children ) && ! empty( $thread_comments ) ) {
if ( $comment_depth < $thread_comments_depth ) {
++$comment_depth;
$inner_content = block_core_comment_template_render_comments(
$children,
$block
);
$block_content .= sprintf( '%1$s', $inner_content );
--$comment_depth;
} else {
$block_content .= block_core_comment_template_render_comments(
$children,
$block
);
}
}
$content .= sprintf( '
%3$s
', $comment->comment_ID, $comment_classes, $block_content );
}
return $content;
}
/**
* Renders the `core/comment-template` block on the server.
*
* @since 6.0.0
*
* @param array $attributes Block attributes.
* @param string $content Block default content.
* @param WP_Block $block Block instance.
*
* @return string Returns the HTML representing the comments using the layout
* defined by the block's inner blocks.
*/
function render_block_core_comment_template( $attributes, $content, $block ) {
// Bail out early if the post ID is not set for some reason.
if ( empty( $block->context['postId'] ) ) {
return '';
}
if ( post_password_required( $block->context['postId'] ) ) {
return;
}
$comment_query = new WP_Comment_Query(
build_comment_query_vars_from_block( $block )
);
// Get an array of comments for the current post.
$comments = $comment_query->get_comments();
if ( count( $comments ) === 0 ) {
return '';
}
$comment_order = get_option( 'comment_order' );
if ( 'desc' === $comment_order ) {
$comments = array_reverse( $comments );
}
$wrapper_attributes = get_block_wrapper_attributes();
return sprintf(
'%2$s',
$wrapper_attributes,
block_core_comment_template_render_comments( $comments, $block )
);
}
/**
* Registers the `core/comment-template` block on the server.
*
* @since 6.0.0
*/
function register_block_core_comment_template() {
register_block_type_from_metadata(
__DIR__ . '/comment-template',
array(
'render_callback' => 'render_block_core_comment_template',
'skip_inner_blocks' => true,
)
);
}
add_action( 'init', 'register_block_core_comment_template' );
post-template.php 0000644 00000013165 15143517315 0010066 0 ustar 00 name ) {
return true;
}
if (
'core/cover' === $block->name &&
! empty( $block->attributes['useFeaturedImage'] )
) {
return true;
}
if ( $block->inner_blocks && block_core_post_template_uses_featured_image( $block->inner_blocks ) ) {
return true;
}
}
return false;
}
/**
* Renders the `core/post-template` block on the server.
*
* @since 6.3.0 Changed render_block_context priority to `1`.
*
* @global WP_Query $wp_query WordPress Query object.
*
* @param array $attributes Block attributes.
* @param string $content Block default content.
* @param WP_Block $block Block instance.
*
* @return string Returns the output of the query, structured using the layout defined by the block's inner blocks.
*/
function render_block_core_post_template( $attributes, $content, $block ) {
$page_key = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page';
$enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination'];
$page = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ];
// Use global query if needed.
$use_global_query = ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] );
if ( $use_global_query ) {
global $wp_query;
/*
* If already in the main query loop, duplicate the query instance to not tamper with the main instance.
* Since this is a nested query, it should start at the beginning, therefore rewind posts.
* Otherwise, the main query loop has not started yet and this block is responsible for doing so.
*/
if ( in_the_loop() ) {
$query = clone $wp_query;
$query->rewind_posts();
} else {
$query = $wp_query;
}
} else {
$query_args = build_query_vars_from_query_block( $block, $page );
$query = new WP_Query( $query_args );
}
if ( ! $query->have_posts() ) {
return '';
}
if ( block_core_post_template_uses_featured_image( $block->inner_blocks ) ) {
update_post_thumbnail_cache( $query );
}
$classnames = '';
if ( isset( $block->context['displayLayout'] ) && isset( $block->context['query'] ) ) {
if ( isset( $block->context['displayLayout']['type'] ) && 'flex' === $block->context['displayLayout']['type'] ) {
$classnames = "is-flex-container columns-{$block->context['displayLayout']['columns']}";
}
}
if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) {
$classnames .= ' has-link-color';
}
// Ensure backwards compatibility by flagging the number of columns via classname when using grid layout.
if ( isset( $attributes['layout']['type'] ) && 'grid' === $attributes['layout']['type'] && ! empty( $attributes['layout']['columnCount'] ) ) {
$classnames .= ' ' . sanitize_title( 'columns-' . $attributes['layout']['columnCount'] );
}
$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => trim( $classnames ) ) );
$content = '';
while ( $query->have_posts() ) {
$query->the_post();
// Get an instance of the current Post Template block.
$block_instance = $block->parsed_block;
// Set the block name to one that does not correspond to an existing registered block.
// This ensures that for the inner instances of the Post Template block, we do not render any block supports.
$block_instance['blockName'] = 'core/null';
$post_id = get_the_ID();
$post_type = get_post_type();
$filter_block_context = static function ( $context ) use ( $post_id, $post_type ) {
$context['postType'] = $post_type;
$context['postId'] = $post_id;
return $context;
};
// Use an early priority to so that other 'render_block_context' filters have access to the values.
add_filter( 'render_block_context', $filter_block_context, 1 );
// Render the inner blocks of the Post Template block with `dynamic` set to `false` to prevent calling
// `render_callback` and ensure that no wrapper markup is included.
$block_content = ( new WP_Block( $block_instance ) )->render( array( 'dynamic' => false ) );
remove_filter( 'render_block_context', $filter_block_context, 1 );
// Wrap the render inner blocks in a `li` element with the appropriate post classes.
$post_classes = implode( ' ', get_post_class( 'wp-block-post' ) );
$inner_block_directives = $enhanced_pagination ? ' data-wp-key="post-template-item-' . $post_id . '"' : '';
$content .= '
' . $block_content . '
';
}
/*
* Use this function to restore the context of the template tags
* from a secondary query loop back to the main query loop.
* Since we use two custom loops, it's safest to always restore.
*/
wp_reset_postdata();
return sprintf(
'