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 / soundcloud.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
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 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 }
272