PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 14.9
Jetpack – WP Security, Backup, Speed, & Growth v14.9
16.2-beta 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 All 501 releases
jetpack / modules / shortcodes / slideshow.php

slideshow.php in Jetpack – WP Security, Backup, Speed, & Growth 14.9, at modules/shortcodes/slideshow.php

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