1, * 'link' => 'https://...', * 'caption' => '...' * ], * ... * ] * * @since 5.4.0 * @param array $atts Shortcode atts. * @return array Array with parsed data on success, False otherwise. */ function su_get_gallery_slides( $atts ) { $slides = array(); $posts = su_get_gallery_slides_posts( $atts ); if ( ! is_array( $posts ) ) { return array(); } foreach ( $posts as $post ) { $attachment_id = 'attachment' === $post->post_type ? $post->ID : get_post_thumbnail_id( $post->ID ); if ( ! su_is_positive_number( $attachment_id ) ) { continue; } $caption = 'attachment' === $post->post_type || 'yes' === $atts['prefer_caption'] ? wp_get_attachment_caption( $attachment_id ) : get_the_title( $post->ID ); $slide = array( 'post_id' => $post->ID, 'attachment_id' => intval( $attachment_id ), 'caption' => trim( $caption ), ); switch ( $atts['link'] ) { case 'image': case 'lightbox': $slide['link'] = wp_get_attachment_image_src( $attachment_id, 'full', false ); $slide['link'] = $slide['link'][0]; break; case 'custom': $slide['link'] = get_post_meta( $attachment_id, 'su_slide_link', true ); break; case 'post': $slide['link'] = get_permalink( $post->ID ); break; case 'attachment': $slide['link'] = get_attachment_link( $attachment_id ); break; default: $slide['link'] = ''; break; } $slides[] = $slide; } $slides = apply_filters( 'su/get_gallery_slides/slides', $slides, $atts ); return $slides; } /** * Auxilary function to query posts to be used in a gallery. * * @since 5.8.2 * @param array $atts Shortcode atts. * @return WP_Query WP_Query instance. */ function su_get_gallery_slides_posts( $atts ) { $source = su_parse_images_source( $atts['source'] ); if ( ! $source ) { return false; } if ( 'media' === $source['type'] ) { $query['post_mime_type'] = 'image/jpeg,image/gif,image/jpg,image/png,image/webp,image/avif'; $query['post_type'] = 'attachment'; $query['post_status'] = 'any'; if ( 'recent' === $source['ids'] ) { $query['posts_per_page'] = $atts['limit']; } if ( 'recent' !== $source['ids'] ) { $query['posts_per_page'] = -1; $query['post__in'] = $source['ids']; $query['orderby'] = 'post__in'; } } if ( 'posts' === $source['type'] ) { $query['post_type'] = 'any'; $query['meta_key'] = '_thumbnail_id'; if ( 'recent' === $source['ids'] ) { $query['posts_per_page'] = $atts['limit']; } if ( is_array( $source['ids'] ) ) { $query['ignore_sticky_posts'] = true; $query['posts_per_page'] = count( $source['ids'] ); $query['post__in'] = $source['ids']; $query['orderby'] = 'post__in'; } } if ( 'taxonomy' === $source['type'] ) { if ( ! $source['tax'] ) { return array(); } $query['tax_query'] = array( array( 'taxonomy' => $source['tax'], 'terms' => $source['ids'], 'field' => 'id', ), ); $query['post_type'] = 'any'; $query['posts_per_page'] = $atts['limit']; $query['meta_key'] = '_thumbnail_id'; if ( su_is_media_taxonomy( $source['tax'] ) ) { $query['post_mime_type'] = 'image/jpeg,image/gif,image/jpg,image/png,image/webp'; $query['post_type'] = 'attachment'; $query['post_status'] = 'any'; $query['meta_key'] = null; } } if ( 'yes' === $atts['random'] ) { $query['orderby'] = 'rand'; $query['ignore_sticky_posts'] = true; } $query = apply_filters( 'su/get_gallery_slides_query', $query, $source, $atts ); $query = new WP_Query( $query ); return isset( $query->posts ) ? $query->posts : array(); } /** * Helper function to parse image source strings. * * Input: * * media: 1, 2, 3 * media: recent * posts: 1, 2, 3 * posts: recent * taxonomy: book/3, 5 * * Output: * * [ * 'type' => 'taxonomy', * 'tax' => 'book', * 'ids' => [ 1, 2, 3 ] * ] * * @since 5.4.0 * @param string $source Images source string. * @return array|bool Array with parsed data on success, False otherwise. */ function su_parse_images_source( $source ) { $source = str_replace( ' ', '', $source ); $source = strtolower( $source ); /** * $match - result of preg_match * - 1: pattern match the subject * - 0: pattern does not match the subject * - False: error occurred * * $source[1] - image source (e.g. media, posts) * $source[2] - taxonomy name (e.g. book) * $source[3] - post/term IDs (e.g. 1,2,3, recent) */ $match = preg_match( '/^(media|posts|taxonomy):(?:([a-zA-Z0-9-_]*)\/)*((?:\d+,)*\d+|recent)/', $source, $source ); if ( 1 !== $match ) { return false; } if ( 'recent' !== $source[3] ) { $source[3] = explode( ',', $source[3] ); } return array( 'type' => $source[1], 'tax' => $source[2], 'ids' => $source[3], ); } /** * Helper function to get array with available intermediate image sizes. * * @since 5.4.0 * @return array Array with available image sizes. */ function su_get_image_sizes() { $sizes = array( 'full' => __( 'Original image size', 'shortcodes-ultimate' ), ); foreach ( get_intermediate_image_sizes() as $size ) { $sizes[ $size ] = ucfirst( $size ); } return $sizes; } /** * Helper function to determine if a given taxonomy is attached to the 'attachment' post type * * @since 5.8.2 * @param string $taxonomy Taxonomy to check * @return bool True if a given taxonomy is a media category, False otherwise */ function su_is_media_taxonomy( $taxonomy ) { $taxonomy = get_taxonomy( $taxonomy ); return isset( $taxonomy->object_type ) && in_array( 'attachment', $taxonomy->object_type, true ); } /** * Adds 'Slide Link' field at attachment page. * * @since 5.0.5 */ function su_slide_link_input( $form_fields, $post ) { $form_fields['su_slide_link'] = array( 'label' => __( 'Slide link', 'shortcodes-ultimate' ), 'input' => 'text', 'value' => get_post_meta( $post->ID, 'su_slide_link', true ), 'helps' => sprintf( '%s
%s', __( 'Shortcodes Ultimate', 'shortcodes-ultimate' ), __( 'Use this field to add custom links to slides used with Slider, Carousel and Custom Gallery shortcodes', 'shortcodes-ultimate' ) ), ); return $form_fields; } /** * Saves 'Slide Link' field. * * @since 5.0.5 */ function su_slide_link_save( $post, $attachment ) { if ( isset( $attachment['su_slide_link'] ) ) { update_post_meta( $post['ID'], 'su_slide_link', $attachment['su_slide_link'] ); } return $post; } /** * Get slides data. * * @since 5.0.5 * @param array $args Query args. * @return array Slides collection. */ function su_get_slides( $args ) { $args = wp_parse_args( $args, array( 'source' => 'none', 'limit' => 20, 'gallery' => null, 'type' => '', 'link' => 'none', ) ); if ( null !== $args['gallery'] || ( 'none' === $args['source'] && get_option( 'su_option_galleries-432' ) ) ) { return su_get_slides_432( $args ); } $slides = array(); foreach ( array( 'media', 'posts', 'category', 'taxonomy' ) as $type ) { if ( strpos( trim( $args['source'] ), $type . ':' ) === 0 ) { $args['source'] = array( 'type' => $type, 'val' => (string) trim( str_replace( array( $type . ':', ' ' ), '', $args['source'] ), ',' ), ); break; } } if ( ! is_array( $args['source'] ) ) { return $slides; } $query = array( 'posts_per_page' => $args['limit'] ); if ( 'media' === $args['source']['type'] ) { $query['post_type'] = 'attachment'; $query['post_status'] = 'any'; $query['post__in'] = (array) explode( ',', $args['source']['val'] ); $query['orderby'] = 'post__in'; } // Source: posts if ( 'posts' === $args['source']['type'] ) { if ( 'recent' !== $args['source']['val'] ) { $query['post__in'] = (array) explode( ',', $args['source']['val'] ); $query['orderby'] = 'post__in'; $query['post_type'] = 'any'; } } elseif ( 'category' === $args['source']['type'] ) { $query['category__in'] = (array) explode( ',', $args['source']['val'] ); } elseif ( 'taxonomy' === $args['source']['type'] ) { $args['source']['val'] = explode( '/', $args['source']['val'] ); if ( ! is_array( $args['source']['val'] ) || count( $args['source']['val'] ) !== 2 ) { return $slides; } $query['tax_query'] = array( array( 'taxonomy' => $args['source']['val'][0], 'field' => 'id', 'terms' => (array) explode( ',', $args['source']['val'][1] ), ), ); $query['post_type'] = 'any'; if ( su_is_media_taxonomy( $args['source']['val'][0] ) ) { $query['post_type'] = 'attachment'; $query['post_status'] = 'any'; $query['meta_key'] = null; } } $query = apply_filters( 'su/slides_query', $query, $args ); $query = new WP_Query( $query ); if ( is_array( $query->posts ) ) { foreach ( $query->posts as $post ) { $thumb = 'media' === $args['source']['type'] || 'attachment' === $post->post_type ? $post->ID : get_post_thumbnail_id( $post->ID ); if ( ! su_is_positive_number( $thumb ) ) { continue; } $slide = array( 'image' => wp_get_attachment_url( $thumb ), 'link' => '', 'title' => get_the_title( $post->ID ), ); if ( 'image' === $args['link'] || 'lightbox' === $args['link'] ) { $slide['link'] = $slide['image']; } elseif ( 'custom' === $args['link'] ) { $slide['link'] = get_post_meta( $thumb, 'su_slide_link', true ); } elseif ( 'post' === $args['link'] ) { $slide['link'] = get_permalink( $post->ID ); } elseif ( 'attachment' === $args['link'] ) { $slide['link'] = get_attachment_link( $thumb ); } $slides[] = $slide; } } return $slides; } /** * Get slides data. * * Deprecated since 4.3.2. * * @since 5.0.5 * @param array $args Query args. * @return array Slides collection. */ function su_get_slides_432( $args ) { $args = wp_parse_args( $args, array( 'gallery' => 1, ) ); $slides = array(); $args['gallery'] = null === $args['gallery'] ? 0 : $args['gallery'] - 1; $galleries = get_option( 'su_option_galleries-432' ); if ( ! is_array( $galleries ) ) { return $slides; } if ( isset( $galleries[ $args['gallery'] ] ) ) { $slides = $galleries[ $args['gallery'] ]['items']; } return $slides; }