PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / shortcodes / vimeo.php
jetpack / modules / shortcodes Last commit date
css 1 month ago images 1 year ago img 2 months ago js 7 months ago archiveorg-book.php 7 months ago archiveorg.php 1 month ago archives.php 1 week ago bandcamp.php 7 months ago brightcove.php 6 months ago cartodb.php 7 months ago class.filter-embedded-html-objects.php 7 months ago codepen.php 7 months ago crowdsignal.php 6 months ago dailymotion.php 7 months ago descript.php 7 months ago facebook.php 7 months ago flatio.php 7 months ago flickr.php 7 months ago getty.php 7 months ago gist.php 7 months ago googleapps.php 7 months ago googlemaps.php 1 month ago googleplus.php 7 months ago gravatar.php 7 months ago houzz.php 7 months ago inline-pdfs.php 7 months ago instagram.php 7 months ago kickstarter.php 7 months ago mailchimp.php 1 month ago medium.php 7 months ago mixcloud.php 7 months ago others.php 7 months ago pinterest.php 7 months ago presentations.php 7 months ago quiz.php 7 months ago recipe.php 2 weeks ago scribd.php 7 months ago shortcode-utils.php 7 months ago sitemap.php 7 months ago slideshare.php 7 months ago slideshow.php 2 weeks ago smartframe.php 7 months ago soundcloud.php 1 month ago spotify.php 7 months ago ted.php 7 months ago tweet.php 7 months ago twitchtv.php 2 weeks ago twitter-timeline.php 7 months ago twitter.php 7 months ago unavailable.php 7 months ago untappd-menu.php 7 months ago upcoming-events.php 7 months ago ustream.php 7 months ago videopress.php 7 months ago vimeo.php 1 month ago vine.php 7 months ago vr.php 1 month ago wufoo.php 7 months ago youtube.php 4 months ago
vimeo.php
429 lines
1 <?php
2 /**
3 * Vimeo Shortcode.
4 *
5 * Examples:
6 * [vimeo 141358]
7 * [vimeo http://vimeo.com/141358]
8 * [vimeo 141358 h=500&w=350]
9 * [vimeo 141358 h=500 w=350]
10 * [vimeo id=141358 width=350 height=500]
11 *
12 * <iframe src="http://player.vimeo.com/video/18427511" width="400" height="225" frameborder="0"></iframe><p><a href="http://vimeo.com/18427511">Eskmo 'We Got More' (Official Video)</a> from <a href="http://vimeo.com/ninjatune">Ninja Tune</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
13 *
14 * @package automattic/jetpack
15 */
16
17 if ( ! defined( 'ABSPATH' ) ) {
18 exit( 0 );
19 }
20
21 /**
22 * Extract Vimeo ID from shortcode.
23 *
24 * @param array $atts Shortcode attributes.
25 */
26 function jetpack_shortcode_get_vimeo_id( $atts ) {
27 if ( isset( $atts[0] ) ) {
28 $atts[0] = trim( $atts[0], '=' );
29 if ( is_numeric( $atts[0] ) ) {
30 return (int) $atts[0];
31 }
32
33 /**
34 * Extract Vimeo ID from the URL. For examples:
35 * https://vimeo.com/12345
36 * https://vimeo.com/289091934/cd1f466bcc
37 * https://vimeo.com/album/2838732/video/6342264
38 * https://vimeo.com/groups/758728/videos/897094040
39 * https://vimeo.com/channels/staffpicks/123456789
40 * https://vimeo.com/album/1234567/video/7654321
41 * https://player.vimeo.com/video/18427511
42 */
43 $pattern = '/(?:https?:\/\/)?vimeo\.com\/(?:groups\/\d+\/videos\/|album\/\d+\/video\/|video\/|channels\/[^\/]+\/videos\/|[^\/]+\/)?([0-9]+)(?:[^\'\"0-9<]|$)/i';
44 $match = array();
45 if ( preg_match( $pattern, $atts[0], $match ) ) {
46 return (int) $match[1];
47 }
48 }
49
50 return 0;
51 }
52
53 /**
54 * Get video dimensions.
55 *
56 * @since 8.0.0
57 *
58 * @param array $attr The attributes of the shortcode.
59 * @param array $old_attr Optional array of attributes from the old shortcode format.
60 *
61 * @return array Width and height.
62 */
63 function jetpack_shortcode_get_vimeo_dimensions( $attr, $old_attr = array() ) {
64 global $content_width;
65
66 $default_width = 600;
67 $default_height = 338;
68 $aspect_ratio = $default_height / $default_width;
69
70 /*
71 * For width and height, we want to support both formats
72 * that can be provided in the new shortcode format:
73 * - for width: width or w
74 * - for height: height or h
75 *
76 * For each variation, the full word takes priority.
77 *
78 * If no variation is set, we default to the default width and height values set above.
79 */
80 if ( ! empty( $attr['width'] ) ) {
81 $width = absint( $attr['width'] );
82 } elseif ( ! empty( $attr['w'] ) ) {
83 $width = absint( $attr['w'] );
84 } else {
85 $width = $default_width;
86 }
87
88 if ( ! empty( $attr['height'] ) ) {
89 $height = absint( $attr['height'] );
90 } elseif ( ! empty( $attr['h'] ) ) {
91 $height = absint( $attr['h'] );
92 } else {
93 $height = $default_height;
94 }
95
96 /*
97 * Support w and h argument as fallbacks in old shortcode format.
98 */
99 if (
100 $default_width === $width
101 && ! empty( $old_attr['w'] )
102 ) {
103 $width = absint( $old_attr['w'] );
104
105 if (
106 $default_width === $width
107 && empty( $old_attr['h'] )
108 ) {
109 $height = round( $width * $aspect_ratio );
110 }
111 }
112
113 if (
114 $default_height === $height
115 && ! empty( $old_attr['h'] )
116 ) {
117 $height = absint( $old_attr['h'] );
118
119 if ( empty( $old_attr['w'] ) ) {
120 $width = round( $height * $aspect_ratio );
121 }
122 }
123
124 /*
125 * If we have a content width defined, let it be the new default.
126 */
127 if (
128 $default_width === $width
129 && ! empty( $content_width )
130 ) {
131 $width = absint( $content_width );
132 }
133
134 /*
135 * If we have a custom width, we need a custom height as well
136 * to maintain aspect ratio.
137 */
138 if (
139 $default_width !== $width
140 && $default_height === $height
141 ) {
142 $height = round( ( $width / 640 ) * 360 );
143 }
144
145 /**
146 * Filter the Vimeo player width.
147 *
148 * @module shortcodes
149 *
150 * @since 3.4.0
151 *
152 * @param int $width Width of the Vimeo player in pixels.
153 */
154 $width = (int) apply_filters( 'vimeo_width', $width );
155
156 /**
157 * Filter the Vimeo player height.
158 *
159 * @module shortcodes
160 *
161 * @since 3.4.0
162 *
163 * @param int $height Height of the Vimeo player in pixels.
164 */
165 $height = (int) apply_filters( 'vimeo_height', $height );
166
167 return array( $width, $height );
168 }
169
170 /**
171 * Convert a Vimeo shortcode into an embed code.
172 *
173 * @param array $atts An array of shortcode attributes.
174 *
175 * @return string The embed code for the Vimeo video.
176 */
177 function vimeo_shortcode( $atts ) {
178 $attr = array_map(
179 'intval',
180 shortcode_atts(
181 array(
182 'id' => 0,
183 'width' => 0,
184 'height' => 0,
185 'autoplay' => 0,
186 'loop' => 0,
187 'w' => 0,
188 'h' => 0,
189 ),
190 $atts
191 )
192 );
193
194 if ( isset( $atts[0] ) ) {
195 $attr['id'] = jetpack_shortcode_get_vimeo_id( $atts );
196 }
197
198 if ( ! $attr['id'] ) {
199 return '<!-- vimeo error: not a vimeo video -->';
200 }
201
202 // Handle old shortcode params such as h=500&w=350.
203 $params = shortcode_new_to_old_params( $atts );
204 $params = str_replace( array( '&amp;', '&#038;' ), '&', $params );
205 parse_str( $params, $args );
206
207 list( $width, $height ) = jetpack_shortcode_get_vimeo_dimensions( $attr, $args );
208
209 $url = esc_url( 'https://player.vimeo.com/video/' . $attr['id'] );
210
211 // Handle autoplay and loop arguments.
212 if (
213 isset( $args['autoplay'] ) && '1' === $args['autoplay'] // Parsed from the embedded URL.
214 || $attr['autoplay'] // Parsed from shortcode arguments.
215 || in_array( 'autoplay', $atts, true ) // Catch the argument passed without a value.
216 ) {
217 $url = add_query_arg( 'autoplay', 1, $url );
218 }
219
220 if (
221 isset( $args['loop'] ) && '1' === $args['loop'] // Parsed from the embedded URL.
222 || $attr['loop'] // Parsed from shortcode arguments.
223 || in_array( 'loop', $atts, true ) // Catch the argument passed without a value.
224 ) {
225 $url = add_query_arg( 'loop', 1, $url );
226 }
227
228 if (
229 class_exists( 'Jetpack_AMP_Support' )
230 && Jetpack_AMP_Support::is_amp_request()
231 ) {
232 $html = sprintf(
233 '<amp-vimeo data-videoid="%1$s" layout="responsive" width="%2$d" height="%3$d"></amp-vimeo>',
234 esc_attr( $attr['id'] ),
235 absint( $width ),
236 absint( $height )
237 );
238 } else {
239 $html = sprintf(
240 '<div class="embed-vimeo" style="text-align: center;"><iframe src="%1$s" width="%2$u" height="%3$u" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div>',
241 esc_url( $url ),
242 esc_attr( $width ),
243 esc_attr( $height )
244 );
245 }
246
247 /**
248 * Filter the Vimeo player HTML.
249 *
250 * @module shortcodes
251 *
252 * @since 1.2.3
253 *
254 * @param string $html Embedded Vimeo player HTML.
255 */
256 $html = apply_filters( 'video_embed_html', $html );
257
258 return $html;
259 }
260 add_shortcode( 'vimeo', 'vimeo_shortcode' );
261
262 /**
263 * Callback to modify output of embedded Vimeo video using Jetpack's shortcode.
264 *
265 * @since 3.9
266 * @deprecated since 13.8
267 *
268 * @param array $matches Regex partial matches against the URL passed.
269 * @param array $attr Attributes received in embed response.
270 * @param array $url Requested URL to be embedded.
271 *
272 * @return string Return output of Vimeo shortcode with the proper markup.
273 */
274 function wpcom_vimeo_embed_url( $matches, $attr, $url ) {
275 _deprecated_function( __FUNCTION__, 'jetpack-13.8' );
276 $vimeo_info = array( $url );
277
278 // If we are able to extract a video ID, use it in the shortcode instead of the full URL.
279 if ( ! empty( $matches['video_id'] ) ) {
280 $vimeo_info = array( 'id' => $matches['video_id'] );
281 }
282
283 return vimeo_shortcode( $vimeo_info );
284 }
285
286 /**
287 * For bare URLs on their own line of the form.
288 *
289 * Accepted formats:
290 * https://vimeo.com/289091934/cd1f466bcc
291 * https://vimeo.com/album/2838732/video/6342264
292 * https://vimeo.com/6342264
293 * http://player.vimeo.com/video/18427511
294 *
295 * @since 3.9
296 * @deprecated since 13.8
297 *
298 * @uses wpcom_vimeo_embed_url
299 */
300 function wpcom_vimeo_embed_url_init() {
301 _deprecated_function( __FUNCTION__, 'jetpack-13.8' );
302 wp_embed_register_handler( 'wpcom_vimeo_embed_url', '#https?://(?:[^/]+\.)?vimeo\.com/(?:album/(?<album_id>\d+)/)?(?:video/)?(?<video_id>\d+)(?:/.*)?$#i', 'wpcom_vimeo_embed_url' );
303 }
304
305 /**
306 * Transform a Vimeo embed iFrame into a Vimeo shortcode.
307 *
308 * @param string $content Post content.
309 */
310 function vimeo_embed_to_shortcode( $content ) {
311 if ( ! is_string( $content ) || false === stripos( $content, 'player.vimeo.com/video/' ) ) {
312 return $content;
313 }
314
315 $regexp = '!<iframe\s+src=[\'"](https?:)?//player\.vimeo\.com/video/(\d+)[\w=&;?]*[\'"]((?:\s+\w+=[\'"][^\'"]*[\'"])*)((?:[\s\w]*))></iframe>!i';
316 $regexp_ent = str_replace( '&amp;#0*58;', '&amp;#0*58;|&#0*58;', htmlspecialchars( $regexp, ENT_NOQUOTES ) );
317
318 foreach ( compact( 'regexp', 'regexp_ent' ) as $reg => $regexp ) {
319 if ( ! preg_match_all( $regexp, $content, $matches, PREG_SET_ORDER ) ) {
320 continue;
321 }
322
323 foreach ( $matches as $match ) {
324 $id = (int) $match[2];
325
326 $params = $match[3];
327
328 if ( 'regexp_ent' === $reg ) {
329 $params = html_entity_decode( $params, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 );
330 }
331
332 $params = wp_kses_hair( $params, array( 'http' ) );
333
334 $width = isset( $params['width'] ) ? (int) $params['width']['value'] : 0;
335 $height = isset( $params['height'] ) ? (int) $params['height']['value'] : 0;
336
337 $wh = '';
338 if ( $width && $height ) {
339 $wh = ' w=' . $width . ' h=' . $height;
340 }
341
342 $shortcode = '[vimeo ' . $id . $wh . ']';
343 $content = str_replace( $match[0], $shortcode, $content );
344 }
345 }
346
347 return $content;
348 }
349
350 if ( jetpack_shortcodes_should_hook_pre_kses() ) {
351 add_filter( 'pre_kses', 'vimeo_embed_to_shortcode' );
352 }
353
354 /**
355 * Replaces shortcodes and plain-text URLs to Vimeo videos with Vimeo embeds.
356 * Covers shortcode usage [vimeo 1234] | [vimeo https://vimeo.com/1234] | [vimeo http://vimeo.com/1234]
357 * Or plain text URLs https://vimeo.com/1234 | vimeo.com/1234 | //vimeo.com/1234
358 * Links are left intact.
359 *
360 * @since 3.7.0
361 * @since 3.9.5 One regular expression matches shortcodes and plain URLs.
362 *
363 * @param string $content HTML content.
364 *
365 * @return string The content with embeds instead of URLs
366 */
367 function vimeo_link( $content ) {
368 /**
369 * [vimeo 12345]
370 * [vimeo http://vimeo.com/12345]
371 */
372 $shortcode = '(?:\[vimeo\s+[^0-9]*)([0-9]+)(?:\])';
373
374 /**
375 * Regex to look for a Vimeo link.
376 *
377 * - http://vimeo.com/12345
378 * - https://vimeo.com/12345
379 * - //vimeo.com/12345
380 * - vimeo.com/some/descender/12345
381 *
382 * Should not capture inside HTML attributes
383 * [Not] <a href="vimeo.com/12345">Cool Video</a>
384 * [Not] <a href="https://vimeo.com/12345">vimeo.com/12345</a>
385 *
386 * Could erroneously capture:
387 * <a href="some.link/maybe/even/vimeo">This video (vimeo.com/12345) is teh cat's meow!</a>
388 */
389 $plain_url = "(?:[^'\">]?\/?(?:https?:\/\/)?vimeo\.com\/(?:groups\/\d+\/videos\/|album\/\d+\/video\/|video\/|channels\/[^\/]+\/videos\/|[^\/]+\/)?)([0-9]+)(?:[^'\"0-9<]|$)";
390
391 return jetpack_preg_replace_callback_outside_tags(
392 sprintf( '#%s|%s#i', $shortcode, $plain_url ),
393 'vimeo_link_callback',
394 $content,
395 'vimeo'
396 );
397 }
398
399 /**
400 * Callback function for the regex that replaces Vimeo URLs with Vimeo embeds.
401 *
402 * @since 3.7.0
403 *
404 * @param array $matches An array containing a Vimeo URL.
405 * @return string The Vimeo HTML embed code.
406 */
407 function vimeo_link_callback( $matches ) {
408 $id = $matches[2] ?? $matches[1];
409 if ( isset( $id ) && ctype_digit( $id ) ) {
410 return "\n" . vimeo_shortcode( array( 'id' => $id ) ) . "\n";
411 }
412 return $matches[0];
413 }
414
415 if (
416 ! is_admin()
417 /** This filter is documented in modules/shortcodes/youtube.php */
418 && apply_filters( 'jetpack_comments_allow_oembed', true )
419 // No need for this on WordPress.com, this is done for multiple shortcodes at a time there.
420 && ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM )
421 ) {
422 /*
423 * We attach wp_kses_post to comment_text in default-filters.php with priority of 10 anyway,
424 * so the iframe gets filtered out.
425 * Higher priority because we need it before auto-link and autop get to it
426 */
427 add_filter( 'comment_text', 'vimeo_link', 1 );
428 }
429