PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.2.1
Jetpack – WP Security, Backup, Speed, & Growth v15.2.1
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 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 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 / soundcloud.php
jetpack / modules / shortcodes Last commit date
css 10 months ago images 2 years ago img 2 years ago js 9 months ago archiveorg-book.php 1 year ago archiveorg.php 1 year ago archives.php 1 year ago bandcamp.php 11 months ago brightcove.php 1 year ago cartodb.php 1 year ago class.filter-embedded-html-objects.php 1 year ago codepen.php 1 year ago crowdsignal.php 9 months ago dailymotion.php 1 year ago descript.php 1 year ago facebook.php 1 year ago flatio.php 1 year ago flickr.php 11 months ago getty.php 1 year ago gist.php 1 year ago googleapps.php 1 year ago googlemaps.php 1 year ago googleplus.php 1 year ago gravatar.php 1 year ago houzz.php 1 year ago inline-pdfs.php 1 year ago instagram.php 1 year ago kickstarter.php 1 year ago mailchimp.php 1 year ago medium.php 1 year ago mixcloud.php 1 year ago others.php 1 year ago pinterest.php 1 year ago presentations.php 1 year ago quiz.php 1 year ago recipe.php 11 months ago scribd.php 1 year ago shortcode-utils.php 1 year ago sitemap.php 1 year ago slideshare.php 9 months ago slideshow.php 11 months ago smartframe.php 1 year ago soundcloud.php 1 year ago spotify.php 1 year ago ted.php 11 months ago tweet.php 1 year ago twitchtv.php 1 year ago twitter-timeline.php 1 year ago twitter.php 1 year ago unavailable.php 1 year ago untappd-menu.php 1 year ago upcoming-events.php 1 year ago ustream.php 1 year ago videopress.php 1 year ago vimeo.php 1 year ago vine.php 1 year ago vr.php 1 year ago wufoo.php 1 year ago youtube.php 1 year ago
soundcloud.php
272 lines
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 <johannes@soundcloud.com>
8 * Options support: Tiffany Conroy <tiffany@soundcloud.com>
9 * HTML5 & oEmbed support: Tim Bormans <tim@soundcloud.com>
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 $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 }
272