at path:ROOT / wp-includes / embed.php
run:R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
23.8 KB
2026-03-11 16:18:51
R W Run
7.8 KB
2026-03-11 16:18:52
R W Run
36.1 KB
2026-03-11 16:18:51
R W Run
11.9 KB
2026-03-11 16:18:52
R W Run
18.94 KB
2026-03-11 16:18:52
R W Run
7.35 KB
2026-03-11 16:18:52
R W Run
28.6 KB
2026-03-11 16:18:51
R W Run
316 By
2026-03-11 16:18:51
R W Run
12.9 KB
2026-03-11 16:18:51
R W Run
61.02 KB
2026-03-11 16:18:52
R W Run
15 KB
2026-03-11 16:18:51
R W Run
112.05 KB
2026-03-11 16:18:51
R W Run
12.47 KB
2026-03-11 16:18:51
R W Run
15.07 KB
2026-03-11 16:18:52
R W Run
9.84 KB
2026-03-11 16:18:52
R W Run
13.17 KB
2026-03-11 16:18:52
R W Run
33.83 KB
2026-03-11 16:18:51
R W Run
42.63 KB
2026-03-11 16:18:51
R W Run
55.71 KB
2026-03-11 16:18:52
R W Run
12.53 KB
2026-03-11 16:18:51
R W Run
2.55 KB
2026-03-11 16:18:52
R W Run
28.92 KB
2026-03-11 16:18:52
R W Run
539 By
2026-03-11 16:18:51
R W Run
367 By
2026-03-11 16:18:52
R W Run
42.65 KB
2026-03-11 16:18:51
R W Run
401 By
2026-03-11 16:18:51
R W Run
6.61 KB
2026-03-11 16:18:51
R W Run
664 By
2026-03-11 16:18:52
R W Run
20.63 KB
2026-03-11 16:18:51
R W Run
2.18 KB
2026-03-11 16:18:52
R W Run
453 By
2026-03-11 16:18:52
R W Run
457 By
2026-03-11 16:18:51
R W Run
36.83 KB
2026-03-11 16:18:52
R W Run
2.41 KB
2026-03-11 16:18:52
R W Run
8.28 KB
2026-03-11 16:18:51
R W Run
13.89 KB
2026-03-11 16:18:51
R W Run
11.76 KB
2026-03-11 16:18:51
R W Run
2.65 KB
2026-03-11 16:18:51
R W Run
7.43 KB
2026-03-11 16:18:51
R W Run
17.46 KB
2026-03-11 16:18:51
R W Run
5.14 KB
2026-03-11 16:18:52
R W Run
16.7 KB
2026-03-11 16:18:51
R W Run
8.28 KB
2026-03-11 16:18:52
R W Run
2.92 KB
2026-03-11 16:18:52
R W Run
1.32 KB
2026-03-11 16:18:51
R W Run
4.6 KB
2026-03-11 16:18:52
R W Run
11.62 KB
2026-03-11 16:18:52
R W Run
2.5 KB
2026-03-11 16:18:51
R W Run
1.97 KB
2026-03-11 16:18:51
R W Run
11.25 KB
2026-03-11 16:18:52
R W Run
5.32 KB
2026-03-11 16:18:51
R W Run
10.99 KB
2026-03-11 16:18:52
R W Run
68.32 KB
2026-03-11 16:18:51
R W Run
6.34 KB
2026-03-11 16:18:51
R W Run
5.49 KB
2026-03-11 16:18:51
R W Run
1.99 KB
2026-03-11 16:18:52
R W Run
7.02 KB
2026-03-11 16:18:51
R W Run
4.91 KB
2026-03-11 16:18:52
R W Run
16.86 KB
2026-03-11 16:18:51
R W Run
24.23 KB
2026-03-11 16:18:51
R W Run
3.97 KB
2026-03-11 16:18:51
R W Run
47.66 KB
2026-03-11 16:18:51
R W Run
9.22 KB
2026-03-11 16:18:51
R W Run
25.51 KB
2026-03-11 16:18:51
R W Run
198.38 KB
2026-03-11 16:18:52
R W Run
56.65 KB
2026-03-11 16:18:51
R W Run
10.46 KB
2026-03-11 16:18:51
R W Run
10.95 KB
2026-03-11 16:18:52
R W Run
29.26 KB
2026-03-11 16:18:51
R W Run
70.91 KB
2026-03-11 16:18:52
R W Run
35.3 KB
2026-03-11 16:18:52
R W Run
16.61 KB
2026-03-11 16:18:52
R W Run
2.57 KB
2026-03-11 16:18:52
R W Run
39.83 KB
2026-03-11 16:18:51
R W Run
70.64 KB
2026-03-11 16:18:51
R W Run
15.56 KB
2026-03-11 16:18:52
R W Run
7.33 KB
2026-03-11 16:18:52
R W Run
253 By
2026-03-11 16:18:51
R W Run
7.96 KB
2026-03-11 16:18:52
R W Run
3.23 KB
2026-03-11 16:18:52
R W Run
969 By
2026-03-11 16:18:52
R W Run
16.28 KB
2026-03-11 16:18:51
R W Run
7.22 KB
2026-03-11 16:18:51
R W Run
12.95 KB
2026-03-11 16:18:51
R W Run
6.53 KB
2026-03-11 16:18:51
R W Run
3.42 KB
2026-03-11 16:18:52
R W Run
5.84 KB
2026-03-11 16:18:51
R W Run
1.97 KB
2026-03-11 16:18:51
R W Run
4.3 KB
2026-03-11 16:18:52
R W Run
2.91 KB
2026-03-11 16:18:51
R W Run
16.46 KB
2026-03-11 16:18:52
R W Run
40.6 KB
2026-03-11 16:18:51
R W Run
20.22 KB
2026-03-11 16:18:51
R W Run
36.11 KB
2026-03-11 16:18:52
R W Run
17.01 KB
2026-03-11 16:18:51
R W Run
7.27 KB
2026-03-11 16:18:52
R W Run
6.62 KB
2026-03-11 16:18:52
R W Run
16.49 KB
2026-03-11 16:18:52
R W Run
1.79 KB
2026-03-11 16:18:52
R W Run
29.82 KB
2026-03-11 16:18:51
R W Run
6.67 KB
2026-03-11 16:18:52
R W Run
8.98 KB
2026-03-11 16:18:52
R W Run
19.42 KB
2026-03-11 16:18:51
R W Run
12.01 KB
2026-03-11 16:18:51
R W Run
17.11 KB
2026-03-11 16:18:51
R W Run
6.74 KB
2026-03-11 16:18:52
R W Run
30.93 KB
2026-03-11 16:18:51
R W Run
4.99 KB
2026-03-11 16:18:51
R W Run
4.25 KB
2026-03-11 16:18:51
R W Run
24.72 KB
2026-03-11 16:18:51
R W Run
29.96 KB
2026-03-11 16:18:52
R W Run
6.41 KB
2026-03-11 16:18:51
R W Run
160 KB
2026-03-11 16:18:51
R W Run
6.72 KB
2026-03-11 16:18:52
R W Run
10.92 KB
2026-03-11 16:18:51
R W Run
4.77 KB
2026-03-11 16:18:51
R W Run
3.38 KB
2026-03-11 16:18:51
R W Run
11.18 KB
2026-03-11 16:18:51
R W Run
62.19 KB
2026-03-11 16:18:51
R W Run
2.46 KB
2026-03-11 16:18:51
R W Run
9.17 KB
2026-03-11 16:18:51
R W Run
32.15 KB
2026-03-11 16:18:51
R W Run
34.05 KB
2026-03-11 16:18:52
R W Run
7.15 KB
2026-03-11 16:18:51
R W Run
3.47 KB
2026-03-11 16:18:52
R W Run
1.87 KB
2026-03-11 16:18:52
R W Run
30.91 KB
2026-03-11 16:18:51
R W Run
7.29 KB
2026-03-11 16:18:52
R W Run
7.35 KB
2026-03-11 16:18:51
R W Run
12.54 KB
2026-03-11 16:18:51
R W Run
19.12 KB
2026-03-11 16:18:51
R W Run
18.12 KB
2026-03-11 16:18:52
R W Run
39.99 KB
2026-03-11 16:18:52
R W Run
5.17 KB
2026-03-11 16:18:52
R W Run
979 By
2026-03-11 16:18:51
R W Run
18.44 KB
2026-03-11 16:18:52
R W Run
10.24 KB
2026-03-11 16:18:51
R W Run
1.77 KB
2026-03-11 16:18:52
R W Run
34.9 KB
2026-03-11 16:18:51
R W Run
7.19 KB
2026-03-11 16:18:52
R W Run
160.5 KB
2026-03-11 16:18:51
R W Run
64.27 KB
2026-03-11 16:18:51
R W Run
27.95 KB
2026-03-11 16:18:51
R W Run
4.69 KB
2026-03-11 16:18:51
R W Run
2.94 KB
2026-03-11 16:18:51
R W Run
43.13 KB
2026-03-11 16:18:52
R W Run
2.25 KB
2026-03-11 16:18:52
R W Run
22.5 KB
2026-03-11 16:18:51
R W Run
13.01 KB
2026-03-11 16:18:52
R W Run
3.27 KB
2026-03-11 16:18:51
R W Run
18 KB
2026-03-11 16:18:51
R W Run
210.4 KB
2026-03-11 16:18:52
R W Run
25.86 KB
2026-03-11 16:18:52
R W Run
115.85 KB
2026-03-11 16:18:51
R W Run
373 By
2026-03-11 16:18:52
R W Run
343 By
2026-03-11 16:18:52
R W Run
338 By
2026-03-11 16:18:51
R W Run
100.73 KB
2026-03-11 16:18:52
R W Run
130.93 KB
2026-03-11 16:18:51
R W Run
19.1 KB
2026-03-11 16:18:51
R W Run
17.41 KB
2026-03-11 16:18:52
R W Run
41.98 KB
2026-03-11 16:18:52
R W Run
400 By
2026-03-11 16:18:52
R W Run
11.1 KB
2026-03-11 16:18:52
R W Run
37.02 KB
2026-03-11 16:18:51
R W Run
2.24 KB
2026-03-11 16:18:51
R W Run
188.13 KB
2026-03-11 16:18:51
R W Run
338 By
2026-03-11 16:18:51
R W Run
38 KB
2026-03-11 16:18:51
R W Run
4.02 KB
2026-03-11 16:18:52
R W Run
5.38 KB
2026-03-11 16:18:51
R W Run
3.05 KB
2026-03-11 16:18:52
R W Run
2.61 KB
2026-03-11 16:18:51
R W Run
1.16 KB
2026-03-11 16:18:52
R W Run
4.04 KB
2026-03-11 16:18:51
R W Run
3.71 KB
2026-03-11 16:18:51
R W Run
24.6 KB
2026-03-11 16:18:51
R W Run
9.56 KB
2026-03-11 16:18:51
R W Run
346.43 KB
2026-03-11 16:18:52
R W Run
281.84 KB
2026-03-11 16:18:52
R W Run
14.95 KB
2026-03-11 16:18:51
R W Run
8.44 KB
2026-03-11 16:18:52
R W Run
168.95 KB
2026-03-11 16:18:52
R W Run
20.71 KB
2026-03-11 16:18:52
R W Run
25.27 KB
2026-03-11 16:18:51
R W Run
5.72 KB
2026-03-11 16:18:51
R W Run
4.63 KB
2026-03-11 16:18:52
R W Run
81.73 KB
2026-03-11 16:18:51
R W Run
67.18 KB
2026-03-11 16:18:51
R W Run
156.36 KB
2026-03-11 16:18:52
R W Run
55.19 KB
2026-03-11 16:18:51
R W Run
162 By
2026-03-11 16:18:51
R W Run
61.72 KB
2026-03-11 16:18:51
R W Run
216.06 KB
2026-03-11 16:18:52
R W Run
65.09 KB
2026-03-11 16:18:51
R W Run
25.24 KB
2026-03-11 16:18:52
R W Run
4.81 KB
2026-03-11 16:18:51
R W Run
6.48 KB
2026-03-11 16:18:52
R W Run
21.25 KB
2026-03-11 16:18:51
R W Run
2.79 KB
2026-03-11 16:18:52
R W Run
89.69 KB
2026-03-11 16:18:52
R W Run
19.42 KB
2026-03-11 16:18:52
R W Run
3.69 KB
2026-03-11 16:18:52
R W Run
4.11 KB
2026-03-11 16:18:51
R W Run
40.74 KB
2026-03-11 16:18:51
R W Run
25.38 KB
2026-03-11 16:18:51
R W Run
43.31 KB
2026-03-11 16:18:52
R W Run
102.57 KB
2026-03-11 16:18:52
R W Run
6.18 KB
2026-03-11 16:18:51
R W Run
124.47 KB
2026-03-11 16:18:52
R W Run
35.65 KB
2026-03-11 16:18:52
R W Run
6.94 KB
2026-03-11 16:18:52
R W Run
67.04 KB
2026-03-11 16:18:52
R W Run
10.62 KB
2026-03-11 16:18:51
R W Run
289.35 KB
2026-03-11 16:18:52
R W Run
36.23 KB
2026-03-11 16:18:51
R W Run
200 By
2026-03-11 16:18:52
R W Run
200 By
2026-03-11 16:18:52
R W Run
98.29 KB
2026-03-11 16:18:52
R W Run
30.02 KB
2026-03-11 16:18:52
R W Run
19.03 KB
2026-03-11 16:18:52
R W Run
5.06 KB
2026-03-11 16:18:52
R W Run
255 By
2026-03-11 16:18:51
R W Run
22.66 KB
2026-03-11 16:18:52
R W Run
154.63 KB
2026-03-11 16:18:51
R W Run
9.68 KB
2026-03-11 16:18:51
R W Run
258 By
2026-03-11 16:18:51
R W Run
23.49 KB
2026-03-11 16:18:51
R W Run
3.16 KB
2026-03-11 16:18:51
R W Run
8.4 KB
2026-03-11 16:18:52
R W Run
441 By
2026-03-11 16:18:51
R W Run
7.39 KB
2026-03-11 16:18:51
R W Run
173 KB
2026-03-11 16:18:52
R W Run
544 By
2026-03-11 16:18:52
R W Run
4.17 KB
2026-03-11 16:18:51
R W Run
35.97 KB
2026-03-11 16:18:52
R W Run
1.69 KB
2026-03-11 16:18:51
R W Run
2.84 KB
2026-03-11 16:18:52
R W Run
6.09 KB
2026-03-11 16:18:51
R W Run
8.71 KB
2026-03-11 16:18:51
R W Run
131.84 KB
2026-03-11 16:18:51
R W Run
37.45 KB
2026-03-11 16:18:51
R W Run
173.89 KB
2026-03-11 16:18:51
R W Run
7.09 KB
2026-03-11 16:18:51
R W Run
6.41 KB
2026-03-11 16:18:51
R W Run
1.08 KB
2026-03-11 16:18:51
R W Run
69.46 KB
2026-03-11 16:18:52
R W Run
445 By
2026-03-11 16:18:51
R W Run
799 By
2026-03-11 16:18:52
R W Run
error_log
📄embed.php
1<?php
2/**
3 * oEmbed API: Top-level oEmbed functionality
4 *
5 * @package WordPress
6 * @subpackage oEmbed
7 * @since 4.4.0
8 */
9
10/**
11 * Registers an embed handler.
12 *
13 * Should probably only be used for sites that do not support oEmbed.
14 *
15 * @since 2.9.0
16 *
17 * @global WP_Embed $wp_embed WordPress Embed object.
18 *
19 * @param string $id An internal ID/name for the handler. Needs to be unique.
20 * @param string $regex The regex that will be used to see if this handler should be used for a URL.
21 * @param callable $callback The callback function that will be called if the regex is matched.
22 * @param int $priority Optional. Used to specify the order in which the registered handlers will
23 * be tested. Default 10.
24 */
25function wp_embed_register_handler( $id, $regex, $callback, $priority = 10 ) {
26 global $wp_embed;
27 $wp_embed->register_handler( $id, $regex, $callback, $priority );
28}
29
30/**
31 * Unregisters a previously-registered embed handler.
32 *
33 * @since 2.9.0
34 *
35 * @global WP_Embed $wp_embed WordPress Embed object.
36 *
37 * @param string $id The handler ID that should be removed.
38 * @param int $priority Optional. The priority of the handler to be removed. Default 10.
39 */
40function wp_embed_unregister_handler( $id, $priority = 10 ) {
41 global $wp_embed;
42 $wp_embed->unregister_handler( $id, $priority );
43}
44
45/**
46 * Creates default array of embed parameters.
47 *
48 * The width defaults to the content width as specified by the theme. If the
49 * theme does not specify a content width, then 500px is used.
50 *
51 * The default height is 1.5 times the width, or 1000px, whichever is smaller.
52 *
53 * The {@see 'embed_defaults'} filter can be used to adjust either of these values.
54 *
55 * @since 2.9.0
56 *
57 * @global int $content_width
58 *
59 * @param string $url Optional. The URL that should be embedded. Default empty.
60 * @return int[] {
61 * Indexed array of the embed width and height in pixels.
62 *
63 * @type int $0 The embed width.
64 * @type int $1 The embed height.
65 * }
66 */
67function wp_embed_defaults( $url = '' ) {
68 if ( ! empty( $GLOBALS['content_width'] ) ) {
69 $width = (int) $GLOBALS['content_width'];
70 }
71
72 if ( empty( $width ) ) {
73 $width = 500;
74 }
75
76 $height = min( (int) ceil( $width * 1.5 ), 1000 );
77
78 /**
79 * Filters the default array of embed dimensions.
80 *
81 * @since 2.9.0
82 *
83 * @param int[] $size {
84 * Indexed array of the embed width and height in pixels.
85 *
86 * @type int $0 The embed width.
87 * @type int $1 The embed height.
88 * }
89 * @param string $url The URL that should be embedded.
90 */
91 return apply_filters( 'embed_defaults', compact( 'width', 'height' ), $url );
92}
93
94/**
95 * Attempts to fetch the embed HTML for a provided URL using oEmbed.
96 *
97 * @since 2.9.0
98 *
99 * @see WP_oEmbed
100 *
101 * @param string $url The URL that should be embedded.
102 * @param array|string $args {
103 * Optional. Additional arguments for retrieving embed HTML. Default empty.
104 *
105 * @type int|string $width Optional. The `maxwidth` value passed to the provider URL.
106 * @type int|string $height Optional. The `maxheight` value passed to the provider URL.
107 * @type bool $discover Optional. Determines whether to attempt to discover link tags
108 * at the given URL for an oEmbed provider when the provider URL
109 * is not found in the built-in providers list. Default true.
110 * }
111 * @return string|false The embed HTML on success, false on failure.
112 */
113function wp_oembed_get( $url, $args = '' ) {
114 $oembed = _wp_oembed_get_object();
115 return $oembed->get_html( $url, $args );
116}
117
118/**
119 * Returns the initialized WP_oEmbed object.
120 *
121 * @since 2.9.0
122 * @access private
123 *
124 * @return WP_oEmbed object.
125 */
126function _wp_oembed_get_object() {
127 static $wp_oembed = null;
128
129 if ( is_null( $wp_oembed ) ) {
130 $wp_oembed = new WP_oEmbed();
131 }
132 return $wp_oembed;
133}
134
135/**
136 * Adds a URL format and oEmbed provider URL pair.
137 *
138 * @since 2.9.0
139 *
140 * @see WP_oEmbed
141 *
142 * @param string $format The format of URL that this provider can handle. You can use asterisks
143 * as wildcards.
144 * @param string $provider The URL to the oEmbed provider.
145 * @param bool $regex Optional. Whether the `$format` parameter is in a RegEx format. Default false.
146 */
147function wp_oembed_add_provider( $format, $provider, $regex = false ) {
148 if ( did_action( 'plugins_loaded' ) ) {
149 $oembed = _wp_oembed_get_object();
150 $oembed->providers[ $format ] = array( $provider, $regex );
151 } else {
152 WP_oEmbed::_add_provider_early( $format, $provider, $regex );
153 }
154}
155
156/**
157 * Removes an oEmbed provider.
158 *
159 * @since 3.5.0
160 *
161 * @see WP_oEmbed
162 *
163 * @param string $format The URL format for the oEmbed provider to remove.
164 * @return bool Was the provider removed successfully?
165 */
166function wp_oembed_remove_provider( $format ) {
167 if ( did_action( 'plugins_loaded' ) ) {
168 $oembed = _wp_oembed_get_object();
169
170 if ( isset( $oembed->providers[ $format ] ) ) {
171 unset( $oembed->providers[ $format ] );
172 return true;
173 }
174 } else {
175 WP_oEmbed::_remove_provider_early( $format );
176 }
177
178 return false;
179}
180
181/**
182 * Determines if default embed handlers should be loaded.
183 *
184 * Checks to make sure that the embeds library hasn't already been loaded. If
185 * it hasn't, then it will load the embeds library.
186 *
187 * @since 2.9.0
188 *
189 * @see wp_embed_register_handler()
190 */
191function wp_maybe_load_embeds() {
192 /**
193 * Filters whether to load the default embed handlers.
194 *
195 * Returning a falsey value will prevent loading the default embed handlers.
196 *
197 * @since 2.9.0
198 *
199 * @param bool $maybe_load_embeds Whether to load the embeds library. Default true.
200 */
201 if ( ! apply_filters( 'load_default_embeds', true ) ) {
202 return;
203 }
204
205 wp_embed_register_handler( 'youtube_embed_url', '#https?://(www\.)?youtube\.com/(?:v|embed)/([^/]+)#i', 'wp_embed_handler_youtube' );
206
207 /**
208 * Filters the audio embed handler callback.
209 *
210 * @since 3.6.0
211 *
212 * @param callable $handler Audio embed handler callback function.
213 */
214 wp_embed_register_handler( 'audio', '#^https?://.+?\.(' . implode( '|', wp_get_audio_extensions() ) . ')$#i', apply_filters( 'wp_audio_embed_handler', 'wp_embed_handler_audio' ), 9999 );
215
216 /**
217 * Filters the video embed handler callback.
218 *
219 * @since 3.6.0
220 *
221 * @param callable $handler Video embed handler callback function.
222 */
223 wp_embed_register_handler( 'video', '#^https?://.+?\.(' . implode( '|', wp_get_video_extensions() ) . ')$#i', apply_filters( 'wp_video_embed_handler', 'wp_embed_handler_video' ), 9999 );
224}
225
226/**
227 * YouTube iframe embed handler callback.
228 *
229 * Catches YouTube iframe embed URLs that are not parsable by oEmbed but can be translated into a URL that is.
230 *
231 * @since 4.0.0
232 *
233 * @global WP_Embed $wp_embed WordPress Embed object.
234 *
235 * @param array $matches The RegEx matches from the provided regex when calling
236 * wp_embed_register_handler().
237 * @param array $attr Embed attributes.
238 * @param string $url The original URL that was matched by the regex.
239 * @param array $rawattr The original unmodified attributes.
240 * @return string The embed HTML.
241 */
242function wp_embed_handler_youtube( $matches, $attr, $url, $rawattr ) {
243 global $wp_embed;
244 $embed = $wp_embed->autoembed( sprintf( 'https://youtube.com/watch?v=%s', urlencode( $matches[2] ) ) );
245
246 /**
247 * Filters the YouTube embed output.
248 *
249 * @since 4.0.0
250 *
251 * @see wp_embed_handler_youtube()
252 *
253 * @param string $embed YouTube embed output.
254 * @param array $attr An array of embed attributes.
255 * @param string $url The original URL that was matched by the regex.
256 * @param array $rawattr The original unmodified attributes.
257 */
258 return apply_filters( 'wp_embed_handler_youtube', $embed, $attr, $url, $rawattr );
259}
260
261/**
262 * Audio embed handler callback.
263 *
264 * @since 3.6.0
265 *
266 * @param array $matches The RegEx matches from the provided regex when calling wp_embed_register_handler().
267 * @param array $attr Embed attributes.
268 * @param string $url The original URL that was matched by the regex.
269 * @param array $rawattr The original unmodified attributes.
270 * @return string The embed HTML.
271 */
272function wp_embed_handler_audio( $matches, $attr, $url, $rawattr ) {
273 $audio = sprintf( '[audio src="%s" /]', esc_url( $url ) );
274
275 /**
276 * Filters the audio embed output.
277 *
278 * @since 3.6.0
279 *
280 * @param string $audio Audio embed output.
281 * @param array $attr An array of embed attributes.
282 * @param string $url The original URL that was matched by the regex.
283 * @param array $rawattr The original unmodified attributes.
284 */
285 return apply_filters( 'wp_embed_handler_audio', $audio, $attr, $url, $rawattr );
286}
287
288/**
289 * Video embed handler callback.
290 *
291 * @since 3.6.0
292 *
293 * @param array $matches The RegEx matches from the provided regex when calling wp_embed_register_handler().
294 * @param array $attr Embed attributes.
295 * @param string $url The original URL that was matched by the regex.
296 * @param array $rawattr The original unmodified attributes.
297 * @return string The embed HTML.
298 */
299function wp_embed_handler_video( $matches, $attr, $url, $rawattr ) {
300 $dimensions = '';
301 if ( ! empty( $rawattr['width'] ) && ! empty( $rawattr['height'] ) ) {
302 $dimensions .= sprintf( 'width="%d" ', (int) $rawattr['width'] );
303 $dimensions .= sprintf( 'height="%d" ', (int) $rawattr['height'] );
304 }
305 $video = sprintf( '[video %s src="%s" /]', $dimensions, esc_url( $url ) );
306
307 /**
308 * Filters the video embed output.
309 *
310 * @since 3.6.0
311 *
312 * @param string $video Video embed output.
313 * @param array $attr An array of embed attributes.
314 * @param string $url The original URL that was matched by the regex.
315 * @param array $rawattr The original unmodified attributes.
316 */
317 return apply_filters( 'wp_embed_handler_video', $video, $attr, $url, $rawattr );
318}
319
320/**
321 * Registers the oEmbed REST API route.
322 *
323 * @since 4.4.0
324 */
325function wp_oembed_register_route() {
326 $controller = new WP_oEmbed_Controller();
327 $controller->register_routes();
328}
329
330/**
331 * Adds oEmbed discovery links in the head element of the website.
332 *
333 * @since 4.4.0
334 * @since 6.8.0 Output was adjusted to only embed if the post supports it.
335 * @since 6.9.0 Now runs first at `wp_head` priority 4, with a fallback to priority 10. This helps ensure the discovery links appear within the first 150KB.
336 */
337function wp_oembed_add_discovery_links() {
338 if ( doing_action( 'wp_head' ) ) {
339 // For back-compat, short-circuit if a plugin has removed the action at the original priority.
340 if ( ! has_action( 'wp_head', 'wp_oembed_add_discovery_links', 10 ) ) {
341 return;
342 }
343
344 // Prevent running again at the original priority.
345 remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
346 }
347
348 $output = '';
349
350 if ( is_singular() && is_post_embeddable() ) {
351 $output .= '<link rel="alternate" title="' . _x( 'oEmbed (JSON)', 'oEmbed resource link name' ) . '" type="application/json+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink() ) ) . '" />' . "\n";
352
353 if ( class_exists( 'SimpleXMLElement' ) ) {
354 $output .= '<link rel="alternate" title="' . _x( 'oEmbed (XML)', 'oEmbed resource link name' ) . '" type="text/xml+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink(), 'xml' ) ) . '" />' . "\n";
355 }
356 }
357
358 /**
359 * Filters the oEmbed discovery links HTML.
360 *
361 * @since 4.4.0
362 *
363 * @param string $output HTML of the discovery links.
364 */
365 echo apply_filters( 'oembed_discovery_links', $output );
366}
367
368/**
369 * Adds the necessary JavaScript to communicate with the embedded iframes.
370 *
371 * This function is no longer used directly. For back-compat it exists exclusively as a way to indicate that the oEmbed
372 * host JS _should_ be added. In `default-filters.php` there remains this code:
373 *
374 * add_action( 'wp_head', 'wp_oembed_add_host_js' )
375 *
376 * Historically a site has been able to disable adding the oEmbed host script by doing:
377 *
378 * remove_action( 'wp_head', 'wp_oembed_add_host_js' )
379 *
380 * In order to ensure that such code still works as expected, this function remains. There is now a `has_action()` check
381 * in `wp_maybe_enqueue_oembed_host_js()` to see if `wp_oembed_add_host_js()` has not been unhooked from running at the
382 * `wp_head` action.
383 *
384 * @since 4.4.0
385 * @deprecated 5.9.0 Use {@see wp_maybe_enqueue_oembed_host_js()} instead.
386 */
387function wp_oembed_add_host_js() {}
388
389/**
390 * Enqueue the wp-embed script if the provided oEmbed HTML contains a post embed.
391 *
392 * In order to only enqueue the wp-embed script on pages that actually contain post embeds, this function checks if the
393 * provided HTML contains post embed markup and if so enqueues the script so that it will get printed in the footer.
394 *
395 * @since 5.9.0
396 *
397 * @param string $html Embed markup.
398 * @return string Embed markup (without modifications).
399 */
400function wp_maybe_enqueue_oembed_host_js( $html ) {
401 if (
402 has_action( 'wp_head', 'wp_oembed_add_host_js' )
403 &&
404 preg_match( '/<blockquote\s[^>]*?wp-embedded-content/', $html )
405 ) {
406 wp_enqueue_script( 'wp-embed' );
407 }
408 return $html;
409}
410
411/**
412 * Retrieves the URL to embed a specific post in an iframe.
413 *
414 * @since 4.4.0
415 *
416 * @param int|WP_Post $post Optional. Post ID or object. Defaults to the current post.
417 * @return string|false The post embed URL on success, false if the post doesn't exist.
418 */
419function get_post_embed_url( $post = null ) {
420 $post = get_post( $post );
421
422 if ( ! $post ) {
423 return false;
424 }
425
426 $embed_url = trailingslashit( get_permalink( $post ) ) . user_trailingslashit( 'embed' );
427 $path_conflict = get_page_by_path( str_replace( home_url(), '', $embed_url ), OBJECT, get_post_types( array( 'public' => true ) ) );
428
429 if ( ! get_option( 'permalink_structure' ) || $path_conflict ) {
430 $embed_url = add_query_arg( array( 'embed' => 'true' ), get_permalink( $post ) );
431 }
432
433 /**
434 * Filters the URL to embed a specific post.
435 *
436 * @since 4.4.0
437 *
438 * @param string $embed_url The post embed URL.
439 * @param WP_Post $post The corresponding post object.
440 */
441 return sanitize_url( apply_filters( 'post_embed_url', $embed_url, $post ) );
442}
443
444/**
445 * Retrieves the oEmbed endpoint URL for a given permalink.
446 *
447 * Pass an empty string as the first argument to get the endpoint base URL.
448 *
449 * @since 4.4.0
450 *
451 * @param string $permalink Optional. The permalink used for the `url` query arg. Default empty.
452 * @param string $format Optional. The requested response format. Default 'json'.
453 * @return string The oEmbed endpoint URL.
454 */
455function get_oembed_endpoint_url( $permalink = '', $format = 'json' ) {
456 $url = rest_url( 'oembed/1.0/embed' );
457
458 if ( '' !== $permalink ) {
459 $url = add_query_arg(
460 array(
461 'url' => urlencode( $permalink ),
462 'format' => ( 'json' !== $format ) ? $format : false,
463 ),
464 $url
465 );
466 }
467
468 /**
469 * Filters the oEmbed endpoint URL.
470 *
471 * @since 4.4.0
472 *
473 * @param string $url The URL to the oEmbed endpoint.
474 * @param string $permalink The permalink used for the `url` query arg.
475 * @param string $format The requested response format.
476 */
477 return apply_filters( 'oembed_endpoint_url', $url, $permalink, $format );
478}
479
480/**
481 * Retrieves the embed code for a specific post.
482 *
483 * @since 4.4.0
484 *
485 * @param int $width The width for the response.
486 * @param int $height The height for the response.
487 * @param int|WP_Post $post Optional. Post ID or object. Default is global `$post`.
488 * @return string|false Embed code on success, false if post doesn't exist.
489 */
490function get_post_embed_html( $width, $height, $post = null ) {
491 $post = get_post( $post );
492
493 if ( ! $post ) {
494 return false;
495 }
496
497 $embed_url = get_post_embed_url( $post );
498
499 $secret = wp_generate_password( 10, false );
500 $embed_url .= "#?secret={$secret}";
501
502 $output = sprintf(
503 '<blockquote class="wp-embedded-content" data-secret="%1$s"><a href="%2$s">%3$s</a></blockquote>',
504 esc_attr( $secret ),
505 esc_url( get_permalink( $post ) ),
506 get_the_title( $post )
507 );
508
509 $output .= sprintf(
510 '<iframe sandbox="allow-scripts" security="restricted" src="%1$s" width="%2$d" height="%3$d" title="%4$s" data-secret="%5$s" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" class="wp-embedded-content"></iframe>',
511 esc_url( $embed_url ),
512 absint( $width ),
513 absint( $height ),
514 esc_attr(
515 sprintf(
516 /* translators: 1: Post title, 2: Site title. */
517 __( '&#8220;%1$s&#8221; &#8212; %2$s' ),
518 get_the_title( $post ),
519 get_bloginfo( 'name' )
520 )
521 ),
522 esc_attr( $secret )
523 );
524
525 /*
526 * Note that the script must be placed after the <blockquote> and <iframe> due to a regexp parsing issue in
527 * `wp_filter_oembed_result()`. Because of the regex pattern starts with `|(<blockquote>.*?</blockquote>)?.*|`
528 * wherein the <blockquote> is marked as being optional, if it is not at the beginning of the string then the group
529 * will fail to match and everything will be matched by `.*` and not included in the group. This regex issue goes
530 * back to WordPress 4.4, so in order to not break older installs this script must come at the end.
531 */
532 $js_path = '/js/wp-embed' . wp_scripts_get_suffix() . '.js';
533 $output .= wp_get_inline_script_tag(
534 trim( file_get_contents( ABSPATH . WPINC . $js_path ) ) . "\n//# sourceURL=" . esc_url_raw( includes_url( $js_path ) )
535 );
536
537 /**
538 * Filters the embed HTML output for a given post.
539 *
540 * @since 4.4.0
541 *
542 * @param string $output The default iframe tag to display embedded content.
543 * @param WP_Post $post Current post object.
544 * @param int $width Width of the response.
545 * @param int $height Height of the response.
546 */
547 return apply_filters( 'embed_html', $output, $post, $width, $height );
548}
549
550/**
551 * Retrieves the oEmbed response data for a given post.
552 *
553 * @since 4.4.0
554 * @since 6.8.0 Output was adjusted to only embed if the post type supports it.
555 *
556 * @param WP_Post|int $post Post ID or post object.
557 * @param int $width The requested width.
558 * @return array|false Response data on success, false if post doesn't exist,
559 * is not publicly viewable or post type is not embeddable.
560 */
561function get_oembed_response_data( $post, $width ) {
562 $post = get_post( $post );
563 $width = absint( $width );
564
565 if ( ! $post ) {
566 return false;
567 }
568
569 if ( ! is_post_publicly_viewable( $post ) ) {
570 return false;
571 }
572
573 if ( ! is_post_embeddable( $post ) ) {
574 return false;
575 }
576
577 /**
578 * Filters the allowed minimum and maximum widths for the oEmbed response.
579 *
580 * @since 4.4.0
581 *
582 * @param array $min_max_width {
583 * Minimum and maximum widths for the oEmbed response.
584 *
585 * @type int $min Minimum width. Default 200.
586 * @type int $max Maximum width. Default 600.
587 * }
588 */
589 $min_max_width = apply_filters(
590 'oembed_min_max_width',
591 array(
592 'min' => 200,
593 'max' => 600,
594 )
595 );
596
597 $width = min( max( $min_max_width['min'], $width ), $min_max_width['max'] );
598 $height = max( (int) ceil( $width / 16 * 9 ), 200 );
599
600 $data = array(
601 'version' => '1.0',
602 'provider_name' => get_bloginfo( 'name' ),
603 'provider_url' => get_home_url(),
604 'author_name' => get_bloginfo( 'name' ),
605 'author_url' => get_home_url(),
606 'title' => get_the_title( $post ),
607 'type' => 'link',
608 );
609
610 $author = get_userdata( $post->post_author );
611
612 if ( $author ) {
613 $data['author_name'] = $author->display_name;
614 $data['author_url'] = get_author_posts_url( $author->ID );
615 }
616
617 /**
618 * Filters the oEmbed response data.
619 *
620 * @since 4.4.0
621 *
622 * @param array $data The response data.
623 * @param WP_Post $post The post object.
624 * @param int $width The requested width.
625 * @param int $height The calculated height.
626 */
627 return apply_filters( 'oembed_response_data', $data, $post, $width, $height );
628}
629
630
631/**
632 * Retrieves the oEmbed response data for a given URL.
633 *
634 * @since 5.0.0
635 *
636 * @param string $url The URL that should be inspected for discovery `<link>` tags.
637 * @param array $args oEmbed remote get arguments.
638 * @return object|false oEmbed response data if the URL does belong to the current site. False otherwise.
639 */
640function get_oembed_response_data_for_url( $url, $args ) {
641 $switched_blog = false;
642
643 if ( is_multisite() ) {
644 $url_parts = wp_parse_args(
645 wp_parse_url( $url ),
646 array(
647 'host' => '',
648 'port' => null,
649 'path' => '/',
650 )
651 );
652
653 $qv = array(
654 'domain' => $url_parts['host'] . ( $url_parts['port'] ? ':' . $url_parts['port'] : '' ),
655 'path' => '/',
656 'update_site_meta_cache' => false,
657 );
658
659 // In case of subdirectory configs, set the path.
660 if ( ! is_subdomain_install() ) {
661 $path = explode( '/', ltrim( $url_parts['path'], '/' ) );
662 $path = reset( $path );
663
664 if ( $path ) {
665 $qv['path'] = get_network()->path . $path . '/';
666 }
667 }
668
669 $sites = get_sites( $qv );
670 $site = reset( $sites );
671
672 // Do not allow embeds for deleted/archived/spam sites.
673 if ( ! empty( $site->deleted ) || ! empty( $site->spam ) || ! empty( $site->archived ) ) {
674 return false;
675 }
676
677 if ( $site && get_current_blog_id() !== (int) $site->blog_id ) {
678 switch_to_blog( $site->blog_id );
679 $switched_blog = true;
680 }
681 }
682
683 $post_id = url_to_postid( $url );
684
685 /** This filter is documented in wp-includes/class-wp-oembed-controller.php */
686 $post_id = apply_filters( 'oembed_request_post_id', $post_id, $url );
687
688 if ( ! $post_id ) {
689 if ( $switched_blog ) {
690 restore_current_blog();
691 }
692
693 return false;
694 }
695
696 $width = isset( $args['width'] ) ? $args['width'] : 0;
697
698 $data = get_oembed_response_data( $post_id, $width );
699
700 if ( $switched_blog ) {
701 restore_current_blog();
702 }
703
704 return $data ? (object) $data : false;
705}
706
707
708/**
709 * Filters the oEmbed response data to return an iframe embed code.
710 *
711 * @since 4.4.0
712 *
713 * @param array $data The response data.
714 * @param WP_Post $post The post object.
715 * @param int $width The requested width.
716 * @param int $height The calculated height.
717 * @return array The modified response data.
718 */
719function get_oembed_response_data_rich( $data, $post, $width, $height ) {
720 $data['width'] = absint( $width );
721 $data['height'] = absint( $height );
722 $data['type'] = 'rich';
723 $data['html'] = get_post_embed_html( $width, $height, $post );
724
725 // Add post thumbnail to response if available.
726 $thumbnail_id = false;
727
728 if ( has_post_thumbnail( $post->ID ) ) {
729 $thumbnail_id = get_post_thumbnail_id( $post->ID );
730 }
731
732 if ( 'attachment' === get_post_type( $post ) ) {
733 if ( wp_attachment_is_image( $post ) ) {
734 $thumbnail_id = $post->ID;
735 } elseif ( wp_attachment_is( 'video', $post ) ) {
736 $thumbnail_id = get_post_thumbnail_id( $post );
737 $data['type'] = 'video';
738 }
739 }
740
741 if ( $thumbnail_id ) {
742 list( $thumbnail_url, $thumbnail_width, $thumbnail_height ) = wp_get_attachment_image_src( $thumbnail_id, array( $width, 0 ) );
743 $data['thumbnail_url'] = $thumbnail_url;
744 $data['thumbnail_width'] = $thumbnail_width;
745 $data['thumbnail_height'] = $thumbnail_height;
746 }
747
748 return $data;
749}
750
751/**
752 * Ensures that the specified format is either 'json' or 'xml'.
753 *
754 * @since 4.4.0
755 *
756 * @param string $format The oEmbed response format. Accepts 'json' or 'xml'.
757 * @return string The format, either 'xml' or 'json'. Default 'json'.
758 */
759function wp_oembed_ensure_format( $format ) {
760 if ( ! in_array( $format, array( 'json', 'xml' ), true ) ) {
761 return 'json';
762 }
763
764 return $format;
765}
766
767/**
768 * Hooks into the REST API output to print XML instead of JSON.
769 *
770 * This is only done for the oEmbed API endpoint,
771 * which supports both formats.
772 *
773 * @access private
774 * @since 4.4.0
775 *
776 * @param bool $served Whether the request has already been served.
777 * @param WP_HTTP_Response $result Result to send to the client. Usually a `WP_REST_Response`.
778 * @param WP_REST_Request $request Request used to generate the response.
779 * @param WP_REST_Server $server Server instance.
780 * @return bool True if the request was served, false otherwise.
781 */
782function _oembed_rest_pre_serve_request( $served, $result, $request, $server ) {
783 $params = $request->get_params();
784
785 if ( '/oembed/1.0/embed' !== $request->get_route() || 'GET' !== $request->get_method() ) {
786 return $served;
787 }
788
789 if ( ! isset( $params['format'] ) || 'xml' !== $params['format'] ) {
790 return $served;
791 }
792
793 // Embed links inside the request.
794 $data = $server->response_to_data( $result, false );
795
796 if ( ! class_exists( 'SimpleXMLElement' ) ) {
797 status_header( 501 );
798 die( get_status_header_desc( 501 ) );
799 }
800
801 $result = _oembed_create_xml( $data );
802
803 // Bail if there's no XML.
804 if ( ! $result ) {
805 status_header( 501 );
806 die( get_status_header_desc( 501 ) );
807 }
808
809 if ( ! headers_sent() ) {
810 $server->send_header( 'Content-Type', 'text/xml; charset=' . get_option( 'blog_charset' ) );
811 }
812
813 echo $result;
814
815 return true;
816}
817
818/**
819 * Creates an XML string from a given array.
820 *
821 * @since 4.4.0
822 * @access private
823 *
824 * @param array $data The original oEmbed response data.
825 * @param SimpleXMLElement $node Optional. XML node to append the result to recursively.
826 * @return string|false XML string on success, false on error.
827 */
828function _oembed_create_xml( $data, $node = null ) {
829 if ( ! is_array( $data ) || empty( $data ) ) {
830 return false;
831 }
832
833 if ( null === $node ) {
834 $node = new SimpleXMLElement( '<oembed></oembed>' );
835 }
836
837 foreach ( $data as $key => $value ) {
838 if ( is_numeric( $key ) ) {
839 $key = 'oembed';
840 }
841
842 if ( is_array( $value ) ) {
843 $item = $node->addChild( $key );
844 _oembed_create_xml( $value, $item );
845 } else {
846 $node->addChild( $key, esc_html( $value ) );
847 }
848 }
849
850 return $node->asXML();
851}
852
853/**
854 * Filters the given oEmbed HTML to make sure iframes have a title attribute.
855 *
856 * @since 5.2.0
857 *
858 * @param string|false $result The oEmbed HTML result.
859 * @param object $data A data object result from an oEmbed provider.
860 * @param string $url The URL of the content to be embedded.
861 * @return string|false The filtered oEmbed result.
862 */
863function wp_filter_oembed_iframe_title_attribute( $result, $data, $url ) {
864 if ( false === $result || ! in_array( $data->type, array( 'rich', 'video' ), true ) ) {
865 return $result;
866 }
867
868 $title = ! empty( $data->title ) ? $data->title : '';
869
870 $pattern = '`<iframe([^>]*)>`i';
871 if ( preg_match( $pattern, $result, $matches ) ) {
872 $attrs = wp_kses_hair( $matches[1], wp_allowed_protocols() );
873
874 foreach ( $attrs as $attr => $item ) {
875 $lower_attr = strtolower( $attr );
876 if ( $lower_attr === $attr ) {
877 continue;
878 }
879 if ( ! isset( $attrs[ $lower_attr ] ) ) {
880 $attrs[ $lower_attr ] = $item;
881 unset( $attrs[ $attr ] );
882 }
883 }
884 }
885
886 if ( ! empty( $attrs['title']['value'] ) ) {
887 $title = $attrs['title']['value'];
888 }
889
890 /**
891 * Filters the title attribute of the given oEmbed HTML iframe.
892 *
893 * @since 5.2.0
894 *
895 * @param string $title The title attribute.
896 * @param string $result The oEmbed HTML result.
897 * @param object $data A data object result from an oEmbed provider.
898 * @param string $url The URL of the content to be embedded.
899 */
900 $title = apply_filters( 'oembed_iframe_title_attribute', $title, $result, $data, $url );
901
902 if ( '' === $title ) {
903 return $result;
904 }
905
906 if ( isset( $attrs['title'] ) ) {
907 unset( $attrs['title'] );
908 $attr_string = implode( ' ', wp_list_pluck( $attrs, 'whole' ) );
909 $result = str_replace( $matches[0], '<iframe ' . trim( $attr_string ) . '>', $result );
910 }
911 return str_ireplace( '<iframe ', sprintf( '<iframe title="%s" ', esc_attr( $title ) ), $result );
912}
913
914
915/**
916 * Filters the given oEmbed HTML.
917 *
918 * If the `$url` isn't on the trusted providers list,
919 * we need to filter the HTML heavily for security.
920 *
921 * Only filters 'rich' and 'video' response types.
922 *
923 * @since 4.4.0
924 *
925 * @param string|false $result The oEmbed HTML result.
926 * @param object $data A data object result from an oEmbed provider.
927 * @param string $url The URL of the content to be embedded.
928 * @return string|false The filtered and sanitized oEmbed result.
929 */
930function wp_filter_oembed_result( $result, $data, $url ) {
931 if ( false === $result || ! in_array( $data->type, array( 'rich', 'video' ), true ) ) {
932 return $result;
933 }
934
935 $wp_oembed = _wp_oembed_get_object();
936
937 // Don't modify the HTML for trusted providers.
938 if ( false !== $wp_oembed->get_provider( $url, array( 'discover' => false ) ) ) {
939 return $result;
940 }
941
942 $allowed_html = array(
943 'a' => array(
944 'href' => true,
945 ),
946 'blockquote' => array(),
947 'iframe' => array(
948 'src' => true,
949 'width' => true,
950 'height' => true,
951 'frameborder' => true,
952 'marginwidth' => true,
953 'marginheight' => true,
954 'scrolling' => true,
955 'title' => true,
956 ),
957 );
958
959 $html = wp_kses( $result, $allowed_html );
960
961 preg_match( '|(<blockquote>.*?</blockquote>)?.*(<iframe.*?></iframe>)|ms', $html, $content );
962 // We require at least the iframe to exist.
963 if ( empty( $content[2] ) ) {
964 return false;
965 }
966 $html = $content[1] . $content[2];
967
968 preg_match( '/ src=([\'"])(.*?)\1/', $html, $results );
969
970 if ( ! empty( $results ) ) {
971 $secret = wp_generate_password( 10, false );
972
973 $url = esc_url( "{$results[2]}#?secret=$secret" );
974 $q = $results[1];
975
976 $html = str_replace( $results[0], ' src=' . $q . $url . $q . ' data-secret=' . $q . $secret . $q, $html );
977 $html = str_replace( '<blockquote', "<blockquote data-secret=\"$secret\"", $html );
978 }
979
980 $allowed_html['blockquote']['data-secret'] = true;
981 $allowed_html['iframe']['data-secret'] = true;
982
983 $html = wp_kses( $html, $allowed_html );
984
985 if ( ! empty( $content[1] ) ) {
986 // We have a blockquote to fall back on. Hide the iframe by default.
987 $html = str_replace( '<iframe', '<iframe style="position: absolute; visibility: hidden;"', $html );
988 $html = str_replace( '<blockquote', '<blockquote class="wp-embedded-content"', $html );
989 }
990
991 $html = str_ireplace( '<iframe', '<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"', $html );
992
993 return $html;
994}
995
996/**
997 * Filters the string in the 'more' link displayed after a trimmed excerpt.
998 *
999 * Replaces '[...]' (appended to automatically generated excerpts) with an
1000 * ellipsis and a "Continue reading" link in the embed template.
1001 *
1002 * @since 4.4.0
1003 *
1004 * @param string $more_string Default 'more' string.
1005 * @return string 'Continue reading' link prepended with an ellipsis.
1006 */
1007function wp_embed_excerpt_more( $more_string ) {
1008 if ( ! is_embed() ) {
1009 return $more_string;
1010 }
1011
1012 $link = sprintf(
1013 '<a href="%1$s" class="wp-embed-more" target="_top">%2$s</a>',
1014 esc_url( get_permalink() ),
1015 /* translators: %s: Post title. */
1016 sprintf( __( 'Continue reading %s' ), '<span class="screen-reader-text">' . get_the_title() . '</span>' )
1017 );
1018 return ' &hellip; ' . $link;
1019}
1020
1021/**
1022 * Displays the post excerpt for the embed template.
1023 *
1024 * Intended to be used in 'The Loop'.
1025 *
1026 * @since 4.4.0
1027 */
1028function the_excerpt_embed() {
1029 $output = get_the_excerpt();
1030
1031 /**
1032 * Filters the post excerpt for the embed template.
1033 *
1034 * @since 4.4.0
1035 *
1036 * @param string $output The current post excerpt.
1037 */
1038 echo apply_filters( 'the_excerpt_embed', $output );
1039}
1040
1041/**
1042 * Filters the post excerpt for the embed template.
1043 *
1044 * Shows players for video and audio attachments.
1045 *
1046 * @since 4.4.0
1047 *
1048 * @param string $content The current post excerpt.
1049 * @return string The modified post excerpt.
1050 */
1051function wp_embed_excerpt_attachment( $content ) {
1052 if ( is_attachment() ) {
1053 return prepend_attachment( '' );
1054 }
1055
1056 return $content;
1057}
1058
1059/**
1060 * Enqueues embed iframe default CSS and JS.
1061 *
1062 * Enqueue PNG fallback CSS for embed iframe for legacy versions of IE.
1063 *
1064 * Allows plugins to queue scripts for the embed iframe end using wp_enqueue_script().
1065 * Runs first in oembed_head().
1066 *
1067 * @since 4.4.0
1068 */
1069function enqueue_embed_scripts() {
1070
1071 /**
1072 * Fires when scripts and styles are enqueued for the embed iframe.
1073 *
1074 * @since 4.4.0
1075 */
1076 do_action( 'enqueue_embed_scripts' );
1077}
1078
1079/**
1080 * Enqueues the CSS in the embed iframe header.
1081 *
1082 * @since 6.4.0
1083 */
1084function wp_enqueue_embed_styles() {
1085 // Back-compat for plugins that disable functionality by unhooking this action.
1086 if ( ! has_action( 'embed_head', 'print_embed_styles' ) ) {
1087 return;
1088 }
1089 remove_action( 'embed_head', 'print_embed_styles' );
1090
1091 $suffix = wp_scripts_get_suffix();
1092 $handle = 'wp-embed-template';
1093 wp_register_style( $handle, false );
1094 wp_add_inline_style( $handle, file_get_contents( ABSPATH . WPINC . "/css/wp-embed-template$suffix.css" ) );
1095 wp_enqueue_style( $handle );
1096}
1097
1098/**
1099 * Prints the JavaScript in the embed iframe header.
1100 *
1101 * @since 4.4.0
1102 */
1103function print_embed_scripts() {
1104 $js_path = '/js/wp-embed-template' . wp_scripts_get_suffix() . '.js';
1105 wp_print_inline_script_tag(
1106 trim( file_get_contents( ABSPATH . WPINC . $js_path ) ) . "\n//# sourceURL=" . esc_url_raw( includes_url( $js_path ) )
1107 );
1108}
1109
1110/**
1111 * Prepare the oembed HTML to be displayed in an RSS feed.
1112 *
1113 * @since 4.4.0
1114 * @access private
1115 *
1116 * @param string $content The content to filter.
1117 * @return string The filtered content.
1118 */
1119function _oembed_filter_feed_content( $content ) {
1120 $p = new WP_HTML_Tag_Processor( $content );
1121 while ( $p->next_tag( array( 'tag_name' => 'iframe' ) ) ) {
1122 if ( $p->has_class( 'wp-embedded-content' ) ) {
1123 $p->remove_attribute( 'style' );
1124 }
1125 }
1126 return $p->get_updated_html();
1127}
1128
1129/**
1130 * Prints the necessary markup for the embed comments button.
1131 *
1132 * @since 4.4.0
1133 */
1134function print_embed_comments_button() {
1135 if ( is_404() || ! ( get_comments_number() || comments_open() ) ) {
1136 return;
1137 }
1138 ?>
1139 <div class="wp-embed-comments">
1140 <a href="<?php comments_link(); ?>" target="_top">
1141 <span class="dashicons dashicons-admin-comments"></span>
1142 <?php
1143 printf(
1144 /* translators: %s: Number of comments. */
1145 _n(
1146 '%s <span class="screen-reader-text">Comment</span>',
1147 '%s <span class="screen-reader-text">Comments</span>',
1148 get_comments_number()
1149 ),
1150 number_format_i18n( get_comments_number() )
1151 );
1152 ?>
1153 </a>
1154 </div>
1155 <?php
1156}
1157
1158/**
1159 * Prints the necessary markup for the embed sharing button.
1160 *
1161 * @since 4.4.0
1162 */
1163function print_embed_sharing_button() {
1164 if ( is_404() ) {
1165 return;
1166 }
1167 ?>
1168 <div class="wp-embed-share">
1169 <button type="button" class="wp-embed-share-dialog-open" aria-label="<?php esc_attr_e( 'Open sharing dialog' ); ?>">
1170 <span class="dashicons dashicons-share"></span>
1171 </button>
1172 </div>
1173 <?php
1174}
1175
1176/**
1177 * Prints the necessary markup for the embed sharing dialog.
1178 *
1179 * @since 4.4.0
1180 */
1181function print_embed_sharing_dialog() {
1182 if ( is_404() ) {
1183 return;
1184 }
1185
1186 $unique_suffix = get_the_ID() . '-' . wp_rand();
1187 $share_tab_wordpress_id = 'wp-embed-share-tab-wordpress-' . $unique_suffix;
1188 $share_tab_html_id = 'wp-embed-share-tab-html-' . $unique_suffix;
1189 $description_wordpress_id = 'wp-embed-share-description-wordpress-' . $unique_suffix;
1190 $description_html_id = 'wp-embed-share-description-html-' . $unique_suffix;
1191 ?>
1192 <div class="wp-embed-share-dialog hidden" role="dialog" aria-label="<?php esc_attr_e( 'Sharing options' ); ?>">
1193 <div class="wp-embed-share-dialog-content">
1194 <div class="wp-embed-share-dialog-text">
1195 <ul class="wp-embed-share-tabs" role="tablist">
1196 <li class="wp-embed-share-tab-button wp-embed-share-tab-button-wordpress" role="presentation">
1197 <button type="button" role="tab" aria-controls="<?php echo $share_tab_wordpress_id; ?>" aria-selected="true" tabindex="0"><?php esc_html_e( 'WordPress Embed' ); ?></button>
1198 </li>
1199 <li class="wp-embed-share-tab-button wp-embed-share-tab-button-html" role="presentation">
1200 <button type="button" role="tab" aria-controls="<?php echo $share_tab_html_id; ?>" aria-selected="false" tabindex="-1"><?php esc_html_e( 'HTML Embed' ); ?></button>
1201 </li>
1202 </ul>
1203 <div id="<?php echo $share_tab_wordpress_id; ?>" class="wp-embed-share-tab" role="tabpanel" aria-hidden="false">
1204 <input type="text" value="<?php the_permalink(); ?>" class="wp-embed-share-input" aria-label="<?php esc_attr_e( 'URL' ); ?>" aria-describedby="<?php echo $description_wordpress_id; ?>" tabindex="0" readonly/>
1205
1206 <p class="wp-embed-share-description" id="<?php echo $description_wordpress_id; ?>">
1207 <?php _e( 'Copy and paste this URL into your WordPress site to embed' ); ?>
1208 </p>
1209 </div>
1210 <div id="<?php echo $share_tab_html_id; ?>" class="wp-embed-share-tab" role="tabpanel" aria-hidden="true">
1211 <textarea class="wp-embed-share-input" aria-label="<?php esc_attr_e( 'HTML' ); ?>" aria-describedby="<?php echo $description_html_id; ?>" tabindex="0" readonly><?php echo esc_textarea( get_post_embed_html( 600, 400 ) ); ?></textarea>
1212
1213 <p class="wp-embed-share-description" id="<?php echo $description_html_id; ?>">
1214 <?php _e( 'Copy and paste this code into your site to embed' ); ?>
1215 </p>
1216 </div>
1217 </div>
1218
1219 <button type="button" class="wp-embed-share-dialog-close" aria-label="<?php esc_attr_e( 'Close sharing dialog' ); ?>">
1220 <span class="dashicons dashicons-no"></span>
1221 </button>
1222 </div>
1223 </div>
1224 <?php
1225}
1226
1227/**
1228 * Prints the necessary markup for the site title in an embed template.
1229 *
1230 * @since 4.5.0
1231 */
1232function the_embed_site_title() {
1233 $site_title = sprintf(
1234 '<a href="%s" target="_top"><img src="%s" srcset="%s 2x" width="32" height="32" alt="" class="wp-embed-site-icon" /><span>%s</span></a>',
1235 esc_url( home_url() ),
1236 esc_url( get_site_icon_url( 32, includes_url( 'images/w-logo-blue.png' ) ) ),
1237 esc_url( get_site_icon_url( 64, includes_url( 'images/w-logo-blue.png' ) ) ),
1238 esc_html( get_bloginfo( 'name' ) )
1239 );
1240
1241 $site_title = '<div class="wp-embed-site-title">' . $site_title . '</div>';
1242
1243 /**
1244 * Filters the site title HTML in the embed footer.
1245 *
1246 * @since 4.4.0
1247 *
1248 * @param string $site_title The site title HTML.
1249 */
1250 echo apply_filters( 'embed_site_title_html', $site_title );
1251}
1252
1253/**
1254 * Filters the oEmbed result before any HTTP requests are made.
1255 *
1256 * If the URL belongs to the current site, the result is fetched directly instead of
1257 * going through the oEmbed discovery process.
1258 *
1259 * @since 4.5.3
1260 *
1261 * @param null|string $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. Default null.
1262 * @param string $url The URL that should be inspected for discovery `<link>` tags.
1263 * @param array $args oEmbed remote get arguments.
1264 * @return null|string The UNSANITIZED (and potentially unsafe) HTML that should be used to embed.
1265 * Null if the URL does not belong to the current site.
1266 */
1267function wp_filter_pre_oembed_result( $result, $url, $args ) {
1268 $data = get_oembed_response_data_for_url( $url, $args );
1269
1270 if ( $data ) {
1271 return _wp_oembed_get_object()->data2html( $data, $url );
1272 }
1273
1274 return $result;
1275}
1276
Ui Ux Design – Teachers Night Out

Get in Touch

© 2024 Teachers Night Out. All Rights Reserved.