-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
Copy pathcompat.php
151 lines (141 loc) · 4.57 KB
/
compat.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
/**
* Temporary compatibility shims for features present in Gutenberg, pending
* upstream commit to the WordPress core source repository. Functions here
* exist only as long as necessary for corresponding WordPress support, and
* each should be associated with a Trac ticket.
*
* @package gutenberg
*/
if ( ! function_exists( 'register_block_type_from_metadata' ) ) {
/**
* Registers a block type from metadata stored in the `block.json` file.
*
* @since 7.8.0
*
* @param string $path Path to the folder where the `block.json` file is located.
* @param array $args {
* Optional. Array of block type arguments. Any arguments may be defined, however the
* ones described below are supported by default. Default empty array.
*
* @type callable $render_callback Callback used to render blocks of this block type.
* }
* @return WP_Block_Type|false The registered block type on success, or false on failure.
*/
function register_block_type_from_metadata( $path, $args = array() ) {
$file = trailingslashit( $path ) . 'block.json';
if ( ! file_exists( $file ) ) {
return false;
}
$metadata = json_decode( file_get_contents( $file ), true );
if ( ! is_array( $metadata ) ) {
return false;
}
return register_block_type(
$metadata['name'],
array_merge(
$metadata,
$args
)
);
}
}
/**
* Adds a polyfill for the WHATWG URL in environments which do not support it.
* The intention in how this action is handled is under the assumption that this
* code would eventually be placed at `wp_default_packages_vendor`, which is
* called as a result of `wp_default_packages` via the `wp_default_scripts`.
*
* This can be removed when plugin support requires WordPress 5.4.0+.
*
* @see https://core.trac.wordpress.org/ticket/49360
* @see https://developer.mozilla.org/en-US/docs/Web/API/URL/URL
* @see https://developer.wordpress.org/reference/functions/wp_default_packages_vendor/
*
* @since 7.3.0
*
* @param WP_Scripts $scripts WP_Scripts object.
*/
function gutenberg_add_url_polyfill( $scripts ) {
// Only register polyfill if not already registered. This prevents handling
// in an environment where core has updated to manage the polyfill. This
// depends on the action being handled after default script registration.
$is_polyfill_script_registered = (bool) $scripts->query( 'wp-polyfill-url', 'registered' );
if ( $is_polyfill_script_registered ) {
return;
}
gutenberg_register_vendor_script(
$scripts,
'wp-polyfill-url',
'https://unpkg.com/[email protected]/polyfills/URL/polyfill.js',
array(),
'3.42.0'
);
did_action( 'init' ) && $scripts->add_inline_script(
'wp-polyfill',
wp_get_script_polyfill(
$scripts,
array(
'\'URL\' in window' => 'wp-polyfill-url',
)
)
);
}
add_action( 'wp_default_scripts', 'gutenberg_add_url_polyfill', 20 );
/**
* Adds a polyfill for DOMRect in environments which do not support it.
*
* This can be removed when plugin support requires WordPress 5.4.0+.
*
* @see gutenberg_add_url_polyfill
* @see https://core.trac.wordpress.org/ticket/49360
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMRect
* @see https://developer.wordpress.org/reference/functions/wp_default_packages_vendor/
*
* @since 7.5.0
*
* @param WP_Scripts $scripts WP_Scripts object.
*/
function gutenberg_add_dom_rect_polyfill( $scripts ) {
// Only register polyfill if not already registered. This prevents handling
// in an environment where core has updated to manage the polyfill. This
// depends on the action being handled after default script registration.
$is_polyfill_script_registered = (bool) $scripts->query( 'wp-polyfill-dom-rect', 'registered' );
if ( $is_polyfill_script_registered ) {
return;
}
gutenberg_register_vendor_script(
$scripts,
'wp-polyfill-dom-rect',
'https://unpkg.com/[email protected]/polyfills/DOMRect/polyfill.js',
array(),
'3.42.0'
);
did_action( 'init' ) && $scripts->add_inline_script(
'wp-polyfill',
wp_get_script_polyfill(
$scripts,
array(
'window.DOMRect' => 'wp-polyfill-dom-rect',
)
)
);
}
add_action( 'wp_default_scripts', 'gutenberg_add_dom_rect_polyfill', 20 );
/**
* Sets the current post for usage in template blocks.
*
* @return WP_Post|null The post if any, or null otherwise.
*/
function gutenberg_get_post_from_context() {
// TODO: Without this temporary fix, an infinite loop can occur where
// posts with post content blocks render themselves recursively.
if ( is_admin() || defined( 'REST_REQUEST' ) ) {
return null;
}
if ( ! in_the_loop() ) {
rewind_posts();
the_post();
}
return get_post();
}