PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.9.1
Jetpack – WP Security, Backup, Speed, & Growth v15.9.1
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 1 month ago js 7 months ago archiveorg-book.php 7 months ago archiveorg.php 3 weeks ago archives.php 1 month 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 6 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 3 weeks 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 1 week ago scribd.php 7 months ago shortcode-utils.php 7 months ago sitemap.php 7 months ago slideshare.php 7 months ago slideshow.php 1 month ago smartframe.php 7 months ago soundcloud.php 3 weeks ago spotify.php 7 months ago ted.php 7 months ago tweet.php 7 months ago twitchtv.php 1 week 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
331 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 */
210 if ( ! class_exists( 'Automattic\Jetpack\Extensions\Slideshow' ) ) {
211 require_once JETPACK__PLUGIN_DIR . 'extensions/blocks/slideshow/slideshow.php';
212 }
213
214 return Slideshow\render_amp( $amp_args );
215 }
216
217 return $this->slideshow_js( $js_attr );
218 }
219
220 /**
221 * Render the slideshow js
222 *
223 * Returns the necessary markup and js to fire a slideshow.
224 *
225 * @param array $attr Attributes for the slideshow.
226 *
227 * @uses $this->enqueue_scripts()
228 *
229 * @return string HTML output.
230 */
231 public function slideshow_js( $attr ) {
232 // Enqueue scripts.
233 $this->enqueue_scripts();
234
235 $output = '<p class="jetpack-slideshow-noscript robots-nocontent">' . esc_html__( 'This slideshow requires JavaScript.', 'jetpack' ) . '</p>';
236
237 /*
238 * Checking for JSON_HEX_AMP and friends here allows us to get rid of
239 * '&quot;', that can sometimes be included in the JSON input in some languages like French.
240 */
241 $gallery_attributes = _wp_specialchars(
242 wp_check_invalid_utf8(
243 wp_json_encode( $attr['gallery'], JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT )
244 ),
245 ENT_QUOTES,
246 false,
247 true
248 );
249
250 $output .= sprintf(
251 '<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>',
252 esc_attr( $attr['selector'] . '-slideshow' ),
253 esc_attr( $attr['color'] ),
254 esc_attr( $attr['trans'] ),
255 esc_attr( $attr['autostart'] ),
256 $gallery_attributes
257 );
258
259 return $output;
260 }
261
262 /**
263 * Actually enqueues the scripts and styles.
264 */
265 public function enqueue_scripts() {
266
267 wp_register_script(
268 'jetpack-shortcode-deps',
269 plugins_url( '_inc/build/shortcodes/js/dependencies.min.js', JETPACK__PLUGIN_FILE ),
270 array( 'jquery' ),
271 '20250905',
272 true
273 );
274
275 wp_enqueue_script(
276 'jetpack-slideshow',
277 Assets::get_file_url_for_environment( '_inc/build/shortcodes/js/slideshow-shortcode.min.js', 'modules/shortcodes/js/slideshow-shortcode.js' ),
278 array( 'jquery', 'jetpack-shortcode-deps' ),
279 '20160119.1',
280 true
281 );
282 wp_enqueue_style(
283 'jetpack-slideshow',
284 plugins_url( '/css/slideshow-shortcode.css', __FILE__ ),
285 array(),
286 JETPACK__VERSION
287 );
288 wp_style_add_data( 'jetpack-slideshow', 'rtl', 'replace' );
289
290 require_once JETPACK__PLUGIN_DIR . '_inc/lib/class-jetpack-spinner.php';
291 wp_localize_script(
292 'jetpack-slideshow',
293 'jetpackSlideshowSettings',
294 /**
295 * Filters the slideshow JavaScript spinner.
296 *
297 * @module shortcodes
298 *
299 * @since 2.1.0
300 * @since 4.7.0 Added the `speed` option to the array of options.
301 *
302 * @param array $args
303 * - string - spinner - URL of the spinner image.
304 * - string - speed - Speed of the slideshow. Defaults to 4000.
305 * - string - label_prev - Aria label for slideshow's previous button
306 * - string - label_stop - Aria label for slideshow's pause button
307 * - string - label_next - Aria label for slideshow's next button
308 */
309 apply_filters(
310 'jetpack_js_slideshow_settings',
311 array(
312 'spinner' => 'data:image/svg+xml,' . rawurlencode( Jetpack_Spinner::render( 24 ) ),
313 'speed' => '4000',
314 'label_prev' => __( 'Previous Slide', 'jetpack' ),
315 'label_stop' => __( 'Pause Slideshow', 'jetpack' ),
316 'label_next' => __( 'Next Slide', 'jetpack' ),
317 )
318 )
319 );
320 }
321
322 /**
323 * Instantiate shortcode.
324 */
325 public static function init() {
326 new Jetpack_Slideshow_Shortcode();
327 }
328 }
329
330 Jetpack_Slideshow_Shortcode::init();
331