PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 11.2
Jetpack – WP Security, Backup, Speed, & Growth v11.2
16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 All 501 releases
jetpack / modules / theme-tools / responsive-videos.php

responsive-videos.php in Jetpack – WP Security, Backup, Speed, & Growth 11.2, at modules/theme-tools/responsive-videos.php

176 lines 5.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Theme Tools: Responsive videos enhancements.
4 *
5 * @package automattic/jetpack
6 */
7
8 /**
9 * Load the Responsive videos plugin
10 */
11 function jetpack_responsive_videos_init() {
12
13 /* If the doesn't theme support 'jetpack-responsive-videos', don't continue */
14 if ( ! current_theme_supports( 'jetpack-responsive-videos' ) ) {
15 return;
16 }
17
18 /* If the theme does support 'jetpack-responsive-videos', wrap the videos */
19 add_filter( 'wp_video_shortcode', 'jetpack_responsive_videos_embed_html' );
20 add_filter( 'video_embed_html', 'jetpack_responsive_videos_embed_html' );
21
22 /* Only wrap oEmbeds if video */
23 add_filter( 'embed_oembed_html', 'jetpack_responsive_videos_maybe_wrap_oembed', 10, 2 );
24 add_filter( 'embed_handler_html', 'jetpack_responsive_videos_maybe_wrap_oembed', 10, 2 );
25
26 /* Wrap videos in Buddypress */
27 add_filter( 'bp_embed_oembed_html', 'jetpack_responsive_videos_embed_html' );
28
29 /* Wrap Slideshare shortcodes */
30 add_filter( 'jetpack_slideshare_shortcode', 'jetpack_responsive_videos_embed_html' );
31
32 // Remove the Jetpack Responsive video wrapper in embed blocks on sites that support core Responsive embeds.
33 if ( current_theme_supports( 'responsive-embeds' ) ) {
34 add_filter( 'render_block', 'jetpack_responsive_videos_remove_wrap_oembed', 10, 2 );
35 }
36 }
37 add_action( 'after_setup_theme', 'jetpack_responsive_videos_init', 99 );
38
39 /**
40 * Adds a wrapper to videos and enqueue script
41 *
42 * @param string $html The video embed HTML.
43 * @return string
44 */
45 function jetpack_responsive_videos_embed_html( $html ) {
46 if ( empty( $html ) || ! is_string( $html ) ) {
47 return $html;
48 }
49
50 // Short-circuit for AMP responses, since custom scripts are not allowed in AMP and videos are naturally responsive.
51 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
52 return $html;
53 }
54
55 // The customizer video widget wraps videos with a class of wp-video
56 // mejs as of 4.9 apparently resizes videos too which causes issues
57 // skip the video if it is wrapped in wp-video.
58 $video_widget_wrapper = 'class="wp-video"';
59
60 $mejs_wrapped = strpos( $html, $video_widget_wrapper );
61
62 // If this is a video widget wrapped by mejs, return the html.
63 if ( false !== $mejs_wrapped ) {
64 return $html;
65 }
66
67 if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) {
68 wp_enqueue_script( 'jetpack-responsive-videos-script', plugins_url( 'responsive-videos/responsive-videos.js', __FILE__ ), array( 'jquery' ), '1.3', true );
69 } else {
70 wp_enqueue_script( 'jetpack-responsive-videos-min-script', plugins_url( 'responsive-videos/responsive-videos.min.js', __FILE__ ), array( 'jquery' ), '1.3', true );
71 }
72
73 // Enqueue CSS to ensure compatibility with all themes
74 wp_enqueue_style(
75 'jetpack-responsive-videos-style',
76 plugins_url( 'responsive-videos/responsive-videos.css', __FILE__ ),
77 array(),
78 JETPACK__VERSION
79 );
80
81 return '<div class="jetpack-video-wrapper">' . $html . '</div>';
82 }
83
84 /**
85 * Check if oEmbed is a `$video_patterns` provider video before wrapping.
86 *
87 * @param mixed $html The cached HTML result, stored in post meta.
88 * @param string $url he attempted embed URL.
89 *
90 * @return string
91 */
92 function jetpack_responsive_videos_maybe_wrap_oembed( $html, $url = null ) {
93 if ( empty( $html ) || ! is_string( $html ) || ! $url ) {
94 return $html;
95 }
96
97 // Short-circuit for AMP responses, since custom scripts are not allowed in AMP and videos are naturally responsive.
98 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
99 return $html;
100 }
101
102 $jetpack_video_wrapper = '<div class="jetpack-video-wrapper">';
103
104 $already_wrapped = strpos( $html, $jetpack_video_wrapper );
105
106 // If the oEmbed has already been wrapped, return the html.
107 if ( false !== $already_wrapped ) {
108 return $html;
109 }
110
111 /**
112 * The oEmbed video providers.
113 *
114 * An allowed list of oEmbed video provider Regex patterns to check against before wrapping the output.
115 *
116 * @module theme-tools
117 *
118 * @since 3.8.0
119 *
120 * @param array $video_patterns oEmbed video provider Regex patterns.
121 */
122 $video_patterns = apply_filters(
123 'jetpack_responsive_videos_oembed_videos',
124 array(
125 'https?://((m|www)\.)?youtube\.com/watch',
126 'https?://((m|www)\.)?youtube\.com/playlist',
127 'https?://youtu\.be/',
128 'https?://(.+\.)?vimeo\.com/',
129 'https?://(www\.)?dailymotion\.com/',
130 'https?://dai.ly/',
131 'https?://(www\.)?hulu\.com/watch/',
132 'https?://wordpress.tv/',
133 'https?://(www\.)?funnyordie\.com/videos/',
134 'https?://vine.co/v/',
135 'https?://(www\.)?collegehumor\.com/video/',
136 'https?://(www\.|embed\.)?ted\.com/talks/',
137 )
138 );
139
140 // Merge patterns to run in a single preg_match call.
141 $video_patterns = '(' . implode( '|', $video_patterns ) . ')';
142
143 $is_video = preg_match( $video_patterns, $url );
144
145 // If the oEmbed is a video, wrap it in the responsive wrapper.
146 if ( false === $already_wrapped && 1 === $is_video ) {
147 return jetpack_responsive_videos_embed_html( $html );
148 }
149
150 return $html;
151 }
152
153 /**
154 * Remove the Jetpack Responsive video wrapper in embed blocks.
155 *
156 * @since 7.0.0
157 *
158 * @param string $block_content The block content about to be appended.
159 * @param array $block The full block, including name and attributes.
160 *
161 * @return string $block_content String of rendered HTML.
162 */
163 function jetpack_responsive_videos_remove_wrap_oembed( $block_content, $block ) {
164 if (
165 isset( $block['blockName'] )
166 && (
167 false !== strpos( $block['blockName'], 'core-embed' ) // pre-WP 5.6 embeds (multiple embed blocks starting with 'core-embed').
168 || 'core/embed' === $block['blockName'] // WP 5.6 embed block format (single embed block w/ block variations).
169 )
170 ) {
171 $block_content = preg_replace( '#<div class="jetpack-video-wrapper">(.*?)</div>#', '${1}', $block_content );
172 }
173
174 return $block_content;
175 }
176