PluginProbe
GutSlider – All in One Slider and Carousel Blocks for Gutenberg / 3.2.0
GutSlider – All in One Slider and Carousel Blocks for Gutenberg v3.2.0
3.2.0 3.1.0 3.0.0 2.13.2 2.13.1 2.13.0 trunk 1.0.0 2.1.0 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.2.1 2.2.2 2.3.0 2.4.0 2.5.1 2.5.3 2.5.4 2.5.5 All 57 releases
← All changes | build/blocks/post-slider/render.php +6 -361 3.1.0 → 3.2.0 View file →
@@ -1,371 +1,16 @@
1 1 <?php
2 2 /**
3 - * Render the post slider block.
3 + * Render the Blog Post block.
4 4 *
5 + * The work (query, cache, markup, schema) lives in \GutSlider\Blocks\PostSlider, which
6 + * the "Load more" endpoint uses too.
7 + *
5 8 * @param array $attributes The block attributes.
6 - * @return string The rendered block content.
7 9 */
8 10
9 11 // Exit if accessed directly.
10 12 if ( ! defined( 'ABSPATH' ) ) {
11 - exit;
13 + exit;
12 14 }
13 15
14 -if ( ! function_exists( 'gutslider_post_slider_terms' ) ) {
15 - /**
16 - * Terms to print above a slide title.
17 - *
18 - * The taxonomies the slider is filtered by double as the ones it labels slides with;
19 - * with no filter it falls back to core categories, which is what the block has always
20 - * shown. Term ids sit on the stored REST record under each taxonomy's rest_base.
21 - *
22 - * @param array $post A record from the `queryPosts` attribute.
23 - * @param array $taxonomies Taxonomy slugs to read.
24 - * @return WP_Term[] Terms, in taxonomy order.
25 - */
26 - function gutslider_post_slider_terms( $post, $taxonomies ) {
27 - $terms = [];
28 -
29 - foreach ( $taxonomies as $taxonomy ) {
30 - $taxonomy_object = get_taxonomy( $taxonomy );
31 - if ( ! $taxonomy_object ) {
32 - continue;
33 - }
34 -
35 - $rest_base = ! empty( $taxonomy_object->rest_base ) ? $taxonomy_object->rest_base : $taxonomy;
36 - $term_ids = isset( $post[ $rest_base ] ) && is_array( $post[ $rest_base ] ) ? $post[ $rest_base ] : [];
37 -
38 - foreach ( $term_ids as $term_id ) {
39 - $term = get_term( absint( $term_id ), $taxonomy );
40 - if ( $term && ! is_wp_error( $term ) ) {
41 - $terms[] = $term;
42 - }
43 - }
44 - }
45 -
46 - return $terms;
47 - }
48 -}
49 -
50 -if ( ! function_exists( 'gutslider_post_slider' ) ) {
51 - function gutslider_post_slider( $attributes ) {
52 - // Extract attributes with default values
53 - $defaults = [
54 - 'queryPosts' => [],
55 - 'showTitle' => true,
56 - 'showCat' => true,
57 - 'showExcerpt' => true,
58 - 'showBtn' => true,
59 - 'linkTitle' => true,
60 - 'titleTag' => 'h2',
61 - 'btnLabel' => __( 'Read More', 'slider-blocks' ),
62 - 'enableOverlay' => true,
63 - 'sliderType' => 'slider',
64 - 'uniqueId' => '',
65 - 'navContainerPosition' => 'nav_inside',
66 - 'navPosition' => 'nav_cc',
67 - 'catAnimation' => '',
68 - 'titleAnimation' => '',
69 - 'exptAnimation' => '',
70 - 'btnAnimation' => '',
71 - 'sliderOptions' => [],
72 - 'showNavigation' => true,
73 - 'showPagination' => true,
74 - 'customNavIcon' => false,
75 - 'navIconSource' => 'library',
76 - 'navPrevIcon' => 'arrowLeft',
77 - 'navNextIcon' => 'arrowRight',
78 - 'customPrevSVG' => '',
79 - 'customNextSVG' => '',
80 - 'excerptLength' => 20,
81 - 'enableRemoteNav' => false,
82 - 'remotePrevSelector' => '',
83 - 'remoteNextSelector' => '',
84 - 'detachContent' => false, // New attribute for detaching content
85 - 'showThumbs' => false,
86 - 'thumbContent' => 'image',
87 - 'thumbTitlePosition' => 'below',
88 - 'thumbsOptions' => [],
89 - ];
90 -
91 - $atts = wp_parse_args( $attributes, $defaults );
92 -
93 - // Sanitize attributes
94 - $atts = array_map( 'sanitize_text_field', $atts );
95 - $atts['queryPosts'] = isset( $attributes['queryPosts'] ) ? $attributes['queryPosts'] : [];
96 - $atts['sliderOptions'] = isset( $attributes['sliderOptions'] ) ? $attributes['sliderOptions'] : [];
97 - $atts['thumbsOptions'] = isset( $attributes['thumbsOptions'] ) ? $attributes['thumbsOptions'] : [];
98 - $atts['focusPoints'] = isset( $attributes['focusPoints'] ) ? $attributes['focusPoints'] : [];
99 -
100 - // Taxonomies the slider is filtered by. `taxQuery` covers every taxonomy;
101 - // `specificCategories` is the legacy, core-category-only attribute kept for blocks
102 - // saved before that. The editor empties it as soon as a filter is changed, so only
103 - // one of the two is ever in play.
104 - $tax_query = isset( $attributes['taxQuery'] ) && is_array( $attributes['taxQuery'] ) ? $attributes['taxQuery'] : [];
105 - $query_type = isset( $attributes['queryType'] ) ? sanitize_key( $attributes['queryType'] ) : 'latest_posts';
106 -
107 - $term_taxonomies = [ 'category' ];
108 - if ( 'specific_categories' === $query_type && ! empty( $tax_query ) ) {
109 - $term_taxonomies = array_map( 'sanitize_key', array_keys( $tax_query ) );
110 - }
111 -
112 - // Block classes
113 - $block_classes = [
114 - esc_attr( $atts['uniqueId'] ),
115 - esc_attr( $atts['navContainerPosition'] ),
116 - esc_attr( $atts['navPosition'] ),
117 - ];
118 -
119 - // Block wrapper attributes
120 - $block_props = get_block_wrapper_attributes( [
121 - 'class' => implode( ' ', array_filter( $block_classes ) )
122 - ] );
123 -
124 - // Single block classes
125 - $swiper_classes = [
126 - 'swiper-slide',
127 - $atts['sliderType'] === 'slider' ? 'slide-mode' : ''
128 - ];
129 -
130 - if ( ! empty( $atts['detachContent'] ) ) {
131 - $swiper_classes[] = 'detach-content';
132 - }
133 -
134 - ?>
135 - <div <?php echo wp_kses_data( $block_props ); ?> data-swiper-options="<?php echo esc_attr( wp_json_encode( $atts['sliderOptions'] ) ); ?>"
136 - <?php
137 - if ( '1' === $atts['showThumbs'] ) {
138 - echo 'data-thumbs-options="' . esc_attr( wp_json_encode( $atts['thumbsOptions'] ) ) . '" ';
139 - }
140 - ?>
141 - <?php
142 - if ( $atts['enableRemoteNav'] ) {
143 - echo 'data-rprev="' . esc_attr( $atts['remotePrevSelector'] ) . '" ';
144 - echo 'data-rnext="' . esc_attr( $atts['remoteNextSelector'] ) . '" ';
145 - }
146 - ?>
147 - >
148 - <div class="swiper">
149 - <div class="swiper-wrapper">
150 - <?php
151 - if ( is_array( $atts['queryPosts'] ) && ! empty( $atts['queryPosts'] ) ) {
152 - $index = 0;
153 - foreach ( $atts['queryPosts'] as $post ) {
154 - $index++;
155 - $post_title = isset( $post['title']['rendered'] ) ? $post['title']['rendered'] : '';
156 - $post_excerpt = isset( $post['excerpt']['rendered'] ) ? $post['excerpt']['rendered'] : '';
157 - $post_link = isset( $post['link'] ) ? $post['link'] : '';
158 - $post_image_id = isset( $post['featured_media'] ) ? $post['featured_media'] : '';
159 - $post_image = wp_get_attachment_image_url( $post_image_id, 'full' );
160 - // Check if focusPoints is set and not empty
161 - $focusPoints = isset( $atts['focusPoints'] ) && is_array( $atts['focusPoints'] ) ? $atts['focusPoints'] : [];
162 - $bg_position = isset( $focusPoints[$index - 1] ) && isset( $focusPoints[$index - 1]['x'] ) && isset( $focusPoints[$index - 1]['y'] )
163 - ? sprintf( 'background-position: %d%% %d%%;', round( $focusPoints[$index - 1]['x'] * 100 ), round( $focusPoints[$index - 1]['y'] * 100 ) )
164 - : 'background-position: center center;';
165 - $bg_style = $post_image ? sprintf( 'background-image: url(%s); %s', esc_url( $post_image ), $bg_position ) : $bg_position;
166 - $post_terms = gutslider_post_slider_terms( $post, $term_taxonomies );
167 -
168 - // create object-position style
169 - $object_position = isset( $focusPoints[$index - 1] ) && isset( $focusPoints[$index - 1]['x'] ) && isset( $focusPoints[$index - 1]['y'] )
170 - ? sprintf( 'object-position: %d%% %d%%;', round( $focusPoints[$index - 1]['x'] * 100 ), round( $focusPoints[$index - 1]['y'] * 100 ) )
171 - : 'object-position: center center;';
172 -
173 - ?>
174 - <div class="<?php echo esc_attr( implode( ' ', $swiper_classes ) ); ?>">
175 - <div class="swiper-container-outer"
176 - <?php if ( ! $atts['detachContent'] ) : ?>
177 - style="<?php echo esc_attr( $bg_style ); ?>"
178 - <?php endif; ?>
179 - >
180 - <?php if ( $atts['enableOverlay'] ) : ?>
181 - <div class="gutslider-overlay"></div>
182 - <?php endif; ?>
183 - <?php
184 - if ( $atts['detachContent'] && $post_image ) {
185 - ?>
186 - <a class="detached-featured-image" href="<?php echo esc_url( $post_link ); ?>">
187 - <img src="<?php echo esc_url( $post_image ); ?>" alt="<?php echo esc_attr( $post_title ); ?>"
188 - style="<?php echo esc_attr( $object_position ); ?>"
189 - />
190 - </a>
191 - <?php
192 - }
193 - ?>
194 - <div class="gutslider-content-wrapper<?php echo $atts['detachContent'] ? ' detach-content' : ''; ?>">
195 - <div class="gutslider-content-inner">
196 - <?php if ( $atts['showCat'] && ! empty( $post_terms ) ) : ?>
197 - <div class="post-categories <?php echo esc_attr( $atts['catAnimation'] ); ?>">
198 - <?php
199 - foreach ( $post_terms as $post_term ) {
200 - printf( '<span class="post-category">%s</span>', esc_html( $post_term->name ) );
201 - }
202 - ?>
203 - </div>
204 - <?php endif; ?>
205 -
206 - <?php if ( $atts['showTitle'] ) : ?>
207 - <?php
208 - $title_tag = tag_escape( $atts['titleTag'] );
209 - $title_content = sprintf(
210 - '<%1$s class="post-title %2$s">%3$s</%1$s>',
211 - $title_tag,
212 - esc_attr( $atts['titleAnimation'] ),
213 - esc_html( $post_title )
214 - );
215 -
216 - if ( $atts['linkTitle'] ) {
217 - printf(
218 - '<a href="%s" class="post-title">%s</a>',
219 - esc_url( $post_link ),
220 - $title_content // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
221 - );
222 - } else {
223 - echo wp_kses_post( $title_content );
224 - }
225 - ?>
226 - <?php endif; ?>
227 -
228 - <?php if ( $atts['showExcerpt'] ) : ?>
229 - <div class="post-excerpt <?php echo esc_attr( $atts['exptAnimation'] ); ?>">
230 - <?php
231 - if ( $atts['excerptLength'] > 0 ) {
232 - $post_excerpt = wp_trim_words( $post_excerpt, $atts['excerptLength'], '...' );
233 - }
234 - echo wp_kses_post( $post_excerpt );
235 - ?>
236 - </div>
237 - <?php endif; ?>
238 -
239 - <?php if ( $atts['showBtn'] ) : ?>
240 - <div class="post-cta-wrapper <?php echo esc_attr( $atts['btnAnimation'] ); ?>">
241 - <a href="<?php echo esc_url( $post_link ); ?>" class="post-cta">
242 - <?php echo esc_html( $atts['btnLabel'] ); ?>
243 - </a>
244 - </div>
245 - <?php endif; ?>
246 - </div>
247 - </div>
248 - </div>
249 - </div>
250 - <?php
251 - }
252 - }
253 - ?>
254 - </div>
255 - <?php
256 - if( $atts['showNavigation'] === '1' && $atts['navContainerPosition'] === 'nav_inside' && $atts['enableRemoteNav'] !== '1' ) {
257 - ?>
258 - <div class="gutslider-nav nav_inside <?php echo esc_attr( $atts['navPosition'] ); ?>">
259 - <?php if ( $atts['customNavIcon'] ) : ?>
260 - <div class="gutslider-prev">
261 - <!-- <div class="gutslider-prev-icon"> -->
262 - <?php
263 - if ( $atts['navIconSource'] === 'library' ) {
264 - echo wp_kses( gutslider_display_icon( $atts['navPrevIcon'] ), gutslider_allowed_svg_tags() ); // Ensure this function properly escapes output
265 - } else {
266 - echo wp_kses( $atts['customPrevSVG'], gutslider_allowed_svg_tags() );
267 - }
268 - ?>
269 - <!-- </div> -->
270 - </div>
271 - <div class="gutslider-next">
272 - <!-- <div class="gutslider-next-icon"> -->
273 - <?php
274 - if ( $atts['navIconSource'] === 'library' ) {
275 - echo wp_kses( gutslider_display_icon( $atts['navNextIcon'] ), gutslider_allowed_svg_tags() ); // Ensure this function properly escapes output
276 - } else {
277 - echo wp_kses( $atts['customNextSVG'], gutslider_allowed_svg_tags() );
278 - }
279 - ?>
280 - <!-- </div> -->
281 - </div>
282 - <?php else : ?>
283 - <div class="swiper-button-prev"></div>
284 - <div class="swiper-button-next"></div>
285 - <?php endif; ?>
286 - </div>
287 - <?php
288 - }
289 - ?>
290 - <?php
291 - if( $atts['showPagination'] === '1' ) {
292 - ?>
293 - <div class="swiper-pagination"></div>
294 - <?php
295 - }
296 - ?>
297 - </div>
298 - <?php
299 - if ( $atts['showNavigation'] === '1' && $atts['navContainerPosition'] === 'nav_outside' && $atts['enableRemoteNav'] !== '1' ) : ?>
300 - <div class="gutslider-nav nav_outside <?php echo esc_attr( $atts['navPosition'] ); ?>">
301 - <?php if ( $atts['customNavIcon'] ) : ?>
302 - <div class="gutslider-prev">
303 - <!-- <div class="gutslider-prev-icon"> -->
304 - <?php
305 - if ( $atts['navIconSource'] === 'library' ) {
306 - echo wp_kses( gutslider_display_icon( esc_attr( $atts['navPrevIcon'] ) ), gutslider_allowed_svg_tags() ); // Ensure this function properly escapes output
307 - } else {
308 - echo wp_kses( $atts['customPrevSVG'], gutslider_allowed_svg_tags() );
309 - }
310 - ?>
311 - <!-- </div> -->
312 - </div>
313 - <div class="gutslider-next">
314 - <!-- <div class="gutslider-next-icon"> -->
315 - <?php
316 - if ( $atts['navIconSource'] === 'library' ) {
317 - echo wp_kses( gutslider_display_icon( esc_attr( $atts['navNextIcon'] ) ), gutslider_allowed_svg_tags() ); // Ensure this function properly escapes output
318 - } else {
319 - echo wp_kses( $atts['customNextSVG'], gutslider_allowed_svg_tags() );
320 - }
321 - ?>
322 - <!-- </div> -->
323 - </div>
324 - <?php else : ?>
325 - <div class="swiper-button-prev"></div>
326 - <div class="swiper-button-next"></div>
327 - <?php endif; ?>
328 - </div>
329 - <?php endif; ?>
330 - <?php
331 - if ( '1' === $atts['showThumbs'] && is_array( $atts['queryPosts'] ) && ! empty( $atts['queryPosts'] ) ) {
332 - $thumb_classes = [ 'swiper', 'gutslider-thumbs', 'thumb-content-' . $atts['thumbContent'] ];
333 - if ( 'both' === $atts['thumbContent'] ) {
334 - $thumb_classes[] = 'thumb-title-' . $atts['thumbTitlePosition'];
335 - }
336 - $placeholder = GUTSLIDER_URL . 'assets/images/placeholder.svg';
337 - ?>
338 - <div class="<?php echo esc_attr( implode( ' ', $thumb_classes ) ); ?>">
339 - <div class="swiper-wrapper">
340 - <?php
341 - foreach ( $atts['queryPosts'] as $thumb_post ) {
342 - $thumb_media_id = isset( $thumb_post['featured_media'] ) ? $thumb_post['featured_media'] : '';
343 - $thumb_url = $thumb_media_id ? wp_get_attachment_image_url( $thumb_media_id, 'medium' ) : '';
344 - $thumb_alt = $thumb_media_id ? get_post_meta( $thumb_media_id, '_wp_attachment_image_alt', true ) : '';
345 - $thumb_title = isset( $thumb_post['title']['rendered'] ) ? $thumb_post['title']['rendered'] : '';
346 - ?>
347 - <div class="swiper-slide">
348 - <?php if ( 'title' !== $atts['thumbContent'] ) : ?>
349 - <img src="<?php echo esc_url( $thumb_url ? $thumb_url : $placeholder ); ?>" alt="<?php echo esc_attr( $thumb_alt ); ?>" />
350 - <?php endif; ?>
351 - <?php if ( 'image' !== $atts['thumbContent'] && $thumb_title ) : ?>
352 - <span class="gutslider-thumb-title"><?php echo wp_kses_post( $thumb_title ); ?></span>
353 - <?php endif; ?>
354 - </div>
355 - <?php
356 - }
357 - ?>
358 - </div>
359 - </div>
360 - <?php
361 - }
362 - ?>
363 - </div>
364 - <?php
365 - }
366 -
367 - }
368 -
369 - // call the render callback function
370 - gutslider_post_slider( $attributes );
371 -
16 +echo \GutSlider\Blocks\PostSlider::render( $attributes ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped