PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.9.2
Jetpack – WP Security, Backup, Speed, & Growth v13.9.2
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 / bandcamp.php
jetpack / modules / shortcodes Last commit date
css 2 years ago images 2 years ago img 2 years ago js 2 years 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 2 years ago dailymotion.php 3 years ago descript.php 4 years ago facebook.php 2 years ago flatio.php 5 years ago flickr.php 2 years ago getty.php 2 years ago gist.php 3 years 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 3 years ago kickstarter.php 3 years ago mailchimp.php 3 years ago medium.php 3 years ago mixcloud.php 2 years ago others.php 2 years ago pinterest.php 2 years ago presentations.php 2 years ago quiz.php 4 years ago recipe.php 2 years ago scribd.php 5 years ago sitemap.php 5 years ago slideshare.php 5 years ago slideshow.php 2 years 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 unavailable.php 3 years ago untappd-menu.php 3 years ago upcoming-events.php 3 years 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 wordads.php 5 years ago wufoo.php 3 years ago youtube.php 1 year ago
bandcamp.php
247 lines
1 <?php
2 /**
3 * Shortcode handler for [bandcamp], which inserts a bandcamp.com
4 * music player (iframe, html5)
5 *
6 * [bandcamp album=119385304]
7 * [bandcamp album=3462839126 bgcol=FFFFFF linkcol=4285BB size=venti]
8 * [bandcamp track=2446959313]
9 *
10 * @package automattic/jetpack
11 */
12
13 /**
14 * Display the Bandcamp shortcode.
15 *
16 * @param array $atts Shortcode attributes.
17 */
18 function shortcode_handler_bandcamp( $atts ) {
19 $csswidth = null;
20 $cssheight = null;
21 // there are no default values, but specify here anyway to explicitly list supported atts.
22 $attributes = shortcode_atts(
23 array(
24 'album' => null, // integer album id.
25 'track' => null, // integer track id.
26 'video' => null, // integer track id for video player.
27 'size' => 'venti', // one of the supported sizes.
28 'bgcol' => 'FFFFFF', // hex, no '#' prefix.
29 'linkcol' => null, // hex, no '#' prefix.
30 'layout' => null, // encoded layout url.
31 'width' => null, // integer with optional "%".
32 'height' => null, // integer with optional "%".
33 'notracklist' => null, // may be string "true" (defaults false).
34 'tracklist' => null, // may be string "false" (defaults true).
35 // phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- false positive
36 'artwork' => null, // may be string "false" (alternately: "none") or "small" (default is large).
37 'minimal' => null, // may be string "true" (defaults false).
38 'theme' => null, // may be theme identifier string ("light"|"dark" so far).
39 'package' => null, // integer package id.
40 't' => null, // integer track number.
41 'tracks' => null, // comma separated list of allowed tracks.
42 'esig' => null, // hex, no '#' prefix.
43 ),
44 $atts,
45 'bandcamp'
46 );
47
48 $sizes = array(
49 'venti' => array(
50 'width' => 400,
51 'height' => 100,
52 ),
53 'grande' => array(
54 'width' => 300,
55 'height' => 100,
56 ),
57 'grande2' => array(
58 'width' => 300,
59 'height' => 355,
60 ),
61 'grande3' => array(
62 'width' => 300,
63 'height' => 415,
64 ),
65 'tall_album' => array(
66 'width' => 150,
67 'height' => 295,
68 ),
69 'tall_track' => array(
70 'width' => 150,
71 'height' => 270,
72 ),
73 'tall2' => array(
74 'width' => 150,
75 'height' => 450,
76 ),
77 'short' => array(
78 'width' => 46,
79 'height' => 23,
80 ),
81 'large' => array(
82 'width' => 350,
83 'height' => 470,
84 ),
85 'medium' => array(
86 'width' => 450,
87 'height' => 120,
88 ),
89 'small' => array(
90 'width' => 350,
91 'height' => 42,
92 ),
93 );
94
95 $sizekey = $attributes['size'];
96 $height = null;
97 $width = null;
98
99 $is_video = false;
100
101 /*
102 * Build iframe url. For audio players, args are appended as
103 * extra path segments for historical reasons having to
104 * do with an IE-only flash bug which required this URL
105 * to contain no querystring. Delay the actual joining
106 * of args into a string until after we decide if it's
107 * a video player or an audio player
108 */
109 $argparts = array();
110
111 if ( ! isset( $attributes['album'] ) && ! isset( $attributes['track'] ) && ! isset( $attributes['video'] ) ) {
112 return "[bandcamp: shortcode must include 'track', 'album', or 'video' param]";
113 }
114
115 if ( isset( $attributes['track'] ) && is_numeric( $attributes['track'] ) ) {
116 $track = esc_attr( $attributes['track'] );
117 array_push( $argparts, "track={$track}" );
118 } elseif ( isset( $attributes['video'] ) && is_numeric( $attributes['video'] ) ) {
119 $track = esc_attr( $attributes['video'] ); // videos are referenced by track id.
120 $url = '//bandcamp.com/EmbeddedPlayer/v=2';
121 $is_video = true;
122 array_push( $argparts, "track={$track}" );
123 }
124 if ( isset( $attributes['album'] ) && is_numeric( $attributes['album'] ) ) {
125 $album = esc_attr( $attributes['album'] );
126 array_push( $argparts, "album={$album}" );
127 }
128
129 if ( 'tall' === $sizekey ) {
130 if ( isset( $attributes['album'] ) ) {
131 $sizekey .= '_album';
132 } else {
133 $sizekey .= '_track';
134 }
135 }
136
137 // if size specified that we don't recognize, fall back on venti.
138 if ( empty( $sizes[ $sizekey ] ) ) {
139 $sizekey = 'venti';
140 $attributes['size'] = 'venti';
141 }
142
143 /*
144 * use strict regex for digits + optional % instead of absint for height/width
145 * 'width' and 'height' params in the iframe url get the exact string from the shortcode
146 * args, whereas the inline style attribute must have "px" added to it if it has no "%"
147 */
148 if ( isset( $attributes['width'] ) && preg_match( '|^([0-9]+)(%)?$|', $attributes['width'], $matches ) ) {
149 $width = $attributes['width'];
150 $csswidth = $attributes['width'];
151 if ( count( $matches ) < 3 ) {
152 $csswidth .= 'px';
153 }
154 }
155 if ( isset( $attributes['height'] ) && preg_match( '|^([0-9]+)(%)?$|', $attributes['height'], $matches ) ) {
156 $height = $attributes['height'];
157 $cssheight = $attributes['height'];
158 if ( count( $matches ) < 3 ) {
159 $cssheight .= 'px';
160 }
161 }
162
163 if ( ! $height ) {
164 $height = $sizes[ $sizekey ]['height'];
165 $cssheight = $height . 'px';
166 }
167
168 if ( ! $width ) {
169 $width = $sizes[ $sizekey ]['width'];
170 $csswidth = $width . 'px';
171 }
172
173 if ( isset( $attributes['layout'] ) ) {
174 array_push( $argparts, "layout={$attributes['layout']}" );
175 } elseif ( isset( $attributes['size'] ) && preg_match( '|^[a-zA-Z0-9]+$|', $attributes['size'] ) ) {
176 array_push( $argparts, "size={$attributes['size']}" );
177 }
178
179 if ( isset( $attributes['bgcol'] ) && preg_match( '|^[0-9A-Fa-f]+$|', $attributes['bgcol'] ) ) {
180 array_push( $argparts, "bgcol={$attributes['bgcol']}" );
181 }
182
183 if ( isset( $attributes['linkcol'] ) && preg_match( '|^[0-9A-Fa-f]+$|', $attributes['linkcol'] ) ) {
184 array_push( $argparts, "linkcol={$attributes['linkcol']}" );
185 }
186
187 if ( isset( $attributes['package'] ) && preg_match( '|^[0-9]+$|', $attributes['package'] ) ) {
188 array_push( $argparts, "package={$attributes['package']}" );
189 }
190
191 if ( isset( $attributes['t'] ) && preg_match( '|^[0-9]+$|', $attributes['t'] ) ) {
192 array_push( $argparts, "t={$attributes['t']}" );
193 }
194
195 if ( 'true' === $attributes['notracklist'] ) {
196 array_push( $argparts, 'notracklist=true' );
197 }
198
199 // 'tracklist' arg deprecates 'notracklist=true' to be less weird. note, behavior
200 // if both are specified is undefined
201 switch ( $attributes['tracklist'] ) {
202 case 'false':
203 case 'none':
204 array_push( $argparts, 'tracklist=false' );
205 break;
206 }
207
208 switch ( $attributes['artwork'] ) {
209 case 'false':
210 case 'none':
211 case 'small':
212 array_push( $argparts, 'artwork=' . $attributes['artwork'] );
213 break;
214 }
215
216 if ( 'true' === $attributes['minimal'] ) {
217 array_push( $argparts, 'minimal=true' );
218 }
219
220 if ( isset( $attributes['theme'] ) && preg_match( '|^[a-zA-Z_]+$|', $attributes['theme'] ) ) {
221 array_push( $argparts, "theme={$attributes['theme']}" );
222 }
223
224 // param 'tracks' is signed digest param 'esig'.
225 if ( isset( $attributes['tracks'] ) && preg_match( '|^[0-9\,]+$|', $attributes['tracks'] ) ) {
226 if ( isset( $attributes['esig'] ) && preg_match( '|^[0-9A-Fa-f]+$|', $attributes['esig'] ) ) {
227 array_push( $argparts, "tracks={$attributes['tracks']}" );
228 array_push( $argparts, "esig={$attributes['esig']}" );
229 }
230 }
231
232 if ( $is_video ) {
233 $url = '//bandcamp.com/VideoEmbed?' . implode( '&', $argparts );
234 $extra_attrs = " mozallowfullscreen='1' webkitallowfullscreen='1' allowfullscreen='1'";
235 } else {
236 $url = '//bandcamp.com/EmbeddedPlayer/v=2/' . implode( '/', $argparts ) . '/';
237 $extra_attrs = '';
238 }
239
240 $iframe = '<iframe width="%s" height="%s" style="position: relative; display: block; width: %s; height: %s;" src="%s" allowtransparency="true" frameborder="0"%s></iframe>';
241 $iframe = sprintf( $iframe, esc_attr( $width ), esc_attr( $height ), esc_attr( $csswidth ), esc_attr( $cssheight ), esc_url( $url ), $extra_attrs );
242
243 return $iframe;
244 }
245
246 add_shortcode( 'bandcamp', 'shortcode_handler_bandcamp' );
247