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