Skip to content

Commit c7574be

Browse files
Editor: Make template names and descriptions dynamic.
Backports PHP changes in WordPress/gutenberg#43862 to the core. Adds a mechanism to dynamically compute names and descriptions of the author, page, single, tag, category, and taxonomy templates. Props mcsf, ntsekouras, antonvlasenko, jameskoster. See #56467. git-svn-id: https://develop.svn.wordpress.org/trunk@54280 602fd350-edb4-49c9-b593-d223f7449a82
1 parent 235befa commit c7574be

1 file changed

Lines changed: 227 additions & 0 deletions

File tree

src/wp-includes/block-template-utils.php

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,136 @@ function _build_block_template_result_from_file( $template_file, $template_type
530530
return $template;
531531
}
532532

533+
/**
534+
* Builds the title and description of a post specific template based on the underlying referenced post.
535+
* Mutates the underlying template object.
536+
*
537+
* @access private
538+
* @internal
539+
*
540+
* @param string $post_type Post type e.g.: page, post, product.
541+
* @param string $slug Slug of the post e.g.: a-story-about-shoes.
542+
* @param WP_Block_Template $template Template to mutate adding the description and title computed.
543+
*
544+
* @return boolean Returns true if the referenced post was found and false otherwise.
545+
*/
546+
function _wp_build_title_and_description_for_single_post_type_block_template( $post_type, $slug, WP_Block_Template $template ) {
547+
$post_type_object = get_post_type_object( $post_type );
548+
549+
$posts = get_posts(
550+
array(
551+
'name' => $slug,
552+
'post_type' => $post_type,
553+
)
554+
);
555+
if ( empty( $posts ) ) {
556+
$template->title = sprintf(
557+
// translators: Represents the title of a user's custom template in the Site Editor referencing a post that was not found, where %1$s is the singular name of a post type and %2$s is the slug of the deleted post, e.g. "Not found: Page(hello)".
558+
__( 'Not found: %1$s(%2$s)' ),
559+
$post_type_object->labels->singular_name,
560+
$slug
561+
);
562+
return false;
563+
}
564+
565+
$post_title = $posts[0]->post_title;
566+
567+
$template->title = sprintf(
568+
// translators: Represents the title of a user's custom template in the Site Editor, where %1$s is the singular name of a post type and %2$s is the name of the post, e.g. "Page: Hello".
569+
__( '%1$s: %2$s' ),
570+
$post_type_object->labels->singular_name,
571+
$post_title
572+
);
573+
$template->description = sprintf(
574+
// translators: Represents the description of a user's custom template in the Site Editor, e.g. "Template for Page: Hello".
575+
__( 'Template for %1$s' ),
576+
$post_title
577+
);
578+
579+
$posts_with_same_title = get_posts(
580+
array(
581+
'title' => $post_title,
582+
'post_type' => $post_type,
583+
'post_status' => 'publish',
584+
)
585+
);
586+
if ( count( $posts_with_same_title ) > 1 ) {
587+
$template->title = sprintf(
588+
// translators: Represents the title of a user's custom template in the Site Editor, where %1$s is the template title and %2$s is the slug of the post type, e.g. "Project: Hello (project_type)".
589+
__( '%1$s (%2$s)' ),
590+
$template->title,
591+
$slug
592+
);
593+
}
594+
return true;
595+
}
596+
597+
/**
598+
* Builds the title and description of a taxonomy specific template based on the underlying entity referenced.
599+
* Mutates the underlying template object.
600+
*
601+
* @access private
602+
* @internal
603+
*
604+
* @param string $taxonomy Identifier of the taxonomy, e.g.: category.
605+
* @param string $slug Slug of the term, e.g.: shoes.
606+
* @param WP_Block_Template $template Template to mutate adding the description and title computed.
607+
*
608+
* @return boolean True if an term referenced was found and false otherwise.
609+
*/
610+
function _wp_build_title_and_description_for_taxonomy_block_template( $taxonomy, $slug, WP_Block_Template $template ) {
611+
$taxonomy_object = get_taxonomy( $taxonomy );
612+
613+
$terms = get_terms(
614+
array(
615+
'taxonomy' => $taxonomy,
616+
'hide_empty' => false,
617+
'slug' => $slug,
618+
)
619+
);
620+
621+
if ( empty( $terms ) ) {
622+
$template->title = sprintf(
623+
// translators: Represents the title of a user's custom template in the Site Editor referencing a taxonomy term that was not found, where %1$s is the singular name of a taxonomy and %2$s is the slug of the deleted term, e.g. "Not found: Category(shoes)".
624+
__( 'Not found: %1$s(%2$s)' ),
625+
$taxonomy_object->labels->singular_name,
626+
$slug
627+
);
628+
return false;
629+
}
630+
631+
$term_title = $terms[0]->name;
632+
633+
$template->title = sprintf(
634+
// translators: Represents the title of a user's custom template in the Site Editor, where %1$s is the singular name of a taxonomy and %2$s is the name of the term, e.g. "Category: shoes".
635+
__( '%1$s: %2$s' ),
636+
$taxonomy_object->labels->singular_name,
637+
$term_title
638+
);
639+
$template->description = sprintf(
640+
// translators: Represents the description of a user's custom template in the Site Editor, e.g. "Template for Category: shoes".
641+
__( 'Template for %1$s' ),
642+
$term_title
643+
);
644+
645+
$terms_with_same_title = get_terms(
646+
array(
647+
'taxonomy' => $taxonomy,
648+
'hide_empty' => false,
649+
'name' => $term_title,
650+
)
651+
);
652+
if ( count( $terms_with_same_title ) > 1 ) {
653+
$template->title = sprintf(
654+
// translators: Represents the title of a user's custom template in the Site Editor, where %1$s is the template title and %2$s is the slug of the taxonomy, e.g. "Category: shoes (product_tag)".
655+
__( '%1$s (%2$s)' ),
656+
$template->title,
657+
$slug
658+
);
659+
}
660+
return true;
661+
}
662+
533663
/**
534664
* Builds a unified template object based a post Object.
535665
*
@@ -589,6 +719,103 @@ function _build_block_template_result_from_post( $post ) {
589719
}
590720
}
591721

722+
// If it is a block template without description and without title or with title equal to the slug.
723+
if ( 'wp_template' === $post->post_type && empty( $template->description ) && ( empty( $template->title ) || $template->title === $template->slug ) ) {
724+
$matches = array();
725+
// If it is a block template for a single author, page, post, tag, category, custom post type or custom taxonomy.
726+
if ( preg_match( '/(author|page|single|tag|category|taxonomy)-(.+)/', $template->slug, $matches ) ) {
727+
$type = $matches[1];
728+
$slug_remaining = $matches[2];
729+
switch ( $type ) {
730+
case 'author':
731+
$nice_name = $slug_remaining;
732+
$users = get_users(
733+
array(
734+
'capability' => 'edit_posts',
735+
'search' => $nice_name,
736+
'search_columns' => array( 'user_nicename' ),
737+
'fields' => 'display_name',
738+
)
739+
);
740+
741+
if ( empty( $users ) ) {
742+
$template->title = sprintf(
743+
// translators: Represents the title of a user's custom template in the Site Editor referencing a deleted author, where %s is the author's nicename, e.g. "Deleted author: jane-doe".
744+
__( 'Deleted author: %s' ),
745+
$nice_name
746+
);
747+
} else {
748+
$author_name = $users[0];
749+
750+
$template->title = sprintf(
751+
// translators: Represents the title of a user's custom template in the Site Editor, where %s is the author's name, e.g. "Author: Jane Doe".
752+
__( 'Author: %s' ),
753+
$author_name
754+
);
755+
$template->description = sprintf(
756+
// translators: Represents the description of a user's custom template in the Site Editor, e.g. "Template for Author: Jane Doe".
757+
__( 'Template for %1$s' ),
758+
$author_name
759+
);
760+
761+
$users_with_same_name = get_users(
762+
array(
763+
'capability' => 'edit_posts',
764+
'search' => $author_name,
765+
'search_columns' => array( 'display_name' ),
766+
'fields' => 'display_name',
767+
)
768+
);
769+
if ( count( $users_with_same_name ) > 1 ) {
770+
$template->title = sprintf(
771+
// translators: Represents the title of a user's custom template in the Site Editor, where %1$s is the template title of an author template and %2$s is the nicename of the author, e.g. "Author: Jorge (jorge-costa)".
772+
__( '%1$s (%2$s)' ),
773+
$template->title,
774+
$nice_name
775+
);
776+
}
777+
}
778+
break;
779+
case 'page':
780+
_wp_build_title_and_description_for_single_post_type_block_template( 'page', $slug_remaining, $template );
781+
break;
782+
case 'single':
783+
$post_types = get_post_types();
784+
foreach ( $post_types as $post_type ) {
785+
$post_type_length = strlen( $post_type ) + 1;
786+
// If $slug_remaining starts with $post_type followed by a hyphen.
787+
if ( 0 === strncmp( $slug_remaining, $post_type . '-', $post_type_length ) ) {
788+
$slug = substr( $slug_remaining, $post_type_length, strlen( $slug_remaining ) );
789+
$found = _wp_build_title_and_description_for_single_post_type_block_template( $post_type, $slug, $template );
790+
if ( $found ) {
791+
break;
792+
}
793+
}
794+
}
795+
break;
796+
case 'tag':
797+
_wp_build_title_and_description_for_taxonomy_block_template( 'post_tag', $slug_remaining, $template );
798+
break;
799+
case 'category':
800+
_wp_build_title_and_description_for_taxonomy_block_template( 'category', $slug_remaining, $template );
801+
break;
802+
case 'taxonomy':
803+
$taxonomies = get_taxonomies();
804+
foreach ( $taxonomies as $taxonomy ) {
805+
$taxonomy_length = strlen( $taxonomy ) + 1;
806+
// If $slug_remaining starts with $taxonomy followed by a hyphen.
807+
if ( 0 === strncmp( $slug_remaining, $taxonomy . '-', $taxonomy_length ) ) {
808+
$slug = substr( $slug_remaining, $taxonomy_length, strlen( $slug_remaining ) );
809+
$found = _wp_build_title_and_description_for_taxonomy_block_template( $taxonomy, $slug, $template );
810+
if ( $found ) {
811+
break;
812+
}
813+
}
814+
}
815+
break;
816+
}
817+
}
818+
}
592819
return $template;
593820
}
594821

0 commit comments

Comments
 (0)