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 / slideshow.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
slideshow.php
333 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Slideshow shortcode.
4 * Adds a new "slideshow" gallery type when adding a gallery using the classic editor.
5 *
6 * @package automattic/jetpack
7 */
8
9 use Automattic\Jetpack\Assets;
10 use Automattic\Jetpack\Extensions\Slideshow;
11
12 if ( ! defined( 'ABSPATH' ) ) {
13 exit( 0 );
14 }
15
16 /**
17 * Slideshow shortcode usage: [gallery type="slideshow"] or the older [slideshow]
18 *
19 * @phan-constructor-used-for-side-effects
20 */
21 class Jetpack_Slideshow_Shortcode {
22 /**
23 * Number of slideshows on a page.
24 *
25 * @var int
26 */
27 public $instance_count = 0;
28
29 /**
30 * Constructor
31 */
32 public function __construct() {
33 global $shortcode_tags;
34
35 // Only if the slideshow shortcode has not already been defined.
36 if ( ! array_key_exists( 'slideshow', $shortcode_tags ) ) {
37 add_shortcode( 'slideshow', array( $this, 'shortcode_callback' ) );
38 }
39
40 // Only if the gallery shortcode has not been redefined.
41 if ( isset( $shortcode_tags['gallery'] ) && 'gallery_shortcode' === $shortcode_tags['gallery'] ) {
42 add_filter( 'post_gallery', array( $this, 'post_gallery' ), 1002, 2 );
43 add_filter( 'jetpack_gallery_types', array( $this, 'add_gallery_type' ), 10 );
44 }
45 }
46
47 /**
48 * Responds to the [gallery] shortcode, but not an actual shortcode callback.
49 *
50 * @param string $value An empty string if nothing has modified the gallery output, the output html otherwise.
51 * @param array $attr The shortcode attributes array.
52 *
53 * @return string The (un)modified $value
54 */
55 public function post_gallery( $value, $attr ) {
56 // Bail if somebody else has done something.
57 if ( ! empty( $value ) ) {
58 return $value;
59 }
60
61 // If [gallery type="slideshow"] have it behave just like [slideshow].
62 if ( ! empty( $attr['type'] ) && 'slideshow' === $attr['type'] ) {
63 return $this->shortcode_callback( $attr );
64 }
65
66 return $value;
67 }
68
69 /**
70 * Add the Slideshow type to gallery settings
71 *
72 * @see Jetpack_Tiled_Gallery::media_ui_print_templates
73 *
74 * @param array $types An array of types where the key is the value, and the value is the caption.
75 *
76 * @return array
77 */
78 public function add_gallery_type( $types = array() ) {
79 $types['slideshow'] = esc_html__( 'Slideshow', 'jetpack' );
80
81 return $types;
82 }
83
84 /**
85 * Display shortcode.
86 *
87 * @param array $attr Shortcode attributes.
88 */
89 public function shortcode_callback( $attr ) {
90 $post_id = get_the_ID();
91
92 $attr = shortcode_atts(
93 array(
94 'trans' => 'fade',
95 'order' => 'ASC',
96 'orderby' => 'menu_order ID',
97 'id' => $post_id,
98 'include' => '',
99 'exclude' => '',
100 'autostart' => true,
101 'size' => '',
102 ),
103 $attr,
104 'slideshow'
105 );
106
107 if ( 'rand' === strtolower( $attr['order'] ) ) {
108 $attr['orderby'] = 'none';
109 }
110
111 $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
112 if ( ! $attr['orderby'] ) {
113 $attr['orderby'] = 'menu_order ID';
114 }
115
116 if ( ! $attr['size'] ) {
117 $attr['size'] = 'full';
118 }
119
120 // Don't restrict to the current post if include.
121 $post_parent = ( empty( $attr['include'] ) ) ? (int) $attr['id'] : null;
122
123 $attachments = get_posts(
124 array(
125 'post_status' => 'inherit',
126 'post_type' => 'attachment',
127 'post_mime_type' => 'image',
128 'posts_per_page' => - 1,
129 'post_parent' => $post_parent,
130 'order' => $attr['order'],
131 'orderby' => $attr['orderby'],
132 'include' => $attr['include'],
133 'exclude' => $attr['exclude'],
134 'suppress_filters' => false,
135 )
136 );
137
138 if ( ! is_countable( $attachments ) || count( $attachments ) < 1 ) {
139 return false;
140 }
141
142 $gallery_instance = sprintf( 'gallery-%d-%d', $attr['id'], ++$this->instance_count );
143
144 $gallery = array();
145 foreach ( $attachments as $attachment ) {
146 $attachment_image_src = wp_get_attachment_image_src( $attachment->ID, $attr['size'] );
147 $attachment_image_src = false !== $attachment_image_src ? $attachment_image_src[0] : ''; // [url, width, height].
148 $attachment_image_title = get_the_title( $attachment->ID );
149 $attachment_image_alt = get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true );
150 /**
151 * Filters the Slideshow slide caption.
152 *
153 * @module shortcodes
154 *
155 * @since 2.3.0
156 *
157 * @param string wptexturize( strip_tags( $attachment->post_excerpt ) ) Post excerpt.
158 * @param string $attachment ->ID Attachment ID.
159 */
160 $caption = apply_filters( 'jetpack_slideshow_slide_caption', wptexturize( wp_strip_all_tags( $attachment->post_excerpt ) ), $attachment->ID );
161
162 $gallery[] = (object) array(
163 'src' => (string) esc_url_raw( $attachment_image_src ),
164 'id' => (string) $attachment->ID,
165 'title' => (string) esc_attr( $attachment_image_title ),
166 'alt' => (string) esc_attr( $attachment_image_alt ),
167 'caption' => (string) $caption,
168 'itemprop' => 'image',
169 );
170 }
171
172 $color = Jetpack_Options::get_option( 'slideshow_background_color', 'black' );
173 $autostart = $attr['autostart'] ? $attr['autostart'] : 'true';
174 $js_attr = array(
175 'gallery' => $gallery,
176 'selector' => $gallery_instance,
177 'trans' => $attr['trans'] ? $attr['trans'] : 'fade',
178 'autostart' => $autostart,
179 'color' => $color,
180 );
181
182 // Show a link to the gallery in feeds.
183 if ( is_feed() ) {
184 return sprintf(
185 '<a href="%s">%s</a>',
186 esc_url( get_permalink( $post_id ) . '#' . $gallery_instance . '-slideshow' ),
187 esc_html__( 'Click to view slideshow.', 'jetpack' )
188 );
189 }
190
191 if (
192 class_exists( 'Jetpack_AMP_Support' )
193 && Jetpack_AMP_Support::is_amp_request()
194 ) {
195 // Load the styles and use the rendering method from the Slideshow block.
196 Jetpack_Gutenberg::load_styles_as_required( 'slideshow' );
197
198 $amp_args = array(
199 'ids' => wp_list_pluck( $gallery, 'id' ),
200 );
201
202 if ( 'true' == $autostart ) { // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual -- attribute can be stored as boolean or string.
203 $amp_args['autoplay'] = true;
204 }
205
206 /*
207 * Blocks can be disabled in Jetpack Settings.
208 * If that's the case, we need to include the slideshow block manually.
209 * render_amp() lives in the block's render.php, which is loaded lazily,
210 * so make sure it is available before calling it.
211 */
212 if ( ! function_exists( 'Automattic\Jetpack\Extensions\Slideshow\render_amp' ) ) {
213 require_once JETPACK__PLUGIN_DIR . 'extensions/blocks/slideshow/render.php';
214 }
215
216 return Slideshow\render_amp( $amp_args );
217 }
218
219 return $this->slideshow_js( $js_attr );
220 }
221
222 /**
223 * Render the slideshow js
224 *
225 * Returns the necessary markup and js to fire a slideshow.
226 *
227 * @param array $attr Attributes for the slideshow.
228 *
229 * @uses $this->enqueue_scripts()
230 *
231 * @return string HTML output.
232 */
233 public function slideshow_js( $attr ) {
234 // Enqueue scripts.
235 $this->enqueue_scripts();
236
237 $output = '<p class="jetpack-slideshow-noscript robots-nocontent">' . esc_html__( 'This slideshow requires JavaScript.', 'jetpack' ) . '</p>';
238
239 /*
240 * Checking for JSON_HEX_AMP and friends here allows us to get rid of
241 * '&quot;', that can sometimes be included in the JSON input in some languages like French.
242 */
243 $gallery_attributes = _wp_specialchars(
244 wp_check_invalid_utf8(
245 wp_json_encode( $attr['gallery'], JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT )
246 ),
247 ENT_QUOTES,
248 false,
249 true
250 );
251
252 $output .= sprintf(
253 '<div id="%s" class="jetpack-slideshow-window jetpack-slideshow jetpack-slideshow-%s" data-trans="%s" data-autostart="%s" data-gallery="%s" itemscope itemtype="https://schema.org/ImageGallery"></div>',
254 esc_attr( $attr['selector'] . '-slideshow' ),
255 esc_attr( $attr['color'] ),
256 esc_attr( $attr['trans'] ),
257 esc_attr( $attr['autostart'] ),
258 $gallery_attributes
259 );
260
261 return $output;
262 }
263
264 /**
265 * Actually enqueues the scripts and styles.
266 */
267 public function enqueue_scripts() {
268
269 wp_register_script(
270 'jetpack-shortcode-deps',
271 plugins_url( '_inc/build/shortcodes/js/dependencies.min.js', JETPACK__PLUGIN_FILE ),
272 array( 'jquery' ),
273 '20250905',
274 true
275 );
276
277 wp_enqueue_script(
278 'jetpack-slideshow',
279 Assets::get_file_url_for_environment( '_inc/build/shortcodes/js/slideshow-shortcode.min.js', 'modules/shortcodes/js/slideshow-shortcode.js' ),
280 array( 'jquery', 'jetpack-shortcode-deps' ),
281 '20160119.1',
282 true
283 );
284 wp_enqueue_style(
285 'jetpack-slideshow',
286 plugins_url( '/css/slideshow-shortcode.css', __FILE__ ),
287 array(),
288 JETPACK__VERSION
289 );
290 wp_style_add_data( 'jetpack-slideshow', 'rtl', 'replace' );
291
292 require_once JETPACK__PLUGIN_DIR . '_inc/lib/class-jetpack-spinner.php';
293 wp_localize_script(
294 'jetpack-slideshow',
295 'jetpackSlideshowSettings',
296 /**
297 * Filters the slideshow JavaScript spinner.
298 *
299 * @module shortcodes
300 *
301 * @since 2.1.0
302 * @since 4.7.0 Added the `speed` option to the array of options.
303 *
304 * @param array $args
305 * - string - spinner - URL of the spinner image.
306 * - string - speed - Speed of the slideshow. Defaults to 4000.
307 * - string - label_prev - Aria label for slideshow's previous button
308 * - string - label_stop - Aria label for slideshow's pause button
309 * - string - label_next - Aria label for slideshow's next button
310 */
311 apply_filters(
312 'jetpack_js_slideshow_settings',
313 array(
314 'spinner' => 'data:image/svg+xml,' . rawurlencode( Jetpack_Spinner::render( 24 ) ),
315 'speed' => '4000',
316 'label_prev' => __( 'Previous Slide', 'jetpack' ),
317 'label_stop' => __( 'Pause Slideshow', 'jetpack' ),
318 'label_next' => __( 'Next Slide', 'jetpack' ),
319 )
320 )
321 );
322 }
323
324 /**
325 * Instantiate shortcode.
326 */
327 public static function init() {
328 new Jetpack_Slideshow_Shortcode();
329 }
330 }
331
332 Jetpack_Slideshow_Shortcode::init();
333