PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.8.1
Jetpack – WP Security, Backup, Speed, & Growth v14.8.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 1 year ago images 2 years ago img 2 years ago js 1 year ago archiveorg-book.php 5 years ago archiveorg.php 5 years ago archives.php 5 years ago bandcamp.php 3 years ago brightcove.php 5 years ago cartodb.php 5 years ago class.filter-embedded-html-objects.php 2 years ago codepen.php 5 years ago crowdsignal.php 1 year ago dailymotion.php 3 years ago descript.php 4 years ago facebook.php 1 year ago flatio.php 5 years ago flickr.php 1 year ago getty.php 2 years ago gist.php 1 year ago googleapps.php 2 years ago googlemaps.php 2 years ago googleplus.php 5 years ago gravatar.php 2 years ago houzz.php 5 years ago inline-pdfs.php 4 years ago instagram.php 1 year ago kickstarter.php 3 years ago mailchimp.php 3 years ago medium.php 3 years ago mixcloud.php 2 years ago others.php 1 year ago pinterest.php 2 years ago presentations.php 2 years ago quiz.php 4 years ago recipe.php 1 year ago scribd.php 5 years ago sitemap.php 5 years ago slideshare.php 5 years ago slideshow.php 1 year ago smartframe.php 3 years ago soundcloud.php 3 years ago spotify.php 2 years ago ted.php 5 years ago tweet.php 2 years ago twitchtv.php 5 years ago twitter-timeline.php 5 years ago twitter.php 1 year ago unavailable.php 3 years ago untappd-menu.php 3 years ago upcoming-events.php 1 year ago ustream.php 5 years ago videopress.php 4 years ago vimeo.php 2 years ago vine.php 5 years ago vr.php 2 years ago wufoo.php 3 years ago youtube.php 1 year ago
soundcloud.php
265 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 /**
24 * SoundCloud shortcode handler
25 *
26 * @param string|array $atts The attributes passed to the shortcode like [soundcloud attr1="value" /].
27 * Is an empty string when no arguments are given.
28 * @param string $content The content between non-self closing [soundcloud]...[/soundcloud] tags.
29 *
30 * @return string Widget embed code HTML
31 */
32 function soundcloud_shortcode( $atts, $content = null ) {
33 global $wp_embed;
34
35 // Custom shortcode options.
36 $shortcode_options = array_merge(
37 array( 'url' => trim( $content ) ),
38 is_array( $atts ) ? $atts : array()
39 );
40
41 // The "url" option is required.
42 if ( empty( $shortcode_options['url'] ) ) {
43 if ( current_user_can( 'edit_posts' ) ) {
44 return esc_html__( 'Please specify a Soundcloud URL.', 'jetpack' );
45 } else {
46 return '<!-- Missing Soundcloud URL -->';
47 }
48 }
49
50 // If the shortcode is displayed in a WPCOM notification, display a simple link only.
51 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
52 require_once WP_CONTENT_DIR . '/lib/display-context.php';
53 $context = A8C\Display_Context\get_current_context();
54 if ( A8C\Display_Context\NOTIFICATIONS === $context ) {
55 return sprintf(
56 '<a href="%1$s" target="_blank" rel="noopener noreferrer">%1$s</a>',
57 esc_url( $shortcode_options['url'] )
58 );
59 }
60 }
61
62 // Turn shortcode option "param" (param=value&param2=value) into array of params.
63 $shortcode_params = array();
64 if ( isset( $shortcode_options['params'] ) ) {
65 parse_str( html_entity_decode( $shortcode_options['params'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 ), $shortcode_params );
66 $shortcode_options = array_merge(
67 $shortcode_options,
68 $shortcode_params
69 );
70 unset( $shortcode_options['params'] );
71 }
72
73 $options = shortcode_atts(
74 // This list used to include an 'iframe' option. We don't include it anymore as we don't support the Flash player anymore.
75 array(
76 'url' => '',
77 'width' => soundcloud_get_option( 'player_width' ),
78 'height' => soundcloud_url_has_tracklist( $shortcode_options['url'] ) ? soundcloud_get_option( 'player_height_multi' ) : soundcloud_get_option( 'player_height' ),
79 'auto_play' => soundcloud_get_option( 'auto_play' ),
80 'hide_related' => false,
81 'visual' => false,
82 'show_comments' => soundcloud_get_option( 'show_comments' ),
83 'color' => soundcloud_get_option( 'color' ),
84 'show_user' => false,
85 'show_reposts' => false,
86 ),
87 $shortcode_options,
88 'soundcloud'
89 );
90
91 // "width" needs to be an integer.
92 if ( ! empty( $options['width'] ) && ! preg_match( '/^\d+$/', $options['width'] ) ) {
93 // set to 0 so oEmbed will use the default 100% and WordPress themes will leave it alone.
94 $options['width'] = 0;
95 }
96 // Set default width if not defined.
97 $width = ! empty( $options['width'] ) ? absint( $options['width'] ) : '100%';
98
99 // Set default height if not defined.
100 if (
101 empty( $options['height'] )
102 || (
103 // "height" needs to be an integer.
104 ! empty( $options['height'] )
105 && ! preg_match( '/^\d+$/', $options['height'] )
106 )
107 ) {
108 if (
109 soundcloud_url_has_tracklist( $options['url'] )
110 || 'true' === $options['visual']
111 ) {
112 $height = 450;
113 } else {
114 $height = 166;
115 }
116 } else {
117 $height = absint( $options['height'] );
118 }
119
120 // Set visual to false when displaying the smallest player.
121 if ( '20' === $options['height'] ) {
122 $options['visual'] = false;
123 }
124
125 if (
126 class_exists( 'Jetpack_AMP_Support' )
127 && Jetpack_AMP_Support::is_amp_request()
128 && ! empty( $options['url'] )
129 && 'api.soundcloud.com' !== wp_parse_url( $options['url'], PHP_URL_HOST )
130 ) {
131 // Defer to oEmbed if an oEmbeddable URL is provided.
132 return $wp_embed->shortcode( $options, $options['url'] );
133 }
134
135 // Build our list of Soundcloud parameters.
136 $query_args = array(
137 'url' => rawurlencode( $options['url'] ),
138 );
139
140 // Add our options, if they are set to true or false.
141 foreach ( $options as $name => $value ) {
142 if ( 'true' === $value ) {
143 $query_args[ $name ] = 'true';
144 }
145
146 if ( 'false' === $value || false === $value ) {
147 $query_args[ $name ] = 'false';
148 }
149 }
150
151 // Add the color parameter if it was specified and is a valid color.
152 if ( ! empty( $options['color'] ) ) {
153 $color = sanitize_hex_color_no_hash( $options['color'] );
154 if ( ! empty( $color ) ) {
155 $query_args['color'] = $color;
156 }
157 }
158
159 // Build final embed URL.
160 $url = add_query_arg(
161 $query_args,
162 'https://w.soundcloud.com/player/'
163 );
164
165 return sprintf(
166 '<iframe width="%1$s" height="%2$d" scrolling="no" frameborder="no" src="%3$s"></iframe>',
167 esc_attr( $width ),
168 esc_attr( $height ),
169 $url
170 );
171 }
172 add_shortcode( 'soundcloud', 'soundcloud_shortcode' );
173
174 /**
175 * Plugin options getter
176 *
177 * @param string|array $option Option name.
178 * @param mixed $default Default value.
179 *
180 * @return mixed Option value
181 */
182 function soundcloud_get_option( $option, $default = false ) {
183 $value = get_option( 'soundcloud_' . $option );
184
185 return '' === $value ? $default : $value;
186 }
187
188 /**
189 * Decide if a url has a tracklist
190 *
191 * @param string $url Soundcloud URL.
192 *
193 * @return boolean
194 */
195 function soundcloud_url_has_tracklist( $url ) {
196 return preg_match( '/^(.+?)\/(sets|groups|playlists)\/(.+?)$/', $url );
197 }
198
199 /**
200 * SoundCloud Embed Reversal
201 *
202 * Converts a generic HTML embed code from SoundClound into a
203 * WordPress.com-compatibly shortcode.
204 *
205 * @param string $content HTML content.
206 *
207 * @return string Parsed content.
208 */
209 function jetpack_soundcloud_embed_reversal( $content ) {
210 if ( ! is_string( $content ) || false === stripos( $content, 'w.soundcloud.com/player' ) ) {
211 return $content;
212 }
213
214 $regexes = array();
215
216 $regexes[] = '#<iframe[^>]+?src="((?:https?:)?//w\.soundcloud\.com/player/[^"\']++)"[^>]*+>\s*?</iframe>#i';
217 $regexes[] = '#&lt;iframe(?:[^&]|&(?!gt;))+?src="((?:https?:)?//w\.soundcloud\.com/player/[^"\']++)"(?:[^&]|&(?!gt;))*+&gt;\s*?&lt;/iframe&gt;#i';
218
219 foreach ( $regexes as $regex ) {
220 if ( ! preg_match_all( $regex, $content, $matches, PREG_SET_ORDER ) ) {
221 continue;
222 }
223
224 foreach ( $matches as $match ) {
225
226 // if pasted from the visual editor - prevent double encoding.
227 $match[1] = str_replace( '&amp;amp;', '&amp;', $match[1] );
228
229 $args = wp_parse_url( html_entity_decode( $match[1], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 ), PHP_URL_QUERY );
230 $args = wp_parse_args( $args );
231
232 if ( ! preg_match( '#^(?:https?:)?//api\.soundcloud\.com/.+$#i', $args['url'], $url_matches ) ) {
233 continue;
234 }
235
236 if ( ! preg_match( '#height="(\d+)"#i', $match[0], $hmatch ) ) {
237 $height = '';
238 } else {
239 $height = ' height="' . (int) $hmatch[1] . '"';
240 }
241
242 unset( $args['url'] );
243 $params = 'params="';
244 if ( is_countable( $args ) && count( $args ) > 0 ) {
245 foreach ( $args as $key => $value ) {
246 $params .= esc_html( $key ) . '=' . esc_html( $value ) . '&amp;';
247 }
248 $params = substr( $params, 0, -5 );
249 }
250 $params .= '"';
251
252 $shortcode = '[soundcloud url="' . esc_url( $url_matches[0] ) . '" ' . $params . ' width="100%"' . $height . ' iframe="true" /]';
253
254 $replace_regex = sprintf( '#\s*%s\s*#', preg_quote( $match[0], '#' ) );
255 $content = preg_replace( $replace_regex, sprintf( "\n\n%s\n\n", $shortcode ), $content );
256
257 /** This action is documented in modules/shortcodes/youtube.php */
258 do_action( 'jetpack_embed_to_shortcode', 'soundcloud', $url_matches[0] );
259 }
260 }
261
262 return $content;
263 }
264 add_filter( 'pre_kses', 'jetpack_soundcloud_embed_reversal' );
265