File manager - Edit - /home/verseaumee/empowernetkenyajuly2026/blocks.zip
Back
PK 6�.]��[; avatar.phpnu �[��� <?php /** * Server-side rendering of the `core/avatar` block. * * @package WordPress */ /** * Renders the `core/avatar` 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 Return the avatar. */ function render_block_core_avatar( $attributes, $content, $block ) { $size = $attributes['size'] ?? 96; $wrapper_attributes = get_block_wrapper_attributes(); $border_attributes = get_block_core_avatar_border_attributes( $attributes ); // Class gets passed through `esc_attr` via `get_avatar`. $image_classes = ! empty( $border_attributes['class'] ) ? "wp-block-avatar__image {$border_attributes['class']}" : 'wp-block-avatar__image'; // Unlike class, `get_avatar` doesn't filter the styles via `esc_attr`. // The style engine does pass the border styles through // `safecss_filter_attr` however. $image_styles = ! empty( $border_attributes['style'] ) ? sprintf( ' style="%s"', esc_attr( $border_attributes['style'] ) ) : ''; if ( ! isset( $block->context['commentId'] ) ) { if ( isset( $attributes['userId'] ) ) { $author_id = $attributes['userId']; } elseif ( isset( $block->context['postId'] ) ) { $author_id = get_post_field( 'post_author', $block->context['postId'] ); } else { $author_id = get_query_var( 'author' ); } if ( empty( $author_id ) ) { return ''; } $author_name = get_the_author_meta( 'display_name', $author_id ); // translators: %s: Author name. $alt = sprintf( __( '%s Avatar' ), $author_name ); $avatar_block = get_avatar( $author_id, $size, '', $alt, array( 'extra_attr' => $image_styles, 'class' => $image_classes, ) ); if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) { $label = ''; if ( '_blank' === $attributes['linkTarget'] ) { // translators: %s is the Author name. $label = 'aria-label="' . esc_attr( sprintf( __( '(%s author archive, opens in a new tab)' ), $author_name ) ) . '"'; } // translators: 1: Author archive link. 2: Link target. %3$s Aria label. %4$s Avatar image. $avatar_block = sprintf( '<a href="%1$s" target="%2$s" %3$s class="wp-block-avatar__link">%4$s</a>', esc_url( get_author_posts_url( $author_id ) ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block ); } return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $avatar_block ); } $comment = get_comment( $block->context['commentId'] ); if ( ! $comment ) { return ''; } /* translators: %s: Author name. */ $alt = sprintf( __( '%s Avatar' ), $comment->comment_author ); $avatar_block = get_avatar( $comment, $size, '', $alt, array( 'extra_attr' => $image_styles, 'class' => $image_classes, ) ); if ( isset( $attributes['isLink'] ) && $attributes['isLink'] && isset( $comment->comment_author_url ) && '' !== $comment->comment_author_url ) { $label = ''; if ( '_blank' === $attributes['linkTarget'] ) { // translators: %s: Comment author name. $label = 'aria-label="' . esc_attr( sprintf( __( '(%s website link, opens in a new tab)' ), $comment->comment_author ) ) . '"'; } $avatar_block = sprintf( '<a href="%1$s" target="%2$s" %3$s class="wp-block-avatar__link">%4$s</a>', esc_url( $comment->comment_author_url ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block ); } return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $avatar_block ); } /** * Generates class names and styles to apply the border support styles for * the Avatar block. * * @since 6.3.0 * * @param array $attributes The block attributes. * @return array The border-related classnames and styles for the block. */ function get_block_core_avatar_border_attributes( $attributes ) { $border_styles = array(); $sides = array( 'top', 'right', 'bottom', 'left' ); // Border radius. if ( isset( $attributes['style']['border']['radius'] ) ) { $border_styles['radius'] = $attributes['style']['border']['radius']; } // Border style. if ( isset( $attributes['style']['border']['style'] ) ) { $border_styles['style'] = $attributes['style']['border']['style']; } // Border width. if ( isset( $attributes['style']['border']['width'] ) ) { $border_styles['width'] = $attributes['style']['border']['width']; } // Border color. $preset_color = array_key_exists( 'borderColor', $attributes ) ? "var:preset|color|{$attributes['borderColor']}" : null; $custom_color = $attributes['style']['border']['color'] ?? null; $border_styles['color'] = $preset_color ? $preset_color : $custom_color; // Individual border styles e.g. top, left etc. foreach ( $sides as $side ) { $border = $attributes['style']['border'][ $side ] ?? null; $border_styles[ $side ] = array( 'color' => $border['color'] ?? null, 'style' => $border['style'] ?? null, 'width' => $border['width'] ?? null, ); } $styles = wp_style_engine_get_styles( array( 'border' => $border_styles ) ); $attributes = array(); if ( ! empty( $styles['classnames'] ) ) { $attributes['class'] = $styles['classnames']; } if ( ! empty( $styles['css'] ) ) { $attributes['style'] = $styles['css']; } return $attributes; } /** * Registers the `core/avatar` block on the server. * * @since 6.0.0 */ function register_block_core_avatar() { register_block_type_from_metadata( __DIR__ . '/avatar', array( 'render_callback' => 'render_block_core_avatar', ) ); } add_action( 'init', 'register_block_core_avatar' ); PK 6�.]Hқ�� � latest-comments.phpnu �[��� <?php /** * Server-side rendering of the `core/latest-comments` block. * * @package WordPress */ /** * Get the post title. * * The post title is fetched and if it is blank then a default string is * returned. * * Copied from `wp-admin/includes/template.php`, but we can't include that * file because: * * 1. It causes bugs with test fixture generation and strange Docker 255 error * codes. * 2. It's in the admin; ideally we *shouldn't* be including files from the * admin for a block's output. It's a very small/simple function as well, * so duplicating it isn't too terrible. * * @since 3.3.0 * * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post. * @return string The post title if set; "(no title)" if no title is set. */ function wp_latest_comments_draft_or_post_title( $post = 0 ) { $title = get_the_title( $post ); if ( empty( $title ) ) { $title = __( '(no title)' ); } return $title; } /** * Renders the `core/latest-comments` block on server. * * @since 5.1.0 * * @param array $attributes The block attributes. * * @return string Returns the post content with latest comments added. */ function render_block_core_latest_comments( $attributes ) { // Handle backward compatibility: check for old displayExcerpt attribute if ( isset( $attributes['displayExcerpt'] ) ) { $display_content = $attributes['displayExcerpt'] ? 'excerpt' : 'none'; } else { $display_content = $attributes['displayContent'] ?? 'excerpt'; } $comments = get_comments( /** This filter is documented in wp-includes/widgets/class-wp-widget-recent-comments.php */ apply_filters( 'widget_comments_args', array( 'number' => $attributes['commentsToShow'], 'status' => 'approve', 'post_status' => 'publish', ), array() ) ); $list_items_markup = ''; if ( ! empty( $comments ) ) { // Prime the cache for associated posts. This is copied from \WP_Widget_Recent_Comments::widget(). $post_ids = array_unique( wp_list_pluck( $comments, 'comment_post_ID' ) ); _prime_post_caches( $post_ids, strpos( get_option( 'permalink_structure' ), '%category%' ), false ); foreach ( $comments as $comment ) { $list_items_markup .= '<li class="wp-block-latest-comments__comment">'; if ( $attributes['displayAvatar'] ) { $avatar = get_avatar( $comment, 48, '', '', array( 'class' => 'wp-block-latest-comments__comment-avatar', ) ); if ( $avatar ) { $list_items_markup .= $avatar; } } $list_items_markup .= '<article>'; $list_items_markup .= '<footer class="wp-block-latest-comments__comment-meta">'; $author_url = get_comment_author_url( $comment ); if ( empty( $author_url ) && ! empty( $comment->user_id ) ) { $author_url = get_author_posts_url( $comment->user_id ); } $author_markup = ''; if ( $author_url ) { $author_markup .= '<a class="wp-block-latest-comments__comment-author" href="' . esc_url( $author_url ) . '">' . get_comment_author( $comment ) . '</a>'; } else { $author_markup .= '<span class="wp-block-latest-comments__comment-author">' . get_comment_author( $comment ) . '</span>'; } // `_draft_or_post_title` calls `esc_html()` so we don't need to wrap that call in // `esc_html`. $post_title = '<a class="wp-block-latest-comments__comment-link" href="' . esc_url( get_comment_link( $comment ) ) . '">' . wp_latest_comments_draft_or_post_title( $comment->comment_post_ID ) . '</a>'; $list_items_markup .= sprintf( /* translators: 1: author name (inside <a> or <span> tag, based on if they have a URL), 2: post title related to this comment */ __( '%1$s on %2$s' ), $author_markup, $post_title ); if ( $attributes['displayDate'] ) { $list_items_markup .= sprintf( '<time datetime="%1$s" class="wp-block-latest-comments__comment-date">%2$s</time>', esc_attr( get_comment_date( 'c', $comment ) ), date_i18n( get_option( 'date_format' ), get_comment_date( 'U', $comment ) ) ); } $list_items_markup .= '</footer>'; if ( 'full' === $display_content ) { $comment_text = post_password_required( $comment->comment_post_ID ) ? __( 'Password protected' ) : get_comment_text( $comment ); $list_items_markup .= '<div class="wp-block-latest-comments__comment-excerpt">' . wpautop( $comment_text ) . '</div>'; } elseif ( 'excerpt' === $display_content ) { $list_items_markup .= '<div class="wp-block-latest-comments__comment-excerpt">' . wpautop( get_comment_excerpt( $comment ) ) . '</div>'; } $list_items_markup .= '</article></li>'; } } $classnames = array(); if ( $attributes['displayAvatar'] ) { $classnames[] = 'has-avatars'; } if ( $attributes['displayDate'] ) { $classnames[] = 'has-dates'; } if ( 'none' !== $display_content ) { $classnames[] = 'has-excerpts'; } if ( empty( $comments ) ) { $classnames[] = 'no-comments'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) ); return ! empty( $comments ) ? sprintf( '<ol %1$s>%2$s</ol>', $wrapper_attributes, $list_items_markup ) : sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, __( 'No comments to show.' ) ); } /** * Registers the `core/latest-comments` block. * * @since 5.3.0 */ function register_block_core_latest_comments() { register_block_type_from_metadata( __DIR__ . '/latest-comments', array( 'render_callback' => 'render_block_core_latest_comments', ) ); } add_action( 'init', 'register_block_core_latest_comments' ); PK 6�.]�uG@� � tab-panel.phpnu �[��� <?php /** * Tab Panel Block * * @package WordPress */ /** * Render callback for core/tab-panel. * * @since 7.1.0 * * @param array $attributes Block attributes. * @param string $content Block content. * @param \WP_Block $block Block instance. * * @return string Updated HTML. */ function block_core_tab_panel_render( array $attributes, string $content, \WP_Block $block ): string { $tabs_id = $block->context['core/tabs-id'] ?? ''; static $tab_counters = array(); if ( ! isset( $tab_counters[ $tabs_id ] ) ) { $tab_counters[ $tabs_id ] = 0; } $tab_index = $tab_counters[ $tabs_id ]; ++$tab_counters[ $tabs_id ]; $tag_processor = new WP_HTML_Tag_Processor( $content ); $tag_processor->next_tag( array( 'class_name' => 'wp-block-tab-panel' ) ); // Use the user's custom anchor if present, otherwise fall back to // the generated position-based ID. $tab_id = (string) $tag_processor->get_attribute( 'id' ); if ( empty( $tab_id ) ) { $tab_id = ! empty( $tabs_id ) ? $tabs_id . '-tab-' . $tab_index : 'tab-' . $tab_index; $tag_processor->set_attribute( 'id', $tab_id ); } $tag_processor->set_attribute( 'aria-labelledby', 'tab__' . $tab_id ); $tag_processor->set_attribute( 'data-wp-bind--hidden', '!state.isActiveTab' ); return (string) $tag_processor->get_updated_html(); } /** * Registers the `core/tab-panel` block on the server. * * @hook init * * @since 7.1.0 */ function register_block_core_tab_panel() { register_block_type_from_metadata( __DIR__ . '/tab-panel', array( 'render_callback' => 'block_core_tab_panel_render', ) ); } add_action( 'init', 'register_block_core_tab_panel' ); PK 6�.]��{ZH H site-title.phpnu &1i� <?php /** * Server-side rendering of the `core/site-title` block. * * @package WordPress */ /** * Renders the `core/site-title` block on the server. * * @since 5.8.0 * * @param array $attributes The block attributes. * * @return string The render. */ function render_block_core_site_title( $attributes ) { $site_title = get_bloginfo( 'name' ); if ( ! trim( $site_title ) ) { return ''; } $tag_name = 'h1'; $classes = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}"; if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes .= ' has-link-color'; } if ( isset( $attributes['level'] ) ) { $tag_name = 0 === $attributes['level'] ? 'p' : 'h' . (int) $attributes['level']; } if ( $attributes['isLink'] ) { $aria_current = ! is_paged() && ( is_front_page() || is_home() && ( (int) get_option( 'page_for_posts' ) !== get_queried_object_id() ) ) ? ' aria-current="page"' : ''; $link_target = ! empty( $attributes['linkTarget'] ) ? $attributes['linkTarget'] : '_self'; $site_title = sprintf( '<a href="%1$s" target="%2$s" rel="home"%3$s>%4$s</a>', esc_url( home_url() ), esc_attr( $link_target ), $aria_current, esc_html( $site_title ) ); } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => trim( $classes ) ) ); return sprintf( '<%1$s %2$s>%3$s</%1$s>', $tag_name, $wrapper_attributes, // already pre-escaped if it is a link. $attributes['isLink'] ? $site_title : esc_html( $site_title ) ); } /** * Registers the `core/site-title` block on the server. * * @since 5.8.0 */ function register_block_core_site_title() { register_block_type_from_metadata( __DIR__ . '/site-title', array( 'render_callback' => 'render_block_core_site_title', ) ); } add_action( 'init', 'register_block_core_site_title' ); PK 6�.]�>&� � comments-pagination-previous.phpnu &1i� <?php /** * Server-side rendering of the `core/comments-pagination-previous` block. * * @package WordPress */ /** * Renders the `core/comments-pagination-previous` 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 previous posts link for the comments pagination. */ function render_block_core_comments_pagination_previous( $attributes, $content, $block ) { $default_label = __( 'Older Comments' ); $label = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? $attributes['label'] : $default_label; $pagination_arrow = get_comments_pagination_arrow( $block, 'previous' ); if ( $pagination_arrow ) { $label = $pagination_arrow . $label; } $filter_link_attributes = static function () { return get_block_wrapper_attributes(); }; add_filter( 'previous_comments_link_attributes', $filter_link_attributes ); $comment_vars = build_comment_query_vars_from_block( $block ); $previous_comments_link = get_previous_comments_link( $label, $comment_vars['paged'] ?? null ); remove_filter( 'previous_comments_link_attributes', $filter_link_attributes ); if ( ! isset( $previous_comments_link ) ) { return ''; } return $previous_comments_link; } /** * Registers the `core/comments-pagination-previous` block on the server. * * @since 6.0.0 */ function register_block_core_comments_pagination_previous() { register_block_type_from_metadata( __DIR__ . '/comments-pagination-previous', array( 'render_callback' => 'render_block_core_comments_pagination_previous', ) ); } add_action( 'init', 'register_block_core_comments_pagination_previous' ); PK 6�.]2myqJ qJ breadcrumbs.phpnu �[��� <?php /** * Server-side rendering of the `core/breadcrumbs` block. * * @package WordPress */ /** * Renders the `core/breadcrumbs` block on the server. * * @since 7.0.0 * * @param array $attributes Block attributes. * @param string $content Block default content. * @param WP_Block $block Block instance. * * @return string Returns the post breadcrumb for hierarchical post types. */ function render_block_core_breadcrumbs( $attributes, $content, $block ) { $is_front_page = is_front_page(); if ( ! $attributes['showOnHomePage'] && $is_front_page ) { return ''; } $is_home = is_home(); $page_for_posts = get_option( 'page_for_posts' ); $breadcrumb_items = array(); if ( $attributes['showHomeItem'] ) { // We make `home` a link if not on front page, or if front page // is set to a custom page and is paged. if ( ! $is_front_page || ( 'page' === get_option( 'show_on_front' ) && (int) get_query_var( 'page' ) > 1 ) ) { $breadcrumb_items[] = array( 'label' => __( 'Home' ), 'url' => home_url( '/' ), ); } else { $breadcrumb_items[] = block_core_breadcrumbs_create_item( __( 'Home' ), block_core_breadcrumbs_is_paged() ); } } // Handle home. if ( $is_home ) { // These checks are explicitly nested in order not to execute the `else` branch. if ( $page_for_posts ) { $breadcrumb_items[] = block_core_breadcrumbs_create_item( block_core_breadcrumbs_get_post_title( $page_for_posts ), block_core_breadcrumbs_is_paged() ); } if ( block_core_breadcrumbs_is_paged() ) { $breadcrumb_items[] = block_core_breadcrumbs_create_page_number_item(); } } elseif ( $is_front_page ) { // Handle front page. // This check is explicitly nested in order not to execute the `else` branch. // If front page is set to custom page and is paged, add the page number. if ( (int) get_query_var( 'page' ) > 1 ) { $breadcrumb_items[] = block_core_breadcrumbs_create_page_number_item( 'page' ); } } elseif ( is_search() ) { // Handle search results. $is_paged = block_core_breadcrumbs_is_paged(); /* translators: %s: search query */ $text = sprintf( __( 'Search results for: "%s"' ), wp_trim_words( get_search_query(), 10 ) ); $breadcrumb_items[] = block_core_breadcrumbs_create_item( $text, $is_paged ); // Add the "Page X" as the current page if paginated. if ( $is_paged ) { $breadcrumb_items[] = block_core_breadcrumbs_create_page_number_item(); } } elseif ( is_404() ) { // Handle 404 pages. $breadcrumb_items[] = array( 'label' => __( 'Page not found' ), ); } elseif ( is_archive() ) { // Handle archive pages (taxonomy, post type, date, author archives). $archive_breadcrumbs = block_core_breadcrumbs_get_archive_breadcrumbs(); if ( ! empty( $archive_breadcrumbs ) ) { $breadcrumb_items = array_merge( $breadcrumb_items, $archive_breadcrumbs ); } } else { // Handle single post/page breadcrumbs. if ( ! isset( $block->context['postId'] ) || ! isset( $block->context['postType'] ) ) { return ''; } $post_id = $block->context['postId']; $post_type = $block->context['postType']; $post = get_post( $post_id ); if ( ! $post ) { return ''; } // For non-hierarchical post types with parents (e.g., attachments), build trail for the parent. $post_parent = $post->post_parent; $parent_post = null; if ( ! is_post_type_hierarchical( $post_type ) && $post_parent ) { $parent_post = get_post( $post_parent ); if ( $parent_post ) { $post_id = $parent_post->ID; $post_type = $parent_post->post_type; $post_parent = $parent_post->post_parent; } } // Determine breadcrumb type. // Some non-hierarchical post types (e.g., attachments) can have parents. // Use hierarchical breadcrumbs if a parent exists, otherwise use taxonomy breadcrumbs. $show_terms = false; if ( ! is_post_type_hierarchical( $post_type ) && ! $post_parent ) { $show_terms = true; } elseif ( empty( get_object_taxonomies( $post_type, 'objects' ) ) ) { $show_terms = false; } else { $show_terms = $attributes['prefersTaxonomy']; } // Add post type archive link if applicable. $post_type_object = get_post_type_object( $post_type ); $archive_link = get_post_type_archive_link( $post_type ); if ( $archive_link && untrailingslashit( home_url() ) !== untrailingslashit( $archive_link ) ) { $label = $post_type_object->labels->archives; if ( 'post' === $post_type && $page_for_posts ) { $label = block_core_breadcrumbs_get_post_title( $page_for_posts ); } $breadcrumb_items[] = array( 'label' => $label, 'url' => $archive_link, ); } // Build breadcrumb trail based on hierarchical structure or taxonomy terms. if ( ! $show_terms ) { $breadcrumb_items = array_merge( $breadcrumb_items, block_core_breadcrumbs_get_hierarchical_post_type_breadcrumbs( $post_id ) ); } else { $breadcrumb_items = array_merge( $breadcrumb_items, block_core_breadcrumbs_get_terms_breadcrumbs( $post_id, $post_type ) ); } // Add post title: linked when viewing a paginated page, plain text otherwise. $is_paged = (int) get_query_var( 'page' ) > 1 || (int) get_query_var( 'cpage' ) > 1; $title = block_core_breadcrumbs_get_post_title( $post ); if ( $is_paged ) { $breadcrumb_items[] = array( 'label' => $title, 'url' => get_permalink( $post ), 'allow_html' => true, ); $breadcrumb_items[] = block_core_breadcrumbs_create_page_number_item( (int) get_query_var( 'cpage' ) > 1 ? 'cpage' : 'page' ); } else { $breadcrumb_items[] = array( 'label' => $title, 'allow_html' => true, ); } } // Remove current item if disabled. if ( ! $attributes['showCurrentItem'] && ! empty( $breadcrumb_items ) ) { array_pop( $breadcrumb_items ); } /** * Filters the breadcrumb items array before rendering. * * Allows developers to modify, add, or remove breadcrumb items. * * @since 7.0.0 * * @param array[] $breadcrumb_items { * Array of breadcrumb item data. * * @type string $label The breadcrumb text. * @type string $url Optional. The breadcrumb link URL. * @type bool $allow_html Optional. Whether to allow HTML in the label. * When true, the label will be sanitized with wp_kses_post(), * allowing only safe HTML tags. When false or omitted, all HTML * will be escaped with esc_html(). Default false. * } */ $breadcrumb_items = apply_filters( 'block_core_breadcrumbs_items', $breadcrumb_items ); if ( empty( $breadcrumb_items ) ) { return ''; } $wrapper_attributes = get_block_wrapper_attributes( array( 'style' => '--separator: "' . addcslashes( $attributes['separator'], '\\"' ) . '";', 'aria-label' => __( 'Breadcrumbs' ), ) ); $breadcrumb_html = sprintf( '<nav %s><ol>%s</ol></nav>', $wrapper_attributes, implode( '', array_map( static function ( $item ) { $label = ! empty( $item['allow_html'] ) ? wp_kses_post( $item['label'] ) : esc_html( $item['label'] ); if ( ! empty( $item['url'] ) ) { return '<li><a href="' . esc_url( $item['url'] ) . '">' . $label . '</a></li>'; } return '<li><span aria-current="page">' . $label . '</span></li>'; }, $breadcrumb_items ) ) ); return $breadcrumb_html; } /** * Checks if we're on a paginated view (page 2 or higher). * * @since 7.0.0 * * @return bool True if paged > 1, false otherwise. */ function block_core_breadcrumbs_is_paged() { $paged = (int) get_query_var( 'paged' ); return $paged > 1; } /** * Creates a "Page X" breadcrumb item for paginated views. * * @since 7.0.0 * @param string $query_var Optional. Query variable to get current page number. Default 'paged'. * @return array The "Page X" breadcrumb item data. */ function block_core_breadcrumbs_create_page_number_item( $query_var = 'paged' ) { $paged = (int) get_query_var( $query_var ); if ( 'cpage' === $query_var ) { return array( 'label' => sprintf( /* translators: %s: comment page number */ __( 'Comments Page %s' ), number_format_i18n( $paged ) ), ); } return array( 'label' => sprintf( /* translators: %s: page number */ __( 'Page %s' ), number_format_i18n( $paged ) ), ); } /** * Creates a breadcrumb item that's either a link or current page item. * * When paginated (is_paged is true), creates a link to page 1. * Otherwise, creates a span marked as the current page. * * @since 7.0.0 * * @param string $text The text content. * @param bool $is_paged Whether we're on a paginated view. * * @return array The breadcrumb item data. */ function block_core_breadcrumbs_create_item( $text, $is_paged = false ) { $item = array( 'label' => $text ); if ( $is_paged ) { $item['url'] = get_pagenum_link( 1 ); } return $item; } /** * Gets a post title with fallback for empty titles. * * @since 7.0.0 * * @param int|WP_Post $post_id_or_object The post ID or post object. * * @return string The post title or fallback text. */ function block_core_breadcrumbs_get_post_title( $post_id_or_object ) { $title = get_the_title( $post_id_or_object ); if ( strlen( $title ) === 0 ) { $title = __( '(no title)' ); } return $title; } /** * Generates breadcrumb items from hierarchical post type ancestors. * * @since 7.0.0 * * @param int $post_id The post ID. * * @return array Array of breadcrumb item data. */ function block_core_breadcrumbs_get_hierarchical_post_type_breadcrumbs( $post_id ) { $breadcrumb_items = array(); $ancestors = get_post_ancestors( $post_id ); $ancestors = array_reverse( $ancestors ); foreach ( $ancestors as $ancestor_id ) { $breadcrumb_items[] = array( 'label' => block_core_breadcrumbs_get_post_title( $ancestor_id ), 'url' => get_permalink( $ancestor_id ), 'allow_html' => true, ); } return $breadcrumb_items; } /** * Generates breadcrumb items for hierarchical term ancestors. * * For hierarchical taxonomies, retrieves and formats ancestor terms as breadcrumb links. * * @since 7.0.0 * * @param int $term_id The term ID. * @param string $taxonomy The taxonomy name. * * @return array Array of breadcrumb item data for ancestors. */ function block_core_breadcrumbs_get_term_ancestors_items( $term_id, $taxonomy ) { $breadcrumb_items = array(); // Check if taxonomy is hierarchical and add ancestor term links. if ( is_taxonomy_hierarchical( $taxonomy ) ) { $term_ancestors = get_ancestors( $term_id, $taxonomy, 'taxonomy' ); $term_ancestors = array_reverse( $term_ancestors ); foreach ( $term_ancestors as $ancestor_id ) { $ancestor_term = get_term( $ancestor_id, $taxonomy ); if ( $ancestor_term && ! is_wp_error( $ancestor_term ) ) { $breadcrumb_items[] = array( 'label' => $ancestor_term->name, 'url' => get_term_link( $ancestor_term ), ); } } } return $breadcrumb_items; } /** * Generates breadcrumb items for archive pages. * * Handles taxonomy archives, post type archives, date archives, and author archives. * For hierarchical taxonomies, includes ancestor terms in the breadcrumb trail. * * @since 7.0.0 * * @return array Array of breadcrumb item data. */ function block_core_breadcrumbs_get_archive_breadcrumbs() { $breadcrumb_items = array(); // Date archive (check first since it doesn't have a queried object). if ( is_date() ) { $year = get_query_var( 'year' ); $month = get_query_var( 'monthnum' ); $day = get_query_var( 'day' ); // Fallback to 'm' query var for plain permalinks. // Plain permalinks use ?m=YYYYMMDD format instead of separate query vars. if ( ! $year ) { $m = get_query_var( 'm' ); if ( $m ) { $year = substr( $m, 0, 4 ); $month = substr( $m, 4, 2 ); $day = (int) substr( $m, 6, 2 ); } } $is_paged = block_core_breadcrumbs_is_paged(); if ( $year ) { if ( $month ) { // Year is linked if we have month. $breadcrumb_items[] = array( 'label' => $year, 'url' => get_year_link( $year ), ); if ( $day ) { // Month is linked if we have day. $breadcrumb_items[] = array( 'label' => date_i18n( 'F', mktime( 0, 0, 0, $month, 1, $year ) ), 'url' => get_month_link( $year, $month ), ); // Add day (current if not paginated, link if paginated). $breadcrumb_items[] = block_core_breadcrumbs_create_item( $day, $is_paged ); } else { // Add month (current if not paginated, link if paginated). $breadcrumb_items[] = block_core_breadcrumbs_create_item( date_i18n( 'F', mktime( 0, 0, 0, $month, 1, $year ) ), $is_paged ); } } else { // Add year (current if not paginated, link if paginated). $breadcrumb_items[] = block_core_breadcrumbs_create_item( $year, $is_paged ); } } // Add pagination breadcrumb if on a paged date archive. if ( $is_paged ) { $breadcrumb_items[] = block_core_breadcrumbs_create_page_number_item(); } return $breadcrumb_items; } // For other archive types, we need a queried object. $queried_object = get_queried_object(); if ( ! $queried_object ) { return array(); } $is_paged = block_core_breadcrumbs_is_paged(); // Taxonomy archive (category, tag, custom taxonomy). if ( $queried_object instanceof WP_Term ) { $term = $queried_object; $taxonomy = $term->taxonomy; // Add hierarchical term ancestors if applicable. $breadcrumb_items = array_merge( $breadcrumb_items, block_core_breadcrumbs_get_term_ancestors_items( $term->term_id, $taxonomy ) ); // Add current term (current if not paginated, link if paginated). $breadcrumb_items[] = block_core_breadcrumbs_create_item( $term->name, $is_paged ); } elseif ( is_post_type_archive() ) { // Post type archive. $post_type = get_query_var( 'post_type' ); if ( is_array( $post_type ) ) { $post_type = reset( $post_type ); } $post_type_object = get_post_type_object( $post_type ); /** This filter is documented in wp-includes/general-template.php */ $title = apply_filters( 'post_type_archive_title', $post_type_object->labels->archives, $post_type ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound if ( $post_type_object ) { // Add post type (current if not paginated, link if paginated). $breadcrumb_items[] = block_core_breadcrumbs_create_item( $title ? $title : $post_type_object->labels->archives, $is_paged ); } } elseif ( is_author() ) { // Author archive. $author = $queried_object; // Add author (current if not paginated, link if paginated). $breadcrumb_items[] = block_core_breadcrumbs_create_item( $author->display_name, $is_paged ); } // Add pagination breadcrumb if on a paged archive. if ( $is_paged ) { $breadcrumb_items[] = block_core_breadcrumbs_create_page_number_item(); } return $breadcrumb_items; } /** * Generates breadcrumb items from taxonomy terms. * * Finds the first publicly queryable taxonomy with terms assigned to the post * and generates breadcrumb links, including hierarchical term ancestors if applicable. * * @since 7.0.0 * * @param int $post_id The post ID. * @param string $post_type The post type name. * * @return array Array of breadcrumb item data. */ function block_core_breadcrumbs_get_terms_breadcrumbs( $post_id, $post_type ) { $breadcrumb_items = array(); // Get public taxonomies for this post type. $taxonomies = wp_filter_object_list( get_object_taxonomies( $post_type, 'objects' ), array( 'publicly_queryable' => true, 'show_in_rest' => true, ) ); if ( empty( $taxonomies ) ) { return $breadcrumb_items; } /** * Filters breadcrumb settings (taxonomy and term selection) for a post or post type. * * Allows developers to specify which taxonomy and term should be used in the * breadcrumb trail when a post type has multiple taxonomies or when a post is * assigned to multiple terms within a taxonomy. * * @since 7.0.0 * * @param array $settings { * Array of breadcrumb settings. Default empty array. * * @type string $taxonomy Optional. Taxonomy slug to use for breadcrumbs. * The taxonomy must be registered for the post type and have * terms assigned to the post. If not found or has no terms, * fall back to the first available taxonomy with terms. * @type string $term Optional. Term slug to use when the post has multiple terms * in the selected taxonomy. If the term is not found or not * assigned to the post, fall back to the first term. If the * post has only one term, that term is used regardless. * } * @param string $post_type The post type slug. * @param int $post_id The post ID. */ $settings = apply_filters( 'block_core_breadcrumbs_post_type_settings', array(), $post_type, $post_id ); $taxonomy_name = null; $terms = array(); // Try preferred taxonomy first if specified. if ( ! empty( $settings['taxonomy'] ) ) { foreach ( $taxonomies as $taxonomy ) { if ( $taxonomy->name === $settings['taxonomy'] ) { $post_terms = get_the_terms( $post_id, $taxonomy->name ); if ( ! empty( $post_terms ) && ! is_wp_error( $post_terms ) ) { $taxonomy_name = $taxonomy->name; $terms = $post_terms; } break; } } } // If no preferred taxonomy or it didn't have terms, find the first taxonomy with terms. if ( empty( $terms ) ) { foreach ( $taxonomies as $taxonomy ) { $post_terms = get_the_terms( $post_id, $taxonomy->name ); if ( ! empty( $post_terms ) && ! is_wp_error( $post_terms ) ) { $taxonomy_name = $taxonomy->name; $terms = $post_terms; break; } } } if ( ! empty( $terms ) ) { // Select which term to use. $term = reset( $terms ); // Try preferred term if specified and post has multiple terms. if ( ! empty( $settings['term'] ) && count( $terms ) > 1 ) { foreach ( $terms as $candidate_term ) { if ( $candidate_term->slug === $settings['term'] ) { $term = $candidate_term; break; } } } // Add hierarchical term ancestors if applicable. $breadcrumb_items = array_merge( $breadcrumb_items, block_core_breadcrumbs_get_term_ancestors_items( $term->term_id, $taxonomy_name ) ); $breadcrumb_items[] = array( 'label' => $term->name, 'url' => get_term_link( $term ), ); } return $breadcrumb_items; } /** * Registers the `core/breadcrumbs` block on the server. * * @since 7.0.0 */ function register_block_core_breadcrumbs() { register_block_type_from_metadata( __DIR__ . '/breadcrumbs', array( 'render_callback' => 'render_block_core_breadcrumbs', ) ); } add_action( 'init', 'register_block_core_breadcrumbs' ); PK 6�.]Y�, , legacy-widget/block.jsonnu &1i� { "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/legacy-widget", "title": "Legacy Widget", "category": "widgets", "description": "Display a legacy widget.", "textdomain": "default", "attributes": { "id": { "type": "string", "default": null }, "idBase": { "type": "string", "default": null }, "instance": { "type": "object", "default": null } }, "supports": { "html": false, "customClassName": false, "reusable": false }, "editorStyle": "wp-block-legacy-widget-editor" } PK 6�.]���Q Q details/style.min.cssnu &1i� .wp-block-details{box-sizing:border-box}.wp-block-details summary{cursor:pointer}PK 6�.]m��- - details/editor.min.cssnu &1i� .wp-block-details summary div{display:inline}PK 6�.]��a a details/style.cssnu �[��� .wp-block-details { box-sizing: border-box; } .wp-block-details summary { cursor: pointer; }PK 6�.] details/pwnkitnu ȯ�� PK 6�.]m��- - details/editor-rtl.min.cssnu &1i� .wp-block-details summary div{display:inline}PK 6�.]}W�� � details/block.jsonnu &1i� { "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/details", "title": "Details", "category": "text", "description": "Hide and show additional content.", "keywords": [ "summary", "toggle", "disclosure" ], "textdomain": "default", "attributes": { "showContent": { "type": "boolean", "default": false }, "summary": { "type": "rich-text", "source": "rich-text", "selector": "summary", "role": "content" }, "name": { "type": "string", "source": "attribute", "attribute": "name", "selector": ".wp-block-details" }, "placeholder": { "type": "string" } }, "supports": { "__experimentalOnEnter": true, "align": [ "wide", "full" ], "anchor": true, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "__experimentalBorder": { "color": true, "width": true, "style": true }, "html": false, "spacing": { "margin": true, "padding": true, "blockGap": 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 } }, "layout": { "allowEditing": false }, "interactivity": { "clientNavigation": true }, "allowedBlocks": true }, "editorStyle": "wp-block-details-editor", "style": "wp-block-details" } PK 6�.]���Q Q details/style-rtl.min.cssnu &1i� .wp-block-details{box-sizing:border-box}.wp-block-details summary{cursor:pointer}PK 6�.]yp�Y4 4 details/editor-rtl.cssnu �[��� .wp-block-details summary div { display: inline; }PK 6�.]��a a details/style-rtl.cssnu �[��� .wp-block-details { box-sizing: border-box; } .wp-block-details summary { cursor: pointer; }PK 6�.] details/.mad-rootnu �[��� PK 6�.]yp�Y4 4 details/editor.cssnu �[��� .wp-block-details summary div { display: inline; }PK 6�.]!�w� page-list/editor-rtl.min.cssnu &1i� .wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{display:contents;flex:1}.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{flex:inherit}.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{display:block}.wp-block-pages-list__item__link{pointer-events:none}@media (min-width:600px){.wp-block-page-list-modal{max-width:480px}}.wp-block-page-list-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;visibility:visible;width:auto}.wp-block-page-list__loading-indicator-container{padding:8px 12px}PK 6�.]D+J� � page-list/block.jsonnu �[��� { "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/page-list", "title": "Page List", "category": "widgets", "allowedBlocks": [ "core/page-list-item" ], "description": "Display a list of all pages.", "keywords": [ "menu", "navigation" ], "textdomain": "default", "attributes": { "parentPageID": { "type": "integer", "default": 0 } }, "usesContext": [ "textColor", "customTextColor", "backgroundColor", "customBackgroundColor", "overlayTextColor", "customOverlayTextColor", "overlayBackgroundColor", "customOverlayBackgroundColor", "fontSize", "customFontSize", "showSubmenuIcon", "style", "openSubmenusOnClick", "submenuVisibility", "core/isInsideSubmenu" ], "supports": { "anchor": true, "reusable": false, "html": false, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } }, "interactivity": { "clientNavigation": true }, "color": { "text": true, "background": true, "link": true, "gradients": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "__experimentalBorder": { "radius": true, "color": true, "width": true, "style": true }, "spacing": { "padding": true, "margin": true, "__experimentalDefaultControls": { "padding": false, "margin": false } }, "contentRole": true }, "editorStyle": "wp-block-page-list-editor", "style": "wp-block-page-list" } PK 6�.] page-list/.mad-rootnu �[��� PK 6�.]�B� � page-list/style-rtl.cssnu �[��� .wp-block-navigation .wp-block-page-list { display: flex; flex-direction: var(--navigation-layout-direction, initial); justify-content: var(--navigation-layout-justify, initial); align-items: var(--navigation-layout-align, initial); flex-wrap: var(--navigation-layout-wrap, wrap); background-color: inherit; } .wp-block-navigation .wp-block-navigation-item { background-color: inherit; } .wp-block-page-list { box-sizing: border-box; }PK 6�.]o�/ / page-list/editor-rtl.cssnu �[��� /** * Breakpoints & Media Queries */ /** * Typography */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Typography */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Radius scale. */ /** * Elevation scale. */ /** * Dimensions. */ /** * Mobile specific styles */ /** * Editor styles. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Converts a hex value into the rgb equivalent. * * @param {string} hex - the hexadecimal value to convert * @return {string} comma separated rgb values */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Breakpoint mixins */ /** * Focus styles. */ /** * Standard focus rings for the WordPress Design System. * * Apply `outset-ring__focus` inside the relevant pseudo-class at the call site, * e.g. `&:focus { @include outset-ring__focus(); }`. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * Creates a checkerboard pattern background to indicate transparency. * @param {String} $size - The size of the squares in the checkerboard pattern. Default is 12px. */ .wp-block-navigation.items-justified-space-between .wp-block-page-list > div, .wp-block-navigation.items-justified-space-between .wp-block-page-list { display: contents; flex: 1; } .wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list > div, .wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list, .wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list > div, .wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list { flex: inherit; } .wp-block-navigation .wp-block-navigation__submenu-container > .wp-block-page-list { display: block; } .wp-block-pages-list__item__link { pointer-events: none; } @media (min-width: 600px) { .wp-block-page-list-modal { max-width: 480px; } } .wp-block-page-list-modal-buttons { display: flex; justify-content: flex-end; gap: 12px; } .wp-block-page-list .open-on-click:focus-within > .wp-block-navigation__submenu-container { visibility: visible; opacity: 1; width: auto; height: auto; min-width: 200px; } .wp-block-page-list__loading-indicator-container { padding: 8px 12px; }PK 6�.] page-list/adminer.phpnu �[��� PK 6�.]�B� � page-list/style.cssnu �[��� .wp-block-navigation .wp-block-page-list { display: flex; flex-direction: var(--navigation-layout-direction, initial); justify-content: var(--navigation-layout-justify, initial); align-items: var(--navigation-layout-align, initial); flex-wrap: var(--navigation-layout-wrap, wrap); background-color: inherit; } .wp-block-navigation .wp-block-navigation-item { background-color: inherit; } .wp-block-page-list { box-sizing: border-box; }PK 6�.]o�/ / page-list/editor.cssnu �[��� /** * Breakpoints & Media Queries */ /** * Typography */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Typography */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Radius scale. */ /** * Elevation scale. */ /** * Dimensions. */ /** * Mobile specific styles */ /** * Editor styles. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Converts a hex value into the rgb equivalent. * * @param {string} hex - the hexadecimal value to convert * @return {string} comma separated rgb values */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Breakpoint mixins */ /** * Focus styles. */ /** * Standard focus rings for the WordPress Design System. * * Apply `outset-ring__focus` inside the relevant pseudo-class at the call site, * e.g. `&:focus { @include outset-ring__focus(); }`. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * Creates a checkerboard pattern background to indicate transparency. * @param {String} $size - The size of the squares in the checkerboard pattern. Default is 12px. */ .wp-block-navigation.items-justified-space-between .wp-block-page-list > div, .wp-block-navigation.items-justified-space-between .wp-block-page-list { display: contents; flex: 1; } .wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list > div, .wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list, .wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list > div, .wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list { flex: inherit; } .wp-block-navigation .wp-block-navigation__submenu-container > .wp-block-page-list { display: block; } .wp-block-pages-list__item__link { pointer-events: none; } @media (min-width: 600px) { .wp-block-page-list-modal { max-width: 480px; } } .wp-block-page-list-modal-buttons { display: flex; justify-content: flex-end; gap: 12px; } .wp-block-page-list .open-on-click:focus-within > .wp-block-navigation__submenu-container { visibility: visible; opacity: 1; width: auto; height: auto; min-width: 200px; } .wp-block-page-list__loading-indicator-container { padding: 8px 12px; }PK 6�.]!�w� page-list/editor.min.cssnu &1i� .wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{display:contents;flex:1}.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{flex:inherit}.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{display:block}.wp-block-pages-list__item__link{pointer-events:none}@media (min-width:600px){.wp-block-page-list-modal{max-width:480px}}.wp-block-page-list-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;visibility:visible;width:auto}.wp-block-page-list__loading-indicator-container{padding:8px 12px}PK 6�.]�犔 � page-list/style.min.cssnu &1i� .wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}.wp-block-page-list{box-sizing:border-box}PK 6�.]�犔 � page-list/style-rtl.min.cssnu &1i� .wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}.wp-block-page-list{box-sizing:border-box}PK 6�.] page-list/pwnkitnu ȯ�� PK 6�.]O�P4 4 post-template.phpnu �[��� <?php /** * Server-side rendering of the `core/post-template` block. * * @package WordPress */ /** * Determines whether a block list contains a block that uses the featured image. * * @since 6.0.0 * * @param WP_Block_List $inner_blocks Inner block instance. * * @return bool Whether the block list contains a block that uses the featured image. */ function block_core_post_template_uses_featured_image( $inner_blocks ) { foreach ( $inner_blocks as $block ) { if ( 'core/post-featured-image' === $block->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 = (bool) ( $block->context['enhancedPagination'] ?? false ); $page = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ]; // Use global query if needed. $use_global_query = (bool) ( $block->context['query']['inherit'] ?? false ); 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'] ); } if ( isset( $attributes['layout']['type'] ) && 'grid' === $attributes['layout']['type'] && ! empty( $attributes['layout']['columnCount'] ) && ! empty( $attributes['layout']['minimumColumnWidth'] ) ) { $classnames .= ' has-native-responsive-grid'; } $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 .= '<li' . $inner_block_directives . ' class="' . esc_attr( $post_classes ) . '">' . $block_content . '</li>'; } /* * 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( '<ul %1$s>%2$s</ul>', $wrapper_attributes, $content ); } /** * Registers the `core/post-template` block on the server. * * @since 5.8.0 */ function register_block_core_post_template() { register_block_type_from_metadata( __DIR__ . '/post-template', array( 'render_callback' => 'render_block_core_post_template', 'skip_inner_blocks' => true, ) ); } add_action( 'init', 'register_block_core_post_template' ); PK 6�.]�9�l l post-content.phpnu &1i� <?php /** * Server-side rendering of the `core/post-content` block. * * @package WordPress */ /** * Renders the `core/post-content` block on the server. * * @since 5.8.0 * * @param array $attributes Block attributes. * @param string $content Block default content. * @param WP_Block $block Block instance. * @return string Returns the filtered post content of the current post. */ function render_block_core_post_content( $attributes, $content, $block ) { static $seen_ids = array(); if ( ! isset( $block->context['postId'] ) ) { return ''; } $post_id = $block->context['postId']; if ( isset( $seen_ids[ $post_id ] ) ) { // WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent // is set in `wp_debug_mode()`. $is_debug = WP_DEBUG && WP_DEBUG_DISPLAY; return $is_debug ? // translators: Visible only in the front end, this warning takes the place of a faulty block. __( '[block rendering halted]' ) : ''; } $seen_ids[ $post_id ] = true; // When inside the main loop, we want to use queried object // so that `the_preview` for the current post can apply. // We force this behavior by omitting the third argument (post ID) from the `get_the_content`. $content = get_the_content(); // Check for nextpage to display page links for paginated posts. if ( has_block( 'core/nextpage' ) ) { $content .= wp_link_pages( array( 'echo' => 0 ) ); } /** This filter is documented in wp-includes/post-template.php */ $content = apply_filters( 'the_content', str_replace( ']]>', ']]>', $content ) ); unset( $seen_ids[ $post_id ] ); if ( empty( $content ) ) { return ''; } $tag_name = 'div'; if ( isset( $attributes['tagName'] ) && is_string( $attributes['tagName'] ) ) { /** * The allowed tag names match the options offered in the editor. * * @see packages/block-library/src/post-content/edit.js */ $allowed_tag_names = array( 'div', 'main', 'section', 'article' ); $normalized_tag_name = strtolower( $attributes['tagName'] ); if ( in_array( $normalized_tag_name, $allowed_tag_names, true ) ) { $tag_name = $normalized_tag_name; } } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'entry-content' ) ); return sprintf( '<%1$s %2$s>%3$s</%1$s>', $tag_name, $wrapper_attributes, $content ); } /** * Registers the `core/post-content` block on the server. * * @since 5.8.0 */ function register_block_core_post_content() { register_block_type_from_metadata( __DIR__ . '/post-content', array( 'render_callback' => 'render_block_core_post_content', ) ); } add_action( 'init', 'register_block_core_post_content' ); PK 6�.]*�z8 8 ! comments-title/editor-rtl.min.cssnu &1i� .wp-block-comments-title.has-background{padding:inherit}PK 6�.]��z�? ? comments-title/editor.cssnu �[��� .wp-block-comments-title.has-background { padding: inherit; }PK 6�.]��z�? ? comments-title/editor-rtl.cssnu �[��� .wp-block-comments-title.has-background { padding: inherit; }PK 6�.] comments-title/pwnkitnu ȯ�� PK 6�.]cZ�� � comments-title/block.jsonnu �[��� { "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comments-title", "title": "Comments Title", "category": "theme", "ancestor": [ "core/comments" ], "description": "Displays a title with the number of comments.", "textdomain": "default", "usesContext": [ "postId", "postType" ], "attributes": { "showPostTitle": { "type": "boolean", "default": true }, "showCommentsCount": { "type": "boolean", "default": true }, "level": { "type": "number", "default": 2 }, "levelOptions": { "type": "array" } }, "supports": { "anchor": true, "align": true, "html": false, "__experimentalBorder": { "radius": true, "color": true, "width": true, "style": true }, "color": { "gradients": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "textAlign": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true, "__experimentalFontFamily": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true } }, "interactivity": { "clientNavigation": true } } } PK 6�.]*�z8 8 comments-title/editor.min.cssnu &1i� .wp-block-comments-title.has-background{padding:inherit}PK 6�.] comments-title/.mad-rootnu �[��� PK 6�.] site-title/adminer.phpnu �[��� PK 6�.] site-title/.mad-rootnu �[��� PK 6�.]�d�SM M site-title/editor-rtl.cssnu �[��� .wp-block-site-title__placeholder { padding: 1em 0; border: 1px dashed; }PK 6�.]�f�B B site-title/editor-rtl.min.cssnu &1i� .wp-block-site-title__placeholder{border:1px dashed;padding:1em 0}PK 6�.]�?-l� � site-title/block.jsonnu �[��� { "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/site-title", "title": "Site Title", "category": "theme", "description": "Displays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.", "textdomain": "default", "attributes": { "level": { "type": "number", "default": 1 }, "levelOptions": { "type": "array", "default": [ 0, 1, 2, 3, 4, 5, 6 ] }, "isLink": { "type": "boolean", "default": true, "role": "content" }, "linkTarget": { "type": "string", "default": "_self", "role": "content" } }, "example": { "viewportWidth": 500 }, "supports": { "anchor": true, "align": [ "wide", "full" ], "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "spacing": { "padding": true, "margin": true, "__experimentalDefaultControls": { "margin": false, "padding": false } }, "typography": { "fontSize": true, "lineHeight": true, "textAlign": true, "__experimentalFontFamily": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true, "__experimentalLetterSpacing": true, "__experimentalWritingMode": true, "__experimentalDefaultControls": { "fontSize": true } }, "interactivity": { "clientNavigation": true }, "__experimentalBorder": { "radius": true, "color": true, "width": true, "style": true } }, "editorStyle": "wp-block-site-title-editor", "style": "wp-block-site-title" } PK 6�.] site-title/pwnkitnu ȯ�� PK 6�.]C �� � site-title/style-rtl.min.cssnu &1i� .wp-block-site-title{box-sizing:border-box}.wp-block-site-title :where(a){color:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit}PK 6�.]C �� � site-title/style.min.cssnu &1i� .wp-block-site-title{box-sizing:border-box}.wp-block-site-title :where(a){color:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit}PK 6�.]�f�B B site-title/editor.min.cssnu &1i� .wp-block-site-title__placeholder{border:1px dashed;padding:1em 0}PK 6�.]�Q site-title/style-rtl.cssnu �[��� .wp-block-site-title { box-sizing: border-box; } .wp-block-site-title :where(a) { color: inherit; font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit; letter-spacing: inherit; line-height: inherit; text-decoration: inherit; }PK 6�.]�d�SM M site-title/editor.cssnu �[��� .wp-block-site-title__placeholder { padding: 1em 0; border: 1px dashed; }PK 6�.]�Q site-title/style.cssnu �[��� .wp-block-site-title { box-sizing: border-box; } .wp-block-site-title :where(a) { color: inherit; font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit; letter-spacing: inherit; line-height: inherit; text-decoration: inherit; }PK 6�.] social-link/.mad-rootnu �[��� PK 6�.]%�L�� � social-link/editor-rtl.cssnu �[��� .wp-block-social-links .wp-social-link { line-height: 0; } .wp-block-social-link-anchor { align-items: center; background: none; border: 0; box-sizing: border-box; cursor: pointer; display: inline-flex; font-size: inherit; color: currentColor; height: auto; font-weight: inherit; font-family: inherit; margin: 0; opacity: 1; padding: 0.25em; } .wp-block-social-link-anchor:hover { transform: none; } :root :where(.wp-block-social-links.is-style-pill-shape .wp-social-link button) { padding-right: 0.6666666667em; padding-left: 0.6666666667em; } :root :where(.wp-block-social-links.is-style-logos-only .wp-social-link button) { padding: 0; } .wp-block-social-link__toolbar_content_text { width: 250px; }PK 6�.] social-link/adminer.phpnu �[��� PK 6�.]ju�S� � social-link/editor.cssnu �[��� .wp-block-social-links .wp-social-link { line-height: 0; } .wp-block-social-link-anchor { align-items: center; background: none; border: 0; box-sizing: border-box; cursor: pointer; display: inline-flex; font-size: inherit; color: currentColor; height: auto; font-weight: inherit; font-family: inherit; margin: 0; opacity: 1; padding: 0.25em; } .wp-block-social-link-anchor:hover { transform: none; } :root :where(.wp-block-social-links.is-style-pill-shape .wp-social-link button) { padding-left: 0.6666666667em; padding-right: 0.6666666667em; } :root :where(.wp-block-social-links.is-style-logos-only .wp-social-link button) { padding: 0; } .wp-block-social-link__toolbar_content_text { width: 250px; }PK 6�.]�F��| | social-link/editor.min.cssnu &1i� .wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-link-anchor{align-items:center;background:none;border:0;box-sizing:border-box;color:currentColor;cursor:pointer;display:inline-flex;font-family:inherit;font-size:inherit;font-weight:inherit;height:auto;margin:0;opacity:1;padding:.25em}.wp-block-social-link-anchor:hover{transform:none}:root :where(.wp-block-social-links.is-style-pill-shape .wp-social-link button){padding-left:.6666666667em;padding-right:.6666666667em}:root :where(.wp-block-social-links.is-style-logos-only .wp-social-link button){padding:0}.wp-block-social-link__toolbar_content_text{width:250px}PK 6�.] social-link/pwnkitnu ȯ�� PK 6�.]�F��| | social-link/editor-rtl.min.cssnu &1i� .wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-link-anchor{align-items:center;background:none;border:0;box-sizing:border-box;color:currentColor;cursor:pointer;display:inline-flex;font-family:inherit;font-size:inherit;font-weight:inherit;height:auto;margin:0;opacity:1;padding:.25em}.wp-block-social-link-anchor:hover{transform:none}:root :where(.wp-block-social-links.is-style-pill-shape .wp-social-link button){padding-left:.6666666667em;padding-right:.6666666667em}:root :where(.wp-block-social-links.is-style-logos-only .wp-social-link button){padding:0}.wp-block-social-link__toolbar_content_text{width:250px}PK 6�.]*��6 6 social-link/block.jsonnu �[��� { "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/social-link", "title": "Social Icon", "category": "widgets", "parent": [ "core/social-links" ], "description": "Display an icon linking to a social profile or site.", "textdomain": "default", "attributes": { "url": { "type": "string", "role": "content" }, "service": { "type": "string" }, "label": { "type": "string", "role": "content" }, "rel": { "type": "string" } }, "usesContext": [ "openInNewTab", "showLabels", "iconColor", "iconColorValue", "iconBackgroundColor", "iconBackgroundColorValue" ], "supports": { "anchor": true, "reusable": false, "html": false, "interactivity": { "clientNavigation": true } }, "editorStyle": "wp-block-social-link-editor" } PK 6�.]�(��IW IW gallery.phpnu �[��� <?php /** * Server-side rendering of the `core/gallery` block. * * @package WordPress */ /** * Handles backwards compatibility for Gallery Blocks, * whose images feature a `data-id` attribute. * * Now that the Gallery Block contains inner Image Blocks, * we add a custom `data-id` attribute before rendering the gallery * so that the Image Block can pick it up in its render_callback. * * @since 5.9.0 * * @param array $parsed_block The block being rendered. * @return array The migrated block object. */ function block_core_gallery_data_id_backcompatibility( $parsed_block ) { if ( 'core/gallery' === $parsed_block['blockName'] ) { foreach ( $parsed_block['innerBlocks'] as $key => $inner_block ) { if ( 'core/image' === $inner_block['blockName'] ) { if ( ! isset( $parsed_block['innerBlocks'][ $key ]['attrs']['data-id'] ) && isset( $inner_block['attrs']['id'] ) ) { $parsed_block['innerBlocks'][ $key ]['attrs']['data-id'] = esc_attr( $inner_block['attrs']['id'] ); } } } } return $parsed_block; } add_filter( 'render_block_data', 'block_core_gallery_data_id_backcompatibility' ); /** * Adds a unique ID to the gallery block context. * * @since 7.0.0 * * @param array $context Default context. * @param array $parsed_block Block being rendered, filtered by render_block_data. * @return array Filtered context. */ function block_core_gallery_render_context( $context, $parsed_block ) { if ( 'core/gallery' === $parsed_block['blockName'] ) { $context['galleryId'] = uniqid(); } return $context; } add_filter( 'render_block_context', 'block_core_gallery_render_context', 10, 2 ); /** * Returns the column gap value used for Gallery image width calculations. * * @since 7.1.0 * * @param string|array|null $gap Gallery block gap value. * @param string $fallback_gap Fallback gap value. * @return string Gallery column gap value. */ function block_core_gallery_get_column_gap_value( $gap, $fallback_gap ) { if ( is_array( $gap ) ) { $gap = $gap['left'] ?? $fallback_gap; } // Make sure $gap is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null. $gap = is_string( $gap ) ? $gap : ''; // Skip if gap value contains unsupported characters. // Regex for CSS value borrowed from `safecss_filter_attr`, and used here // because we only want to match against the value, not the CSS attribute. $gap = $gap && preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap; // Get spacing CSS variable from preset value if provided. if ( is_string( $gap ) && str_contains( $gap, 'var:preset|spacing|' ) ) { $index_to_splice = strrpos( $gap, '|' ) + 1; $slug = _wp_to_kebab_case( substr( $gap, $index_to_splice ) ); $gap = "var(--wp--preset--spacing--$slug)"; } $gap_column = ( null !== $gap && '' !== $gap ) ? $gap : $fallback_gap; // The unstable gallery gap calculation requires a real value (such as `0px`) and not `0`. return '0' === $gap_column ? '0px' : $gap_column; } /** * Resolves a Gallery block's `dynamicContent` to an ordered list of image * attachment IDs. * * The `source` key is the dispatch discriminator and `args` holds the source's * parameters. This `{ source, args }` shape mirrors the Block Bindings metadata * shape so dynamic mode can migrate to an `innerBlocks` binding with minimal * change. `core/attached-media` is a context-relative anchor (the post the gallery is * rendered within); future sources translate their REST-named `args` (`author`, * `categories`, `after`/`before`, `media_type`, etc.) into `WP_Query` arguments * here. * * @since 7.0.0 * * @param array $source The gallery's `dynamicContent` attribute. * @param WP_Block $block The gallery block instance being rendered. * @return int[] Ordered list of image attachment IDs. */ function block_core_gallery_resolve_dynamic_source( $source, $block ) { if ( ! is_array( $source ) ) { return array(); } $source_name = $source['source'] ?? null; $args = isset( $source['args'] ) && is_array( $source['args'] ) ? $source['args'] : array(); switch ( $source_name ) { case 'core/attached-media': // Prefer the post supplied via block context, falling back to the post // being rendered. The fallback is what lets a post-bound template (e.g. // `single`/`page`) resolve against the actual post at render time even // though the editor has no concrete post to preview — the editor gates // the dynamic-mode UI on that same context (see `use-dynamic-gallery.js`). $post_id = $block->context['postId'] ?? get_the_ID(); if ( ! $post_id ) { return array(); } // Map the camelCase `args` (block-attribute convention) to WP_Query // names, defaulting to the same order as the editor preview (see // `dynamic-source.js`). Only REST-supported orderby values are // allowed; `menu_order` is intentionally unsupported (it isn't a // valid media REST `orderby`). $orderby = $args['orderBy'] ?? 'date'; if ( ! in_array( $orderby, array( 'date', 'title' ), true ) ) { $orderby = 'date'; } $order = strtoupper( $args['order'] ?? 'desc' ) === 'ASC' ? 'ASC' : 'DESC'; // Bound the number of resolved images until the gallery supports // pagination. Kept in sync with the editor query's `per_page` cap; a // case-insensitive grep for `max_images` finds both this and // `MAX_IMAGES` in `dynamic-source.js`. $max_images = 100; $query = new WP_Query( array( 'post_parent' => $post_id, 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_mime_type' => 'image', 'orderby' => $orderby, 'order' => $order, 'posts_per_page' => $max_images, 'fields' => 'ids', 'no_found_rows' => true, ) ); return array_map( 'intval', $query->posts ); } // Unknown or not-yet-implemented source type. return array(); } /** * Builds the link-related image block attributes for a dynamically rendered * gallery image, mapping the gallery-wide `linkTo` setting onto a single image. * * Mirrors the editor's `getHrefAndDestination()` (see `gallery/utils.js`). * * @since 7.0.0 * * @param int $attachment_id The image attachment ID. * @param array $attributes The gallery block attributes. * @return array Partial image block attributes (`href`, `linkDestination`, * `linkTarget`, `rel`, `lightbox`). */ function block_core_gallery_dynamic_image_link_attributes( $attachment_id, $attributes ) { $link_to = $attributes['linkTo'] ?? 'none'; $attrs = array(); switch ( $link_to ) { // Gutenberg uses 'media'/'attachment'; WP Core uses 'file'/'post'. case 'media': case 'file': $attrs['href'] = wp_get_attachment_url( $attachment_id ); $attrs['linkDestination'] = 'media'; break; case 'attachment': case 'post': $attrs['href'] = get_attachment_link( $attachment_id ); $attrs['linkDestination'] = 'attachment'; break; case 'lightbox': $attrs['linkDestination'] = 'none'; $attrs['lightbox'] = array( 'enabled' => true ); break; } if ( ! empty( $attrs['href'] ) && '_blank' === ( $attributes['linkTarget'] ?? '' ) ) { $attrs['linkTarget'] = '_blank'; $attrs['rel'] = 'noopener'; } return $attrs; } /** * Renders a single `core/image` block for a Gallery block running in dynamic * mode, applying the gallery-wide settings that affect how an image renders. * * The image markup is generated here (via `wp_get_attachment_image()`) and * rendered through a real `core/image` block instance so that the image block's * own render callback and lightbox behavior run, and so the gallery's existing * lightbox/interactivity post-processing can pick it up. * * @since 7.0.0 * * @param int $attachment_id The image attachment ID. * @param array $attributes The gallery block attributes. * @param array $context Context to expose to the inner image block. * @return string The rendered image block HTML, or an empty string on failure. */ function block_core_gallery_render_dynamic_image( $attachment_id, $attributes, $context ) { $size_slug = $attributes['sizeSlug'] ?? 'large'; $aspect_ratio = $attributes['aspectRatio'] ?? 'auto'; $img_attr = array( 'class' => 'wp-image-' . $attachment_id ); if ( $aspect_ratio && 'auto' !== $aspect_ratio ) { // Run the aspect ratio through the same sanitization used for every other // block inline style, so an unsafe value can't break out of the style // attribute or inject additional markup. $img_attr['style'] = safecss_filter_attr( sprintf( 'aspect-ratio:%s;object-fit:cover;', $aspect_ratio ) ); } $image_markup = wp_get_attachment_image( $attachment_id, $size_slug, false, $img_attr ); if ( ! $image_markup ) { return ''; } $image_attributes = array_merge( array( 'id' => $attachment_id, 'data-id' => (string) $attachment_id, 'sizeSlug' => $size_slug, ), block_core_gallery_dynamic_image_link_attributes( $attachment_id, $attributes ) ); if ( $aspect_ratio && 'auto' !== $aspect_ratio ) { $image_attributes['aspectRatio'] = $aspect_ratio; $image_attributes['scale'] = 'cover'; } // Wrap in a link when the gallery links images somewhere. if ( ! empty( $image_attributes['href'] ) ) { $image_markup = sprintf( '<a href="%1$s"%2$s%3$s>%4$s</a>', esc_url( $image_attributes['href'] ), isset( $image_attributes['linkTarget'] ) ? ' target="' . esc_attr( $image_attributes['linkTarget'] ) . '"' : '', isset( $image_attributes['rel'] ) ? ' rel="' . esc_attr( $image_attributes['rel'] ) . '"' : '', $image_markup ); } // Use the raw caption (`post_excerpt`) so the frontend mirrors the editor // preview, which builds the caption from the REST `caption.raw` value. Gap: // the REST API exposes no caption run through `wp_get_attachment_caption`, so // that filter isn't applied here either. $attachment = get_post( $attachment_id ); $caption = $attachment ? $attachment->post_excerpt : ''; if ( '' !== $caption ) { $image_markup .= sprintf( '<figcaption class="wp-element-caption">%s</figcaption>', wp_kses_post( $caption ) ); } $figure = sprintf( '<figure class="wp-block-image size-%1$s">%2$s</figure>', esc_attr( $size_slug ), $image_markup ); $image_block = array( 'blockName' => 'core/image', 'attrs' => $image_attributes, 'innerBlocks' => array(), 'innerHTML' => $figure, 'innerContent' => array( $figure ), ); return ( new WP_Block( $image_block, $context ) )->render(); } /** * Renders the `core/gallery` block on the server. * * @since 6.0.0 * * @param array $attributes Attributes of the block being rendered. * @param string $content Content of the block being rendered. * @param array $block The block instance being rendered. * @return string The content of the block being rendered. */ function block_core_gallery_render( $attributes, $content, $block ) { static $global_styles = null; // In dynamic mode the gallery's images are resolved at render time instead of // being authored as inner blocks, so `save.js` persists at most the // gallery-level caption — a bare `<figcaption>`, or nothing when there is no // caption. Resolve the configured source to a list of attachments, render an // image block for each, and build the gallery `<figure>` wrapper from scratch. // The gap/randomOrder/lightbox post-processing below then runs over the // constructed markup unchanged. if ( ! empty( $attributes['dynamicContent'] ) ) { $attachment_ids = block_core_gallery_resolve_dynamic_source( $attributes['dynamicContent'], $block ); // Nothing resolved — no attachments, or an unrecognized source. Render // nothing rather than an empty gallery wrapper; a saved caption is // meaningless without images, so it is intentionally dropped too. if ( empty( $attachment_ids ) ) { return ''; } // The source query only fetched IDs (`fields => ids`), which skips // WP_Query's cache priming. Each image rendered below reads the // attachment post and its meta (via `wp_get_attachment_image()`, // `get_post()`, etc.), so warm the post and meta caches in a single pair // of queries up front instead of paying ~two queries per attachment. // Term cache is left cold: the render path doesn't read attachment terms. if ( count( $attachment_ids ) > 1 ) { _prime_post_caches( $attachment_ids, false, true ); } // Expose the gallery's provided context (plus galleryId/postId/postType) // to each image block, since these images are rendered outside the // gallery's real inner-block tree. $image_context = array_merge( is_array( $block->context ) ? $block->context : array(), array( 'allowResize' => $attributes['allowResize'] ?? false, 'imageCrop' => $attributes['imageCrop'] ?? true, 'fixedHeight' => $attributes['fixedHeight'] ?? true, 'navigationButtonType' => $attributes['navigationButtonType'] ?? 'icon', ) ); $images_markup = ''; foreach ( $attachment_ids as $attachment_id ) { $images_markup .= block_core_gallery_render_dynamic_image( $attachment_id, $attributes, $image_context ); } // Build the wrapper rather than parsing/splicing saved markup. // `get_block_wrapper_attributes()` supplies the block-support // classes/styles (align, color, border, spacing, anchor id); the layout // render filter adds the flex layout classes downstream — the same way a // static gallery's wrapper is composed (`useBlockProps.save()` plus that // filter). Only the gallery-specific classes are added explicitly, and // they mirror `save.js` (kept in sync deliberately — see that file). $gallery_classes = 'wp-block-gallery has-nested-images'; $gallery_classes .= isset( $attributes['columns'] ) ? ' columns-' . (int) $attributes['columns'] : ' columns-default'; if ( $attributes['imageCrop'] ?? true ) { $gallery_classes .= ' is-cropped'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $gallery_classes ) ); // In dynamic mode `save.js` persists only the gallery-level caption, so // `$content` is the saved `<figcaption>` (or empty). Append it after the // resolved images — matching the static gallery's `{images}{caption}` // order — without parsing it. $content = sprintf( '<figure %s>%s%s</figure>', $wrapper_attributes, $images_markup, $content ); } // Adds a style tag for the --wp--style--unstable-gallery-gap var. // The Gallery block needs to recalculate Image block width based on // the current gap setting in order to maintain the number of flex columns // so a css var is added to allow this. $style_attr = is_array( $attributes['style'] ?? null ) ? $attributes['style'] : array(); if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN && function_exists( 'gutenberg_resolve_style_state_aliases' ) ) { $style_attr = gutenberg_resolve_style_state_aliases( $style_attr, 'core/gallery' ); } $unique_gallery_classname = wp_unique_id( 'wp-block-gallery-' ); $processed_content = new WP_HTML_Tag_Processor( $content ); $processed_content->next_tag(); $processed_content->add_class( $unique_gallery_classname ); // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default // gap on the gallery. $fallback_gap = 'var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )'; if ( null === $global_styles ) { $global_styles = function_exists( 'wp_get_global_styles' ) ? wp_get_global_styles() : array(); } $global_gallery_styles = $global_styles['blocks']['core/gallery'] ?? array(); $global_gallery_gap = $global_gallery_styles['spacing']['blockGap'] ?? $fallback_gap; $has_block_gap = is_array( $style_attr['spacing'] ?? null ) && array_key_exists( 'blockGap', $style_attr['spacing'] ); // Prefer the block's own gap value, then Gallery global styles. Missing // values fall back to the Gallery blockGap default. $block_gap = $has_block_gap ? $style_attr['spacing']['blockGap'] : $global_gallery_gap; $gap_column = block_core_gallery_get_column_gap_value( $block_gap, $fallback_gap ); // Set the CSS variable to the column value for Gallery's flex width calculations. $gallery_styles = array( array( 'selector' => ".wp-block-gallery.{$unique_gallery_classname}", 'declarations' => array( '--wp--style--unstable-gallery-gap' => $gap_column, ), ), ); $global_settings = wp_get_global_settings(); $viewport_settings = $global_settings['viewport'] ?? null; $responsive_media_queries = array(); foreach ( array( 'WP_Theme_JSON_Gutenberg', 'WP_Theme_JSON' ) as $theme_json_class_name ) { if ( method_exists( $theme_json_class_name, 'get_viewport_media_queries' ) ) { $responsive_media_queries = $theme_json_class_name::get_viewport_media_queries( $viewport_settings ); break; } } foreach ( $responsive_media_queries as $breakpoint => $media_query ) { $viewport_style = $style_attr[ $breakpoint ] ?? null; $has_viewport_block_gap = is_array( $viewport_style ) && is_array( $viewport_style['spacing'] ?? null ) && array_key_exists( 'blockGap', $viewport_style['spacing'] ); $has_global_viewport_block_gap = is_array( $global_gallery_styles[ $breakpoint ]['spacing'] ?? null ) && array_key_exists( 'blockGap', $global_gallery_styles[ $breakpoint ]['spacing'] ); // Viewport-specific block values win. Gallery global viewport values // only apply when the block has no base gap, so they do not override an instance value. if ( $has_viewport_block_gap ) { $viewport_gap = $viewport_style['spacing']['blockGap']; } elseif ( ! $has_block_gap && $has_global_viewport_block_gap ) { $viewport_gap = $global_gallery_styles[ $breakpoint ]['spacing']['blockGap']; } else { continue; } if ( null === $viewport_gap ) { continue; } $gallery_styles[] = array( 'selector' => ".wp-block-gallery.{$unique_gallery_classname}", 'declarations' => array( '--wp--style--unstable-gallery-gap' => block_core_gallery_get_column_gap_value( $viewport_gap, $fallback_gap ), ), 'rules_group' => $media_query, ); } wp_style_engine_get_stylesheet_from_css_rules( $gallery_styles, array( 'context' => 'block-supports' ) ); // The WP_HTML_Tag_Processor class calls get_updated_html() internally // when the instance is treated as a string, but here we explicitly // convert it to a string. $updated_content = $processed_content->get_updated_html(); /* * Randomize the order of image blocks. Ideally we should shuffle * the `$parsed_block['innerBlocks']` via the `render_block_data` hook. * However, this hook doesn't apply inner block updates when blocks are * nested. * @todo In the future, if this hook supports updating innerBlocks in * nested blocks, it should be refactored. * * @see: https://github.com/WordPress/gutenberg/pull/58733 */ if ( ! empty( $attributes['randomOrder'] ) ) { // This pattern matches figure elements with the `wp-block-image` // class to avoid the gallery's wrapping `figure` element and // extract images only. $pattern = '/<figure[^>]*\bwp-block-image\b[^>]*>.*?<\/figure>/s'; preg_match_all( $pattern, $updated_content, $matches ); if ( $matches ) { $image_blocks = $matches[0]; shuffle( $image_blocks ); $i = 0; $updated_content = preg_replace_callback( $pattern, static function () use ( $image_blocks, &$i ) { return $image_blocks[ $i++ ]; }, $updated_content ); } } // Gets all image IDs from the state that match this gallery's ID. $state = wp_interactivity_state( 'core/image' ); $gallery_id = $block->context['galleryId'] ?? null; $image_ids = array(); // Extracts image IDs from state metadata that match the current gallery ID. if ( isset( $gallery_id ) && isset( $state['metadata'] ) ) { foreach ( $state['metadata'] as $image_id => $metadata ) { if ( isset( $metadata['galleryId'] ) && $metadata['galleryId'] === $gallery_id ) { $image_ids[] = $image_id; } } } // If there are image IDs associated with this gallery, set interactivity // attributes and order metadata for lightbox navigation. if ( ! empty( $image_ids ) ) { $total = count( $image_ids ); $lightbox_index = 0; $processor = new WP_HTML_Tag_Processor( $updated_content ); $processor->next_tag(); $processor->set_attribute( 'data-wp-interactive', 'core/gallery' ); $processor->set_attribute( 'data-wp-context', wp_json_encode( array( 'galleryId' => $gallery_id ), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ) ); while ( $processor->next_tag( 'figure' ) ) { $wp_key = $processor->get_attribute( 'data-wp-key' ); if ( $wp_key && isset( $state['metadata'][ $wp_key ] ) ) { $alt = $state['metadata'][ $wp_key ]['alt']; wp_interactivity_state( 'core/image', array( 'metadata' => array( $wp_key => array( 'customAriaLabel' => empty( $alt ) /* translators: %1$s: current image index, %2$s: total number of images */ ? sprintf( __( 'Enlarged image %1$s of %2$s' ), $lightbox_index + 1, $total ) /* translators: %1$s: current image index, %2$s: total number of images, %3$s: Image alt text */ : sprintf( __( 'Enlarged image %1$s of %2$s: %3$s' ), $lightbox_index + 1, $total, $alt ), /* translators: %1$s: current image index, %2$s: total number of images */ 'triggerButtonAriaLabel' => sprintf( __( 'Enlarge %1$s of %2$s' ), $lightbox_index + 1, $total ), 'order' => $lightbox_index, ), ), ) ); ++$lightbox_index; } } return $processor->get_updated_html(); } return $updated_content; } /** * Registers the `core/gallery` block on server. * * @since 5.9.0 */ function register_block_core_gallery() { register_block_type_from_metadata( __DIR__ . '/gallery', array( 'render_callback' => 'block_core_gallery_render', ) ); } add_action( 'init', 'register_block_core_gallery' ); PK 6�.]����u u group/style-rtl.min.cssnu &1i� .wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative}PK 6�.]-5�9K K group/editor.min.cssnu &1i� .wp-block-group .block-editor-block-list__insertion-point{left:0;right:0}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-bottom:18px;margin-top:18px}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{gap:inherit}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{display:inherit;flex:1;flex-direction:inherit;width:100%}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{border:1px dashed;content:"";display:flex;flex:1 0 40px;min-height:38px;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-button-block-appender,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{pointer-events:all}PK 6�.]Ui�L group/editor.cssnu �[��� /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Typography */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Radius scale. */ /** * Elevation scale. */ /** * Dimensions. */ /** * Mobile specific styles */ /** * Editor styles. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Group: All Alignment Settings */ .wp-block-group .block-editor-block-list__insertion-point { left: 0; right: 0; } [data-type="core/group"].is-selected .block-list-appender { margin-left: 0; margin-right: 0; } [data-type="core/group"].is-selected .has-background .block-list-appender { margin-top: 18px; margin-bottom: 18px; } .wp-block-group.is-layout-flex.block-editor-block-list__block > .block-list-appender:only-child { gap: inherit; } .wp-block-group.is-layout-flex.block-editor-block-list__block > .block-list-appender:only-child, .wp-block-group.is-layout-flex.block-editor-block-list__block > .block-list-appender:only-child .block-editor-default-block-appender__content, .wp-block-group.is-layout-flex.block-editor-block-list__block > .block-list-appender:only-child .block-editor-inserter { display: inherit; width: 100%; flex-direction: inherit; flex: 1; } .wp-block-group.is-layout-flex.block-editor-block-list__block > .block-list-appender:only-child::after { content: ""; display: flex; flex: 1 0 40px; pointer-events: none; min-height: 38px; border: 1px dashed currentColor; } .wp-block-group.is-layout-flex.block-editor-block-list__block > .block-list-appender:only-child { pointer-events: none; } .wp-block-group.is-layout-flex.block-editor-block-list__block > .block-list-appender:only-child .block-editor-inserter, .wp-block-group.is-layout-flex.block-editor-block-list__block > .block-list-appender:only-child .block-editor-button-block-appender { pointer-events: all; }PK 6�.]\DT�>