PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3
Jetpack – WP Security, Backup, Speed, & Growth v16.3
16.3 16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.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 All 508 releases
← All changes | modules/shortcodes/soundcloud.php +271 -0 16.2-beta → 16.3 View file →
@@ -1,0 +1,271 @@
1 +<?php
2 +/**
3 + * SoundCloud Shortcode
4 + * Based on this plugin: https://wordpress.org/plugins/soundcloud-shortcode/
5 + *
6 + * Credits:
7 + * Original version: Johannes Wagener <[email protected]>
8 + * Options support: Tiffany Conroy <[email protected]>
9 + * HTML5 & oEmbed support: Tim Bormans <[email protected]>
10 + *
11 + * Examples:
12 + * [soundcloud]http://soundcloud.com/forss/flickermood[/soundcloud]
13 + * [soundcloud url="https://api.soundcloud.com/tracks/156661852" params="auto_play=false&amp;hide_related=false&amp;visual=false" width="100%" height="450" iframe="true" /]
14 + * [soundcloud url="https://api.soundcloud.com/tracks/156661852" params="auto_play=false&amp;hide_related=false&amp;visual=true" width="100%" height="450" iframe="true" /]
15 + * [soundcloud url="https://soundcloud.com/closetorgan/paul-is-dead" width=400 height=400]
16 + * [soundcloud url="https://soundcloud.com/closetorgan/sets/smells-like-lynx-africa-private"]
17 + * [soundcloud url="https://soundcloud.com/closetorgan/sets/smells-like-lynx-africa-private" color="00cc11"]
18 + * <iframe width="100%" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/150745932&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>
19 + *
20 + * @package automattic/jetpack
21 + */
22 +
23 +if ( ! defined( 'ABSPATH' ) ) {
24 + exit( 0 );
25 +}
26 +
27 +/**
28 + * SoundCloud shortcode handler
29 + *
30 + * @param string|array $atts The attributes passed to the shortcode like [soundcloud attr1="value" /].
31 + * Is an empty string when no arguments are given.
32 + * @param string $content The content between non-self closing [soundcloud]...[/soundcloud] tags.
33 + *
34 + * @return string Widget embed code HTML
35 + */
36 +function soundcloud_shortcode( $atts, $content = null ) {
37 + global $wp_embed;
38 +
39 + // Custom shortcode options.
40 + $shortcode_options = array_merge(
41 + array( 'url' => trim( $content ) ),
42 + is_array( $atts ) ? $atts : array()
43 + );
44 +
45 + // The "url" option is required.
46 + if ( empty( $shortcode_options['url'] ) ) {
47 + if ( current_user_can( 'edit_posts' ) ) {
48 + return esc_html__( 'Please specify a Soundcloud URL.', 'jetpack' );
49 + } else {
50 + return '<!-- Missing Soundcloud URL -->';
51 + }
52 + }
53 +
54 + // If the shortcode is displayed in a WPCOM notification, display a simple link only.
55 + if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
56 + require_once WP_CONTENT_DIR . '/lib/display-context.php';
57 + $context = A8C\Display_Context\get_current_context();
58 + if ( A8C\Display_Context\NOTIFICATIONS === $context ) {
59 + return sprintf(
60 + '<a href="%1$s" target="_blank" rel="noopener noreferrer">%1$s</a>',
61 + esc_url( $shortcode_options['url'] )
62 + );
63 + }
64 + }
65 +
66 + // Turn shortcode option "param" (param=value&param2=value) into array of params.
67 + $shortcode_params = array();
68 + if ( isset( $shortcode_options['params'] ) ) {
69 + parse_str( html_entity_decode( $shortcode_options['params'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 ), $shortcode_params );
70 + $shortcode_options = array_merge(
71 + $shortcode_options,
72 + $shortcode_params
73 + );
74 + unset( $shortcode_options['params'] );
75 + }
76 +
77 + $options = shortcode_atts(
78 + // This list used to include an 'iframe' option. We don't include it anymore as we don't support the Flash player anymore.
79 + array(
80 + 'url' => '',
81 + 'width' => soundcloud_get_option( 'player_width' ),
82 + 'height' => soundcloud_url_has_tracklist( $shortcode_options['url'] ) ? soundcloud_get_option( 'player_height_multi' ) : soundcloud_get_option( 'player_height' ),
83 + 'auto_play' => soundcloud_get_option( 'auto_play' ),
84 + 'hide_related' => false,
85 + 'visual' => false,
86 + 'show_comments' => soundcloud_get_option( 'show_comments' ),
87 + 'color' => soundcloud_get_option( 'color' ),
88 + 'show_user' => false,
89 + 'show_reposts' => false,
90 + ),
91 + $shortcode_options,
92 + 'soundcloud'
93 + );
94 +
95 + // "width" needs to be an integer.
96 + if ( ! empty( $options['width'] ) && ! preg_match( '/^\d+$/', $options['width'] ) ) {
97 + // set to 0 so oEmbed will use the default 100% and WordPress themes will leave it alone.
98 + $options['width'] = 0;
99 + }
100 + // Set default width if not defined.
101 + $width = ! empty( $options['width'] ) ? absint( $options['width'] ) : '100%';
102 +
103 + // Set default height if not defined.
104 + if (
105 + empty( $options['height'] )
106 + || (
107 + // "height" needs to be an integer.
108 + ! empty( $options['height'] )
109 + && ! preg_match( '/^\d+$/', $options['height'] )
110 + )
111 + ) {
112 + if (
113 + soundcloud_url_has_tracklist( $options['url'] )
114 + || 'true' === $options['visual']
115 + ) {
116 + $height = 450;
117 + } else {
118 + $height = 166;
119 + }
120 + } else {
121 + $height = absint( $options['height'] );
122 + }
123 +
124 + // Set visual to false when displaying the smallest player.
125 + if ( '20' === $options['height'] ) {
126 + $options['visual'] = false;
127 + }
128 +
129 + if (
130 + class_exists( 'Jetpack_AMP_Support' )
131 + && Jetpack_AMP_Support::is_amp_request()
132 + && ! empty( $options['url'] )
133 + && 'api.soundcloud.com' !== wp_parse_url( $options['url'], PHP_URL_HOST )
134 + ) {
135 + // Defer to oEmbed if an oEmbeddable URL is provided.
136 + return $wp_embed->shortcode( $options, $options['url'] );
137 + }
138 +
139 + // Build our list of Soundcloud parameters.
140 + $query_args = array(
141 + 'url' => rawurlencode( $options['url'] ),
142 + );
143 +
144 + // Add our options, if they are set to true or false.
145 + foreach ( $options as $name => $value ) {
146 + if ( 'true' === $value ) {
147 + $query_args[ $name ] = 'true';
148 + }
149 +
150 + if ( 'false' === $value || false === $value ) {
151 + $query_args[ $name ] = 'false';
152 + }
153 + }
154 +
155 + // Add the color parameter if it was specified and is a valid color.
156 + if ( ! empty( $options['color'] ) ) {
157 + $color = sanitize_hex_color_no_hash( $options['color'] );
158 + if ( ! empty( $color ) ) {
159 + $query_args['color'] = $color;
160 + }
161 + }
162 +
163 + // Build final embed URL.
164 + $url = add_query_arg(
165 + $query_args,
166 + 'https://w.soundcloud.com/player/'
167 + );
168 +
169 + return sprintf(
170 + '<iframe width="%1$s" height="%2$d" scrolling="no" frameborder="no" src="%3$s"></iframe>',
171 + esc_attr( $width ),
172 + esc_attr( $height ),
173 + esc_url( $url )
174 + );
175 +}
176 +add_shortcode( 'soundcloud', 'soundcloud_shortcode' );
177 +
178 +/**
179 + * Plugin options getter
180 + *
181 + * @param string|array $option Option name.
182 + * @param mixed $default Default value.
183 + *
184 + * @return mixed Option value
185 + */
186 +function soundcloud_get_option( $option, $default = false ) {
187 + $value = get_option( 'soundcloud_' . $option );
188 +
189 + return '' === $value ? $default : $value;
190 +}
191 +
192 +/**
193 + * Decide if a url has a tracklist
194 + *
195 + * @param string $url Soundcloud URL.
196 + *
197 + * @return boolean
198 + */
199 +function soundcloud_url_has_tracklist( $url ) {
200 + return preg_match( '/^(.+?)\/(sets|groups|playlists)\/(.+?)$/', $url );
201 +}
202 +
203 +/**
204 + * SoundCloud Embed Reversal
205 + *
206 + * Converts a generic HTML embed code from SoundClound into a
207 + * WordPress.com-compatibly shortcode.
208 + *
209 + * @param string $content HTML content.
210 + *
211 + * @return string Parsed content.
212 + */
213 +function jetpack_soundcloud_embed_reversal( $content ) {
214 + if ( ! is_string( $content ) || false === stripos( $content, 'w.soundcloud.com/player' ) ) {
215 + return $content;
216 + }
217 +
218 + $regexes = array();
219 +
220 + $regexes[] = '#<iframe[^>]+?src="((?:https?:)?//w\.soundcloud\.com/player/[^"\']++)"[^>]*+>\s*?</iframe>#i';
221 + $regexes[] = '#&lt;iframe(?:[^&]|&(?!gt;))+?src="((?:https?:)?//w\.soundcloud\.com/player/[^"\']++)"(?:[^&]|&(?!gt;))*+&gt;\s*?&lt;/iframe&gt;#i';
222 +
223 + foreach ( $regexes as $regex ) {
224 + if ( ! preg_match_all( $regex, $content, $matches, PREG_SET_ORDER ) ) {
225 + continue;
226 + }
227 +
228 + foreach ( $matches as $match ) {
229 +
230 + // if pasted from the visual editor - prevent double encoding.
231 + $match[1] = str_replace( '&amp;amp;', '&amp;', $match[1] );
232 +
233 + $args = wp_parse_url( html_entity_decode( $match[1], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 ), PHP_URL_QUERY );
234 + $args = wp_parse_args( $args );
235 +
236 + if ( ! preg_match( '#^(?:https?:)?//api\.soundcloud\.com/.+$#i', $args['url'], $url_matches ) ) {
237 + continue;
238 + }
239 +
240 + if ( ! preg_match( '#height="(\d+)"#i', $match[0], $hmatch ) ) {
241 + $height = '';
242 + } else {
243 + $height = ' height="' . (int) $hmatch[1] . '"';
244 + }
245 +
246 + unset( $args['url'] );
247 + $params = 'params="';
248 + if ( is_countable( $args ) && count( $args ) > 0 ) {
249 + foreach ( $args as $key => $value ) {
250 + $params .= esc_html( $key ) . '=' . esc_html( $value ) . '&amp;';
251 + }
252 + $params = substr( $params, 0, -5 );
253 + }
254 + $params .= '"';
255 +
256 + $shortcode = '[soundcloud url="' . esc_url( $url_matches[0] ) . '" ' . $params . ' width="100%"' . $height . ' iframe="true" /]';
257 +
258 + $replace_regex = sprintf( '#\s*%s\s*#', preg_quote( $match[0], '#' ) );
259 + $content = preg_replace( $replace_regex, sprintf( "\n\n%s\n\n", $shortcode ), $content );
260 +
261 + /** This action is documented in modules/shortcodes/youtube.php */
262 + do_action( 'jetpack_embed_to_shortcode', 'soundcloud', $url_matches[0] );
263 + }
264 + }
265 +
266 + return $content;
267 +}
268 +
269 +if ( jetpack_shortcodes_should_hook_pre_kses() ) {
270 + add_filter( 'pre_kses', 'jetpack_soundcloud_embed_reversal' );
271 +}