wp/wp-includes/theme-templates.php
changeset 18 be944660c56a
child 19 3d72ae0968f4
equal deleted inserted replaced
17:34716fd837a4 18:be944660c56a
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * Generates a unique slug for templates.
       
     5  *
       
     6  * @access private
       
     7  * @since 5.8.0
       
     8  *
       
     9  * @param string $override_slug The filtered value of the slug (starts as `null` from apply_filter).
       
    10  * @param string $slug          The original/un-filtered slug (post_name).
       
    11  * @param int    $post_ID       Post ID.
       
    12  * @param string $post_status   No uniqueness checks are made if the post is still draft or pending.
       
    13  * @param string $post_type     Post type.
       
    14  * @return string The original, desired slug.
       
    15  */
       
    16 function wp_filter_wp_template_unique_post_slug( $override_slug, $slug, $post_ID, $post_status, $post_type ) {
       
    17 	if ( 'wp_template' !== $post_type ) {
       
    18 		return $override_slug;
       
    19 	}
       
    20 
       
    21 	if ( ! $override_slug ) {
       
    22 		$override_slug = $slug;
       
    23 	}
       
    24 
       
    25 	/*
       
    26 	 * Template slugs must be unique within the same theme.
       
    27 	 * TODO - Figure out how to update this to work for a multi-theme environment.
       
    28 	 * Unfortunately using `get_the_terms()` for the 'wp-theme' term does not work
       
    29 	 * in the case of new entities since is too early in the process to have been saved
       
    30 	 * to the entity. So for now we use the currently activated theme for creation.
       
    31 	 */
       
    32 	$theme = wp_get_theme()->get_stylesheet();
       
    33 	$terms = get_the_terms( $post_ID, 'wp_theme' );
       
    34 	if ( $terms && ! is_wp_error( $terms ) ) {
       
    35 		$theme = $terms[0]->name;
       
    36 	}
       
    37 
       
    38 	$check_query_args = array(
       
    39 		'post_name__in'  => array( $override_slug ),
       
    40 		'post_type'      => $post_type,
       
    41 		'posts_per_page' => 1,
       
    42 		'no_found_rows'  => true,
       
    43 		'post__not_in'   => array( $post_ID ),
       
    44 		'tax_query'      => array(
       
    45 			array(
       
    46 				'taxonomy' => 'wp_theme',
       
    47 				'field'    => 'name',
       
    48 				'terms'    => $theme,
       
    49 			),
       
    50 		),
       
    51 	);
       
    52 	$check_query      = new WP_Query( $check_query_args );
       
    53 	$posts            = $check_query->posts;
       
    54 
       
    55 	if ( count( $posts ) > 0 ) {
       
    56 		$suffix = 2;
       
    57 		do {
       
    58 			$query_args                  = $check_query_args;
       
    59 			$alt_post_name               = _truncate_post_slug( $override_slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
       
    60 			$query_args['post_name__in'] = array( $alt_post_name );
       
    61 			$query                       = new WP_Query( $query_args );
       
    62 			$suffix++;
       
    63 		} while ( count( $query->posts ) > 0 );
       
    64 		$override_slug = $alt_post_name;
       
    65 	}
       
    66 
       
    67 	return $override_slug;
       
    68 }
       
    69 
       
    70 /**
       
    71  * Print the skip-link script & styles.
       
    72  *
       
    73  * @access private
       
    74  * @since 5.8.0
       
    75  *
       
    76  * @global string $_wp_current_template_content
       
    77  *
       
    78  * @return void
       
    79  */
       
    80 function the_block_template_skip_link() {
       
    81 	global $_wp_current_template_content;
       
    82 
       
    83 	// Early exit if not a block theme.
       
    84 	if ( ! current_theme_supports( 'block-templates' ) ) {
       
    85 		return;
       
    86 	}
       
    87 
       
    88 	// Early exit if not a block template.
       
    89 	if ( ! $_wp_current_template_content ) {
       
    90 		return;
       
    91 	}
       
    92 	?>
       
    93 
       
    94 	<?php
       
    95 	/**
       
    96 	 * Print the skip-link styles.
       
    97 	 */
       
    98 	?>
       
    99 	<style id="skip-link-styles">
       
   100 		.skip-link.screen-reader-text {
       
   101 			border: 0;
       
   102 			clip: rect(1px,1px,1px,1px);
       
   103 			clip-path: inset(50%);
       
   104 			height: 1px;
       
   105 			margin: -1px;
       
   106 			overflow: hidden;
       
   107 			padding: 0;
       
   108 			position: absolute !important;
       
   109 			width: 1px;
       
   110 			word-wrap: normal !important;
       
   111 		}
       
   112 
       
   113 		.skip-link.screen-reader-text:focus {
       
   114 			background-color: #eee;
       
   115 			clip: auto !important;
       
   116 			clip-path: none;
       
   117 			color: #444;
       
   118 			display: block;
       
   119 			font-size: 1em;
       
   120 			height: auto;
       
   121 			left: 5px;
       
   122 			line-height: normal;
       
   123 			padding: 15px 23px 14px;
       
   124 			text-decoration: none;
       
   125 			top: 5px;
       
   126 			width: auto;
       
   127 			z-index: 100000;
       
   128 		}
       
   129 	</style>
       
   130 	<?php
       
   131 	/**
       
   132 	 * Print the skip-link script.
       
   133 	 */
       
   134 	?>
       
   135 	<script>
       
   136 	( function() {
       
   137 		var skipLinkTarget = document.querySelector( 'main' ),
       
   138 			parentEl,
       
   139 			skipLinkTargetID,
       
   140 			skipLink;
       
   141 
       
   142 		// Early exit if a skip-link target can't be located.
       
   143 		if ( ! skipLinkTarget ) {
       
   144 			return;
       
   145 		}
       
   146 
       
   147 		// Get the site wrapper.
       
   148 		// The skip-link will be injected in the beginning of it.
       
   149 		parentEl = document.querySelector( '.wp-site-blocks' );
       
   150 
       
   151 		// Early exit if the root element was not found.
       
   152 		if ( ! parentEl ) {
       
   153 			return;
       
   154 		}
       
   155 
       
   156 		// Get the skip-link target's ID, and generate one if it doesn't exist.
       
   157 		skipLinkTargetID = skipLinkTarget.id;
       
   158 		if ( ! skipLinkTargetID ) {
       
   159 			skipLinkTargetID = 'wp--skip-link--target';
       
   160 			skipLinkTarget.id = skipLinkTargetID;
       
   161 		}
       
   162 
       
   163 		// Create the skip link.
       
   164 		skipLink = document.createElement( 'a' );
       
   165 		skipLink.classList.add( 'skip-link', 'screen-reader-text' );
       
   166 		skipLink.href = '#' + skipLinkTargetID;
       
   167 		skipLink.innerHTML = '<?php esc_html_e( 'Skip to content' ); ?>';
       
   168 
       
   169 		// Inject the skip link.
       
   170 		parentEl.insertAdjacentElement( 'afterbegin', skipLink );
       
   171 	}() );
       
   172 	</script>
       
   173 	<?php
       
   174 }
       
   175 
       
   176 /**
       
   177  * Enable the block templates (editor mode) for themes with theme.json by default.
       
   178  *
       
   179  * @access private
       
   180  * @since 5.8.0
       
   181  */
       
   182 function wp_enable_block_templates() {
       
   183 	if ( WP_Theme_JSON_Resolver::theme_has_support() ) {
       
   184 		add_theme_support( 'block-templates' );
       
   185 	}
       
   186 }