PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.9.2
Jetpack – WP Security, Backup, Speed, & Growth v14.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 / extensions / blocks / slideshow / slideshow.php
jetpack / extensions / blocks / slideshow Last commit date
slideshow.php 1 year ago
slideshow.php
261 lines
1 <?php
2 /**
3 * Slideshow Block.
4 *
5 * @since 7.1.0
6 *
7 * @package automattic/jetpack
8 */
9
10 namespace Automattic\Jetpack\Extensions\Slideshow;
11
12 use Automattic\Jetpack\Blocks;
13 use Jetpack_Gutenberg;
14
15 /**
16 * Registers the block for use in Gutenberg
17 * This is done via an action so that we can disable
18 * registration if we need to.
19 */
20 function register_block() {
21 Blocks::jetpack_register_block(
22 __DIR__,
23 array( 'render_callback' => __NAMESPACE__ . '\load_assets' )
24 );
25 }
26 add_action( 'init', __NAMESPACE__ . '\register_block' );
27
28 /**
29 * Slideshow block registration/dependency declaration.
30 *
31 * @param array $attr Array containing the slideshow block attributes.
32 * @param string $content String containing the slideshow block content.
33 *
34 * @return string
35 */
36 function load_assets( $attr, $content ) {
37 Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
38 if ( Blocks::is_amp_request() ) {
39 return render_amp( $attr );
40 }
41
42 // Enqueue Swiper bundle for dynamic loading
43 if ( ! is_admin() && ! Blocks::is_amp_request() ) {
44 enqueue_swiper_library();
45 }
46
47 return $content;
48 }
49
50 /**
51 * Render slideshow block for AMP
52 *
53 * @param array $attr Array containing the slideshow block attributes.
54 *
55 * @return string
56 */
57 function render_amp( $attr ) {
58 if ( empty( $attr['ids'] ) ) {
59 return '';
60 }
61
62 static $wp_block_jetpack_slideshow_id = 0;
63 ++$wp_block_jetpack_slideshow_id;
64
65 $ids = $attr['ids'];
66 $autoplay = empty( $attr['autoplay'] ) ? false : true;
67 $extras = array(
68 'wp-amp-block',
69 $autoplay ? 'wp-block-jetpack-slideshow__autoplay' : null,
70 $autoplay ? 'wp-block-jetpack-slideshow__autoplay-playing' : null,
71 );
72 $classes = Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr, $extras );
73
74 return sprintf(
75 '<div class="%1$s" id="wp-block-jetpack-slideshow__%2$d"><div class="wp-block-jetpack-slideshow_container swiper">%3$s%4$s%5$s</div></div>',
76 esc_attr( $classes ),
77 absint( $wp_block_jetpack_slideshow_id ),
78 amp_carousel( $attr, $wp_block_jetpack_slideshow_id ),
79 $autoplay ? autoplay_ui( $wp_block_jetpack_slideshow_id ) : '',
80 render_paginator( $ids, $wp_block_jetpack_slideshow_id )
81 );
82 }
83
84 /**
85 * Generate amp-carousel markup
86 *
87 * @param array $attr Array of block attributes.
88 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
89 *
90 * @return string amp-carousel markup.
91 */
92 function amp_carousel( $attr, $block_ordinal ) {
93 $ids = empty( $attr['ids'] ) ? array() : $attr['ids'];
94 $first_image = wp_get_attachment_metadata( $ids[0] );
95 $delay = empty( $attr['delay'] ) ? 3 : absint( $attr['delay'] );
96 $autoplay = empty( $attr['autoplay'] ) ? false : $attr['autoplay'];
97 $width = empty( $first_image['width'] ) ? 800 : $first_image['width'];
98 $height = empty( $first_image['height'] ) ? 600 : $first_image['height'];
99 return sprintf(
100 '<amp-carousel width="%1$d" height="%2$d" layout="responsive" type="slides" data-next-button-aria-label="%3$s" data-prev-button-aria-label="%4$s" controls loop %5$s id="wp-block-jetpack-slideshow__amp-carousel__%6$s" on="slideChange:wp-block-jetpack-slideshow__amp-pagination__%6$s.toggle(index=event.index, value=true)">%7$s</amp-carousel>',
101 esc_attr( $width ),
102 esc_attr( $height ),
103 esc_attr__( 'Next Slide', 'jetpack' ),
104 esc_attr__( 'Previous Slide', 'jetpack' ),
105 $autoplay ? 'autoplay delay=' . esc_attr( $delay * 1000 ) : '',
106 absint( $block_ordinal ),
107 implode( '', slides( $ids, $width, $height ) )
108 );
109 }
110
111 /**
112 * Generate array of slides markup
113 *
114 * @param array $ids Array of image ids.
115 * @param int $width Width of the container.
116 * @param int $height Height of the container.
117 *
118 * @return array Array of slides markup.
119 */
120 function slides( $ids = array(), $width = 400, $height = 300 ) {
121 return array_map(
122 function ( $id ) use ( $width, $height ) {
123 $caption = wp_get_attachment_caption( $id );
124 $figcaption = $caption ? sprintf(
125 '<figcaption class="wp-block-jetpack-slideshow_caption gallery-caption">%s</figcaption>',
126 wp_kses_post( $caption )
127 ) : '';
128 $image = wp_get_attachment_image(
129 $id,
130 array( $width, $height ),
131 false,
132 array(
133 'class' => 'wp-block-jetpack-slideshow_image',
134 'object-fit' => 'contain',
135 )
136 );
137 return sprintf(
138 '<div class="wp-block-jetpack-slideshow_slide"><figure>%s%s</figure></div>',
139 $image,
140 $figcaption
141 );
142 },
143 $ids
144 );
145 }
146
147 /**
148 * Render blocks paginator section
149 *
150 * @param array $ids Array of image ids.
151 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
152 *
153 * @return array Array of bullets markup.
154 */
155 function render_paginator( $ids = array(), $block_ordinal = 0 ) {
156 $total = count( $ids );
157
158 if ( $total < 6 ) {
159 return bullets( $ids, $block_ordinal );
160 }
161
162 return sprintf(
163 '<div class="swiper-pagination-simple">%s / %s</div>',
164 absint( $block_ordinal ),
165 absint( $total )
166 );
167 }
168
169 /**
170 * Generate array of bullets markup
171 *
172 * @param array $ids Array of image ids.
173 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
174 *
175 * @return array Array of bullets markup.
176 */
177 function bullets( $ids = array(), $block_ordinal = 0 ) {
178 $buttons = array_map(
179 function ( $index ) {
180 $aria_label = sprintf(
181 /* translators: %d: Slide number. */
182 __( 'Go to slide %d', 'jetpack' ),
183 absint( $index + 1 )
184 );
185 return sprintf(
186 '<button option="%d" class="swiper-pagination-bullet" tabindex="0" role="button" aria-label="%s" %s></button>',
187 absint( $index ),
188 esc_attr( $aria_label ),
189 0 === $index ? 'selected' : ''
190 );
191 },
192 array_keys( $ids )
193 );
194
195 return sprintf(
196 '<amp-selector id="wp-block-jetpack-slideshow__amp-pagination__%1$d" class="wp-block-jetpack-slideshow_pagination swiper-pagination swiper-pagination-custom amp-pagination" on="select:wp-block-jetpack-slideshow__amp-carousel__%1$d.goToSlide(index=event.targetOption)" layout="container">%2$s</amp-selector>',
197 absint( $block_ordinal ),
198 implode( '', $buttons )
199 );
200 }
201
202 /**
203 * Generate autoplay play/pause UI.
204 *
205 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
206 *
207 * @return string Autoplay UI markup.
208 */
209 function autoplay_ui( $block_ordinal = 0 ) {
210 $block_id = sprintf(
211 'wp-block-jetpack-slideshow__%d',
212 absint( $block_ordinal )
213 );
214 $amp_carousel_id = sprintf(
215 'wp-block-jetpack-slideshow__amp-carousel__%d',
216 absint( $block_ordinal )
217 );
218 $autoplay_pause = sprintf(
219 '<a aria-label="%s" class="wp-block-jetpack-slideshow_button-pause" role="button" on="tap:%s.toggleAutoplay(toggleOn=false),%s.toggleClass(class=wp-block-jetpack-slideshow__autoplay-playing,force=false)"></a>',
220 esc_attr__( 'Pause Slideshow', 'jetpack' ),
221 esc_attr( $amp_carousel_id ),
222 esc_attr( $block_id )
223 );
224 $autoplay_play = sprintf(
225 '<a aria-label="%s" class="wp-block-jetpack-slideshow_button-play" role="button" on="tap:%s.toggleAutoplay(toggleOn=true),%s.toggleClass(class=wp-block-jetpack-slideshow__autoplay-playing,force=true)"></a>',
226 esc_attr__( 'Play Slideshow', 'jetpack' ),
227 esc_attr( $amp_carousel_id ),
228 esc_attr( $block_id )
229 );
230 return $autoplay_pause . $autoplay_play;
231 }
232
233 /**
234 * Enqueue Swiper library assets for dynamic loading.
235 *
236 * @return void
237 */
238 function enqueue_swiper_library() {
239 $swiper_js_path = Jetpack_Gutenberg::get_blocks_directory() . 'swiper.js';
240 $swiper_css_path = Jetpack_Gutenberg::get_blocks_directory() . 'swiper' . ( is_rtl() ? '.rtl' : '' ) . '.css';
241
242 if ( Jetpack_Gutenberg::block_has_asset( $swiper_js_path ) ) {
243 wp_enqueue_script(
244 'jetpack-swiper-library',
245 plugins_url( $swiper_js_path, JETPACK__PLUGIN_FILE ),
246 array(),
247 JETPACK__VERSION,
248 true
249 );
250 }
251
252 if ( Jetpack_Gutenberg::block_has_asset( $swiper_css_path ) ) {
253 wp_enqueue_style(
254 'jetpack-swiper-library',
255 plugins_url( $swiper_css_path, JETPACK__PLUGIN_FILE ),
256 array(),
257 JETPACK__VERSION
258 );
259 }
260 }
261