PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.1.3
Jetpack – WP Security, Backup, Speed, & Growth v12.1.3
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 3 years ago
slideshow.php
229 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 const FEATURE_NAME = 'slideshow';
16 const BLOCK_NAME = 'jetpack/' . FEATURE_NAME;
17
18 /**
19 * Registers the block for use in Gutenberg
20 * This is done via an action so that we can disable
21 * registration if we need to.
22 */
23 function register_block() {
24 Blocks::jetpack_register_block(
25 BLOCK_NAME,
26 array( 'render_callback' => __NAMESPACE__ . '\load_assets' )
27 );
28 }
29 add_action( 'init', __NAMESPACE__ . '\register_block' );
30
31 /**
32 * Slideshow block registration/dependency declaration.
33 *
34 * @param array $attr Array containing the slideshow block attributes.
35 * @param string $content String containing the slideshow block content.
36 *
37 * @return string
38 */
39 function load_assets( $attr, $content ) {
40 Jetpack_Gutenberg::load_assets_as_required( FEATURE_NAME );
41 if ( Blocks::is_amp_request() ) {
42 return render_amp( $attr );
43 }
44 return $content;
45 }
46
47 /**
48 * Render slideshow block for AMP
49 *
50 * @param array $attr Array containing the slideshow block attributes.
51 *
52 * @return string
53 */
54 function render_amp( $attr ) {
55 if ( empty( $attr['ids'] ) ) {
56 return '';
57 }
58
59 static $wp_block_jetpack_slideshow_id = 0;
60 ++$wp_block_jetpack_slideshow_id;
61
62 $ids = $attr['ids'];
63 $autoplay = empty( $attr['autoplay'] ) ? false : true;
64 $extras = array(
65 'wp-amp-block',
66 $autoplay ? 'wp-block-jetpack-slideshow__autoplay' : null,
67 $autoplay ? 'wp-block-jetpack-slideshow__autoplay-playing' : null,
68 );
69 $classes = Blocks::classes( FEATURE_NAME, $attr, $extras );
70
71 return sprintf(
72 '<div class="%1$s" id="wp-block-jetpack-slideshow__%2$d"><div class="wp-block-jetpack-slideshow_container swiper-container">%3$s%4$s%5$s</div></div>',
73 esc_attr( $classes ),
74 absint( $wp_block_jetpack_slideshow_id ),
75 amp_carousel( $attr, $wp_block_jetpack_slideshow_id ),
76 $autoplay ? autoplay_ui( $wp_block_jetpack_slideshow_id ) : '',
77 render_paginator( $ids, $wp_block_jetpack_slideshow_id )
78 );
79 }
80
81 /**
82 * Generate amp-carousel markup
83 *
84 * @param array $attr Array of block attributes.
85 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
86 *
87 * @return string amp-carousel markup.
88 */
89 function amp_carousel( $attr, $block_ordinal ) {
90 $ids = empty( $attr['ids'] ) ? array() : $attr['ids'];
91 $first_image = wp_get_attachment_metadata( $ids[0] );
92 $delay = empty( $attr['delay'] ) ? 3 : absint( $attr['delay'] );
93 $autoplay = empty( $attr['autoplay'] ) ? false : $attr['autoplay'];
94 $width = empty( $first_image['width'] ) ? 800 : $first_image['width'];
95 $height = empty( $first_image['height'] ) ? 600 : $first_image['height'];
96 return sprintf(
97 '<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>',
98 esc_attr( $width ),
99 esc_attr( $height ),
100 esc_attr__( 'Next Slide', 'jetpack' ),
101 esc_attr__( 'Previous Slide', 'jetpack' ),
102 $autoplay ? 'autoplay delay=' . esc_attr( $delay * 1000 ) : '',
103 absint( $block_ordinal ),
104 implode( '', slides( $ids, $width, $height ) )
105 );
106 }
107
108 /**
109 * Generate array of slides markup
110 *
111 * @param array $ids Array of image ids.
112 * @param int $width Width of the container.
113 * @param int $height Height of the container.
114 *
115 * @return array Array of slides markup.
116 */
117 function slides( $ids = array(), $width = 400, $height = 300 ) {
118 return array_map(
119 function ( $id ) use ( $width, $height ) {
120 $caption = wp_get_attachment_caption( $id );
121 $figcaption = $caption ? sprintf(
122 '<figcaption class="wp-block-jetpack-slideshow_caption gallery-caption">%s</figcaption>',
123 wp_kses_post( $caption )
124 ) : '';
125 $image = wp_get_attachment_image(
126 $id,
127 array( $width, $height ),
128 false,
129 array(
130 'class' => 'wp-block-jetpack-slideshow_image',
131 'object-fit' => 'contain',
132 )
133 );
134 return sprintf(
135 '<div class="wp-block-jetpack-slideshow_slide"><figure>%s%s</figure></div>',
136 $image,
137 $figcaption
138 );
139 },
140 $ids
141 );
142 }
143
144 /**
145 * Render blocks paginator section
146 *
147 * @param array $ids Array of image ids.
148 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
149 *
150 * @return array Array of bullets markup.
151 */
152 function render_paginator( $ids = array(), $block_ordinal = 0 ) {
153 $total = count( $ids );
154
155 if ( $total < 6 ) {
156 return bullets( $ids, $block_ordinal );
157 }
158
159 return sprintf(
160 '<div class="swiper-pagination-simple">%s / %s</div>',
161 absint( $block_ordinal ),
162 absint( $total )
163 );
164 }
165
166 /**
167 * Generate array of bullets markup
168 *
169 * @param array $ids Array of image ids.
170 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
171 *
172 * @return array Array of bullets markup.
173 */
174 function bullets( $ids = array(), $block_ordinal = 0 ) {
175 $buttons = array_map(
176 function ( $index ) {
177 $aria_label = sprintf(
178 /* translators: %d: Slide number. */
179 __( 'Go to slide %d', 'jetpack' ),
180 absint( $index + 1 )
181 );
182 return sprintf(
183 '<button option="%d" class="swiper-pagination-bullet" tabindex="0" role="button" aria-label="%s" %s></button>',
184 absint( $index ),
185 esc_attr( $aria_label ),
186 0 === $index ? 'selected' : ''
187 );
188 },
189 array_keys( $ids )
190 );
191
192 return sprintf(
193 '<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>',
194 absint( $block_ordinal ),
195 implode( '', $buttons )
196 );
197 }
198
199 /**
200 * Generate autoplay play/pause UI.
201 *
202 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
203 *
204 * @return string Autoplay UI markup.
205 */
206 function autoplay_ui( $block_ordinal = 0 ) {
207 $block_id = sprintf(
208 'wp-block-jetpack-slideshow__%d',
209 absint( $block_ordinal )
210 );
211 $amp_carousel_id = sprintf(
212 'wp-block-jetpack-slideshow__amp-carousel__%d',
213 absint( $block_ordinal )
214 );
215 $autoplay_pause = sprintf(
216 '<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>',
217 esc_attr__( 'Pause Slideshow', 'jetpack' ),
218 esc_attr( $amp_carousel_id ),
219 esc_attr( $block_id )
220 );
221 $autoplay_play = sprintf(
222 '<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>',
223 esc_attr__( 'Play Slideshow', 'jetpack' ),
224 esc_attr( $amp_carousel_id ),
225 esc_attr( $block_id )
226 );
227 return $autoplay_pause . $autoplay_play;
228 }
229