! empty( $attributes['query']['numberOfItems'] ) ? $attributes['query']['numberOfItems'] : 10, 'post_status' => 'publish', 'order' => ! empty( $attributes['query']['order'] ) ? $attributes['query']['order'] : 'desc', 'orderby' => ! empty( $attributes['query']['orderBy'] ) ? $attributes['query']['orderBy'] : 'date', 'suppress_filters' => false, 'post__not_in' => array( $post->ID ), ); if ( isset( $attributes['query']['selectedCategories'] ) ) { $args['category__in'] = array_column( $attributes['query']['selectedCategories'], 'id' ); } $recent_posts = get_posts( $args ); $formatted_posts = gutenify_get_post_info( $recent_posts ); $block_style = null; if ( isset( $attributes['className'] ) && strpos( $attributes['className'], 'is-style-horizontal' ) !== false ) { $block_style = 'horizontal'; } elseif ( isset( $attributes['className'] ) && strpos( $attributes['className'], 'is-style-stacked' ) !== false ) { $block_style = 'stacked'; } return gutenify_posts( $formatted_posts, $attributes, $props ); } /** * Renders the list and grid styles. * * @param array $posts Current posts. * @param array $attributes The block attributes. * * @return string Returns the block content for the list and grid styles. */ function gutenify_posts( $posts, $attributes, $props ) { $client_id = ! empty( $attributes['blockClientId'] ) ? $attributes['blockClientId'] : ''; $class_name = array( 'wp-block-gutenify-post-carousel', 'gutenify-section-' . $attributes['blockClientId'], 'gutenify-post-carousel-' . $attributes['layout'] ); $class = array( 'swiper-container', 'gutenify-post-carousel' ); $styles = array(); $block_style = ! empty( $attributes['className'] ) && strpos( $attributes['className'], 'is-style-stacked' ) !== false ? 'stacked' : 'horizontal'; if ( isset( $attributes['className'] ) ) { array_push( $class_name, $attributes['className'] ); } if ( isset( $attributes['align'] ) ) { array_push( $class_name, 'align' . $attributes['align'] ); } if ( isset( $attributes['columns'] ) ) { array_push( $class, 'has-columns has-' . $attributes['columns'] . '-columns has-responsive-columns' ); } if ( isset( $attributes['listPosition'] ) && 'right' === $attributes['listPosition'] && 'horizontal' === $block_style ) { array_push( $class, 'has-image-right' ); } if ( isset( $attributes['imageSize'] ) && 'horizontal' === $block_style ) { array_push( $class, 'has-' . $attributes['imageSize'] . '-image' ); } if ( isset( $attributes['imageStyle'] ) ) { array_push( $class, 'has-' . $attributes['imageStyle'] . '-image' ); } $class_name = apply_filters( 'gutenify--post-carousel--wrapper-class', $class_name, $props ); $class_name = apply_filters( 'gutenify_block_wrapper_class', esc_attr( implode( ' ', $class_name ) ), $attributes ); $block_content = sprintf( '
', $class_name, esc_attr( implode( ' ', apply_filters( 'gutenify_render_wrapper_class', $class, $attributes ) ) ), esc_attr( implode( ' ', apply_filters( 'gutenify_render_wrapper_styles', $styles, $attributes ) ) ) ); $list_items_markup = ''; foreach ( $posts as $post ) { $list_class = ''; $align_self_class = ''; $list_items_markup .= '
'; $list_items_markup .= '
'; if ( ! empty( $attributes['displayFeaturedImage'] ) && null !== $post['thumbnailURL'] && $post['thumbnailURL'] ) { $list_items_markup .= sprintf( '
', esc_url( $post['postLink'] ), esc_url( $post['thumbnailURL'] ) ); if ( 'horizontal' === $block_style && ( isset( $attributes['displayPostContent'] ) && ! $attributes['displayPostContent'] ) && ( isset( $attributes['columns'] ) && 2 >= $attributes['columns'] ) ) { $align_self_class = 'self-center'; } } else { $align_self_class = ' flex-start'; } $list_items_markup .= sprintf( '
', esc_attr( $align_self_class ) ); if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] && 'stacked' === $block_style ) { $list_items_markup .= sprintf( '', esc_url( $post['date'] ), esc_html( $post['dateReadable'] ) ); } $title = $post['title']; if ( ! $title ) { $title = _x( '(no title)', 'placeholder when a post has no title', 'gutenify' ); } $list_items_markup .= sprintf( '

%2$s

', $post['postLink'], $title ); $meta_data = ''; if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] && 'horizontal' === $block_style ) { $meta_data .= sprintf( '', esc_html( $post['date'] ), esc_html( $post['dateReadable'] ) ); } if ( ! empty( $attributes['displayPostAuthor'] ) ) { if ( ! get_the_author_meta( 'description' ) && post_type_supports( get_post_type(), 'author' ) ) { $meta_data .= ''; } } if ( ! empty( $attributes['displayPostCategories'] ) ) { /* translators: used between list items, there is a space after the comma. */ $categories_list = get_the_category_list( __( ', ' ), '', $post['ID'] ); if ( $categories_list ) { $meta_data .= sprintf( '%s ', $categories_list // phpcs:ignore WordPress.Security.EscapeOutput ); } } if ( ! empty( $meta_data ) ) { $list_items_markup .= sprintf( '
%1$s
', $meta_data ); } if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent'] ) { $post_excerpt = $post['postExcerpt']; $trimmed_excerpt = esc_html( wp_trim_words( $post_excerpt, $attributes['excerptLength'], ' … ' ) ); $list_items_markup .= '
'; $list_items_markup .= sprintf( '

%1$s

', esc_html( $trimmed_excerpt ) ); if ( isset( $attributes['displayPostLink'] ) && $attributes['displayPostLink'] ) { $list_items_markup .= sprintf( '%2$s%3$s', esc_url( $post['postLink'] ), esc_html( $attributes['postLink'] ), esc_html( $post['title'] ) ); } $list_items_markup .= '
'; } $list_items_markup .= '
'; } $block_content .= $list_items_markup; $block_content .= '
'; $has_navigation = ! empty( $attributes['hasNavigation'] ) && true === $attributes['hasNavigation']; $has_pagination = ! empty( $attributes['hasPagination'] ) && true === $attributes['hasPagination']; if ( $has_navigation ) { $block_content .= '
'; } if ( $has_pagination ) { $block_content .= '
'; } $block_content .= '
'; $block_content .= '
'; $block_content .= '
'; $columns = ! empty( $attributes['columns'] ) ? $attributes['columns'] : 1; $space_between = ! empty( $attributes['spaceBetween'] ) ? $attributes['spaceBetween'] : 10; $block_client_id = ! empty( $attributes['blockClientId'] ) ? $attributes['blockClientId'] : 1; ob_start(); wp_enqueue_script( 'gutenify-swiper' ); $config = '{ loop: true, slidesPerView: ' . $columns . ', breakpoints: { // when window width is >= 320px 320: { slidesPerView: 1, spaceBetween: 20 }, // when window width is >= 640px 640: { slidesPerView: 2, spaceBetween: 15 }, 1024: { slidesPerView: ' . $columns . ', spaceBetween: ' . $space_between . ' } },'; $config .= ' spaceBetween:' . $space_between . ','; if ( $has_navigation ) { $config .= ' navigation:{ nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev", },'; } $config .= ' pagination:{ el: ".swiper-pagination", clickable: true, }, '; $config .= ' scrollbar:{ draggable: true }, }'; $slider_var = 'slider_' . str_replace( '-', '_', $block_client_id ); $slider_function_name = 'reinitSlider' . $slider_var; wp_add_inline_script( 'gutenify-swiper', 'var ' . $slider_var . ' = new Swiper("#gutenify-section-' . $block_client_id . ' .swiper-container", ' . $config . '); console.log( ' . $config . ' ); jQuery(function($){ $(document).on("containerStretched", function(){ var swiperWrapper = $("' . $block_client_id . ' .swiper-wrapper"); var newSlides = swiperWrapper.children(".swiper-slide").clone(true); ' . $slider_var . '.destroy(); swiperWrapper.empty().append(newSlides); swiperWrapper.attr("style", ""); mySwiper = new Swiper("#gutenify-section-' . $block_client_id . ' .swiper-container", ' . $config . '); }); });' ); $block_content .= ''; echo $block_content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $output = ob_get_contents(); ob_end_clean(); return $output; } /** * Returns the posts for an internal posts. * * @param array $posts Current posts. * * @return array Returns posts. */ function gutenify_get_post_info( $posts ) { $formatted_posts = array(); foreach ( $posts as $post ) { $formatted_post = null; $formatted_post['thumbnailURL'] = get_the_post_thumbnail_url( $post ); $formatted_post['date'] = esc_attr( get_the_date( 'c', $post ) ); $formatted_post['dateReadable'] = esc_html( get_the_date( '', $post ) ); $formatted_post['title'] = get_the_title( $post ); $formatted_post['postLink'] = esc_url( get_permalink( $post ) ); $formatted_post['ID'] = absint( $post->ID ); $formatted_post['author_id'] = absint( $post->post_author ); $post_excerpt = $post->post_excerpt; if ( ! ( $post_excerpt ) ) { $post_excerpt = $post->post_content; } $formatted_post['postExcerpt'] = $post_excerpt; $formatted_posts[] = $formatted_post; } return $formatted_posts; } /** * Registers the `posts` block on server. */ function gutenify_register_post_carousel_block() { // Return early if this function does not exist. if ( ! function_exists( 'register_block_type' ) ) { return; } // Load attributes from block.json. ob_start(); include GUTENIFY_PLUGIN_DIR . 'src/blocks/post-carousel/block.json'; $metadata = json_decode( ob_get_clean(), true ); register_block_type( 'gutenify/post-carousel', array( 'attributes' => $metadata['attributes'], 'render_callback' => 'gutenify_render_post_carousel_block', ) ); } add_action( 'init', 'gutenify_register_post_carousel_block' );