HEX
Server: LiteSpeed
System: Linux cluster02.load-balancer.x2.network 4.18.0-553.51.1.lve.1.el8.x86_64 #1 SMP Wed May 14 14:34:57 UTC 2025 x86_64
User: kbdhpghp (1098)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /home/kbdhpghp/vivenciarteatelie.com.br/wp-content/plugins/wp-show-posts/wp-show-posts.php
<?php
/*
Plugin Name: WP Show Posts
Plugin URI: https://wpshowposts.com
Description: WP Show Posts allows you to list posts (from any post type) anywhere on your site. This includes WooCommerce products or any other post type you might have! Check out the pro version for even more features at https://wpshowposts.com.
Version: 1.1.6
Author: Tom Usborne
Author URI: https://tomusborne.com
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: wp-show-posts
*/

// No direct access, please
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

// Define the current version
define( 'WPSP_VERSION', '1.1.6' );

// Add resizer script
if ( ! class_exists( 'WPSP_Resize' ) ) {
	require_once plugin_dir_path( __FILE__ ) . 'inc/image-resizer.php';
}

require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'inc/defaults.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'inc/functions.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'inc/compat.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'inc/styling.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'inc/deprecated.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'admin/post-type.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'admin/metabox.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'admin/ajax.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'admin/admin.php';
require_once trailingslashit( plugin_dir_path( __FILE__ ) ) . 'admin/widget.php';

add_action( 'plugins_loaded', 'wpsp_load_textdomain' );
/**
 * Load plugin textdomain.
 *
 * @since 0.5
 */
function wpsp_load_textdomain() {
	load_plugin_textdomain( 'wp-show-posts' );
}

add_action( 'wp_enqueue_scripts', 'wpsp_enqueue_scripts' );
/*
 * Enqueue our CSS to the front end
 *
 * @since 0.1
 */
function wpsp_enqueue_scripts() {
	$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '-min';
	wp_enqueue_style( 'wp-show-posts', plugins_url( "css/wp-show-posts{$suffix}.css", __FILE__ ), array(), WPSP_VERSION );
}

/*
 * Create a helpful wrapper to get our settings and defaults
 *
 * @since 0.1
 *
 * @param int $id The post ID.
 * @param string $key The post meta key.
 * @return mixed The value of our key.
 */
function wpsp_get_setting( $id, $key ) {
	// Get our defaults
	$defaults = wpsp_get_defaults();

	// Bail if our default isn't set
	if ( ! isset( $defaults[ $key ] ) ) {
		return false;
	}

	// If we have a default, let's return a value
	return get_post_meta( $id, $key ) ? get_post_meta( $id, $key, true ) : $defaults[ $key ];
}

/**
 * Remove special characters from a string.
 *
 * @param string $string The string to remove special characters from.
 */
function wpsp_clean_string( $string ) {
	$string = str_replace( ' ', '-', $string );
	$string = preg_replace( '/[^A-Za-z0-9\-]/', '', $string );
	$string = str_replace( 'script', 'div', $string );

	return $string;
}

/*
 * Build the front end of the plugin
 * $id parameter needs to match ID of custom post type entry
 *
 * @since 0.1
 *
 * @param int $id The ID of the post.
 * @param string|array $custom_settings Custom settings we can pass to our list.
 */
function wpsp_display( $id, $custom_settings = false ) {
	// Set the global ID of our object
	global $wpsp_id;
	$wpsp_id = $id;

	// Build our setting variables
	$settings = apply_filters( 'wpsp_settings', array(
		'list_id'				 => absint( $id ),
		'author' 				 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_author' ) ),
		'columns'     			 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_columns' ) ),
		'columns_gutter'      	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_columns_gutter' ) ),
		'content_type'        	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_content_type' ) ),
		'exclude_current'     	 => wp_validate_boolean( wpsp_get_setting( $id, 'wpsp_exclude_current' ) ),
		'excerpt_length'      	 => absint( wpsp_get_setting( $id, 'wpsp_excerpt_length' ) ),
		'post_id'      		 	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_post_id' ) ),
		'exclude_post_id'      	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_exclude_post_id' ) ),
		'ignore_sticky_posts' 	 => wp_validate_boolean( wpsp_get_setting( $id, 'wpsp_ignore_sticky_posts' ) ),
		'include_title' 		 => wp_validate_boolean( get_post_meta( $id, 'wpsp_include_title', true ) ),
		'title_element'			 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_title_element' ) ),
		'image'					 => sanitize_text_field( get_post_meta( $id, 'wpsp_image', true ), FILTER_VALIDATE_BOOLEAN ),
		'image_location'		 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_image_location' ) ),
		'image_alignment'		 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_image_alignment' ) ),
		'image_height'			 => absint( wpsp_get_setting( $id, 'wpsp_image_height' ) ),
		'image_width'			 => absint( wpsp_get_setting( $id, 'wpsp_image_width' ) ),
		'include_author' 	 	 => wp_validate_boolean( wpsp_get_setting( $id, 'wpsp_include_author' ) ),
		'author_location'     	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_author_location' ) ),
		'include_terms' 	     => wp_validate_boolean( wpsp_get_setting( $id, 'wpsp_include_terms' ) ),
		'terms_location'		 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_terms_location' ) ),
		'include_date' 	     	 => wp_validate_boolean( get_post_meta( $id, 'wpsp_include_date', true ) ),
		'date_location'       	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_date_location' ) ),
		'include_comments' 	     => wp_validate_boolean( get_post_meta( $id, 'wpsp_include_comments', true ) ),
		'comments_location'      => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_comments_location' ) ),
		'inner_wrapper'       	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_inner_wrapper' ) ),
		'inner_wrapper_class' 	 => array_map( 'sanitize_html_class', ( explode( ' ', wpsp_get_setting( $id, 'wpsp_inner_wrapper_class' ) ) ) ),
		'inner_wrapper_style' 	 => explode( ' ', esc_attr( wpsp_get_setting( $id, 'wpsp_inner_wrapper_style' ) ) ),
		'itemtype'				 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_itemtype' ) ),
		'meta_key'   	     	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_meta_key' ) ),
		'meta_value'   	     	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_meta_value' ) ),
		'offset'   			 	 => absint( wpsp_get_setting( $id, 'wpsp_offset' ) ),
		'order'   			 	 => sanitize_key( wpsp_get_setting( $id, 'wpsp_order' ) ),
		'orderby'  			 	 => sanitize_key( wpsp_get_setting( $id, 'wpsp_orderby' ) ),
		'pagination'			 => wp_validate_boolean( wpsp_get_setting( $id, 'wpsp_pagination' ) ),
		'post_type'			 	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_post_type' ) ),
		'post_status'		 	 => wpsp_get_setting( $id, 'wpsp_post_status' ), // Validated later
		'posts_per_page'		 => intval( wpsp_get_setting( $id, 'wpsp_posts_per_page' ) ),
		'tax_operator'		 	 => wpsp_get_setting( $id, 'wpsp_tax_operator' ), // Validated later
		'tax_term'		 	 	 => wpsp_get_setting( $id, 'wpsp_tax_term' ),
		'taxonomy'		 	 	 => sanitize_key( wpsp_get_setting( $id, 'wpsp_taxonomy' ) ),
		'read_more_text'		 => wp_kses_post( wpsp_get_setting( $id, 'wpsp_read_more_text' ) ),
		'wrapper'			 	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_wrapper' ) ),
		'wrapper_class' 	 	 => array_map( 'sanitize_html_class', ( explode( ' ', wpsp_get_setting( $id, 'wpsp_wrapper_class' ) ) ) ),
		'wrapper_style' 		 => explode( ' ', esc_attr( wpsp_get_setting( $id, 'wpsp_wrapper_style' ) ) ),
		'no_results' 		 	 => wpsp_get_setting( $id, 'wpsp_no_results' ),
		'post_meta_bottom_style' => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_post_meta_bottom_style' ) ),
		'post_meta_top_style' 	 => sanitize_text_field( wpsp_get_setting( $id, 'wpsp_post_meta_top_style' ) ),
		'read_more_class'	 	 => esc_attr( wpsp_get_setting( $id, 'wpsp_read_more_class' ) ),
	) );

	// Replace args with any custom args.
	if ( ! empty( $custom_settings ) ) {
		if ( is_array( $custom_settings ) ) {
			$settings = array_merge( $settings, $custom_settings );
		}

		if ( ! is_array( $custom_settings ) ) {
			$settings_string = parse_str( $custom_settings, $custom_settings );
			$settings = array_merge( $settings, $custom_settings );
		}
	}

	// Grab initiate args for query
	$args = array();

	if ( '' !== $settings[ 'order' ] ) {
		$args[ 'order' ] = esc_attr( $settings[ 'order' ] );
	}

	if ( '' !== $settings[ 'orderby' ] ) {
		$args[ 'orderby' ] = esc_attr( $settings[ 'orderby' ] );
	}

	if ( 'rand' == $settings[ 'orderby' ] && $settings[ 'pagination' ] ) {
		$args[ 'orderby' ] = 'rand(' . absint( $id ) . ')';
	}

	if ( '' !== $settings[ 'post_type' ] ) {
		$args[ 'post_type' ] = esc_attr( $settings[ 'post_type' ] );
	}

	if ( '' !== $settings[ 'posts_per_page' ] ) {
		$args[ 'posts_per_page' ] = intval( $settings[ 'posts_per_page' ] );
	}

	if ( $settings[ 'ignore_sticky_posts' ] ) {
		$args[ 'ignore_sticky_posts' ] = wp_validate_boolean( $settings[ 'ignore_sticky_posts' ] );
	}

	if ( '' !== $settings[ 'meta_key' ] ) {
		$args[ 'meta_key' ] = esc_html( $settings[ 'meta_key' ] );
	}

	if ( '' !== $settings[ 'meta_value' ] ) {
		$args[ 'meta_value' ] = esc_html( $settings[ 'meta_value' ] );
	}

	if ( $settings[ 'offset' ] > 0 ) {
		$args[ 'offset' ] = intval( $settings[ 'offset' ] );
	}

	if ( '' !== $settings[ 'author' ] ) {
		$args[ 'author' ] = esc_html( $settings[ 'author' ] );
	}

	if ( $settings[ 'pagination' ] && ! is_single() ) {
		$paged_query = is_front_page() ? 'page' : 'paged';
		$args[ 'paged' ] = get_query_var( $paged_query );
	}

	// Post Status
	$settings[ 'post_status' ] = explode( ', ', $settings[ 'post_status' ] );
	$validated = array();
	$available = array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash', 'any' );

	foreach ( $settings[ 'post_status' ] as $unvalidated ) {
		if ( in_array( $unvalidated, $available ) ) {
			$validated[] = $unvalidated;
		}
	}

	if ( ! empty( $validated ) ) {
		$args['post_status'] = $validated;
	}

	// Prevent private posts from showing up for non-authenticated users.
	if ( isset( $args['post_status'] ) && ! current_user_can( 'read_private_posts' ) ) {
		$args['post_status'] = array( 'publish' );
	}

	// If taxonomy attributes, create a taxonomy query
	if ( ! empty( $settings[ 'taxonomy' ] ) && ! empty( $settings[ 'tax_term' ] ) ) {

		if ( is_array( $settings[ 'tax_term' ] ) ) {
			$settings[ 'tax_term' ] = implode( ', ', $settings[ 'tax_term' ] );
		}

		if ( 'current' == $settings[ 'tax_term' ] ) {
			global $post;
			$terms = wp_get_post_terms(get_the_ID(), $settings[ 'taxonomy' ]);
			$settings[ 'tax_term' ] = array();
			foreach ($terms as $term) {
				$settings[ 'tax_term' ][] = $term->slug;
			}
		} else {
			// Term string to array
			$settings[ 'tax_term' ] = explode( ', ', $settings[ 'tax_term' ] );
		}

		// Validate operator
		if ( ! in_array( $settings[ 'tax_operator' ], array( 'IN', 'NOT IN', 'AND' ) ) ) {
			$settings[ 'tax_operator' ] = 'IN';
		}

		$tax_args = array(
			'tax_query' => array(
				array(
					'taxonomy' => $settings[ 'taxonomy' ],
					'field'    => 'slug',
					'terms'    => $settings[ 'tax_term' ],
					'operator' => $settings[ 'tax_operator' ]
				)
			)
		);

		$args = array_merge( $args, $tax_args );

	}

	// If Post IDs
	if ( $settings[ 'post_id' ] ) {
		$posts_in = array_map( 'intval', explode( ',', $settings[ 'post_id' ] ) );
		$args['post__in'] = $posts_in;
	}

	// If Exclude Post IDs
	if ( $settings[ 'exclude_post_id' ] ) {
		$posts_not_in = array_map( 'intval', explode( ',', $settings[ 'exclude_post_id' ] ) );
		$args['post__not_in'] = $posts_not_in;
	}

	// If Exclude Current
	if ( ( is_singular() && $settings[ 'exclude_current' ] ) || is_single() ) {
		$args['post__not_in'] = array( get_the_ID() );
	}

	// Border
	if ( defined( 'WPSP_PRO_VERSION' ) && version_compare( WPSP_PRO_VERSION, '0.6', '<' ) ) {
		$border = wpsp_sanitize_hex_color( wpsp_get_setting( $settings['list_id'], 'wpsp_border' ) );
		if ( '' !== $border ) {
			$settings['wrapper_class'][] = 'include-border';
			if ( ! function_exists( 'wpsp_styling' ) ) {
				$border = 'border-color: ' . $border . ';';
			}
		}
	}

	// Padding
	if ( defined( 'WPSP_PRO_VERSION' ) && version_compare( WPSP_PRO_VERSION, '0.6', '<' ) ) {
		$padding = sanitize_text_field( wpsp_get_setting( $settings['list_id'], 'wpsp_padding' ) );
		if ( '' !== $padding ) {
			$settings['wrapper_class'][] = 'include-padding';
			$padding = 'padding:' . $padding . ';';
		}
	}

	// Columns
	if ( 'col-12' !== $settings[ 'columns' ]  ) {
		wp_enqueue_script( 'wpsp-matchHeight', trailingslashit( plugin_dir_url( __FILE__ ) ) . 'js/jquery.matchHeight.js', array( 'jquery' ), WPSP_VERSION, true );
		$settings[ 'wrapper_class' ][] = 'wp-show-posts-columns';
	}

	// Featured post class
	$featured_post = wp_validate_boolean( wpsp_get_setting( $id, 'wpsp_featured_post' ) );

	$current_post = '';
	if ( 'col-12' !== $settings[ 'columns' ] && $featured_post ) {
		if ( $settings[ 'columns' ] == 'col-6' ) {
			$current_post = 'wpsp-col-12';
		}

		if ( $settings[ 'columns' ] == 'col-4' ) {
			$current_post = 'wpsp-col-8';
		}

		if ( $settings[ 'columns' ] == 'col-3' ) {
			$current_post = 'wpsp-col-6';
		}

		if ( $settings[ 'columns' ] == 'col-20' ) {
			$current_post = 'wpsp-col-6';
		}
	}

	// Masonry
	$masonry = wp_validate_boolean( wpsp_get_setting( $id, 'wpsp_masonry' ) );

	if ( $masonry ) {
		$settings[ 'wrapper_class' ][] = 'wp-show-posts-masonry';
		$settings[ 'inner_wrapper_class' ][] = ' wp-show-posts-masonry-' . esc_attr( $settings[ 'columns' ] );
		$settings[ 'inner_wrapper_class' ][] = ' wp-show-posts-masonry-block';

		wp_enqueue_script( 'wpsp-imagesloaded' );
		wp_enqueue_script( 'jquery-masonry' );
		wp_add_inline_script( 'jquery-masonry', 'jQuery(function($){var $container = $(".wp-show-posts-masonry");$container.imagesLoaded( function(){$container.fadeIn( 1000 ).masonry({itemSelector : ".wp-show-posts-masonry-block",columnWidth: ".grid-sizer"}).css("opacity","1");});});' );
	}

	// Add the default inner wrapper class
	// We don't create the class element up here like below, as we need to add classes inside the loop below as well
	$settings[ 'inner_wrapper_class' ][] = 'wp-show-posts-single';

	if ( 'col-12' == $settings[ 'columns' ] ) {
		$settings[ 'inner_wrapper_class' ][] = 'wpsp-clearfix';
	}

	// Add the default wrapper class
	$settings[ 'wrapper_class' ][] = 'wp-show-posts';

	// Get the wrapper class
	if ( ! empty( $settings[ 'wrapper_class' ] ) ) {
		$settings[ 'wrapper_class' ] = ' class="' . esc_attr( implode( ' ', $settings[ 'wrapper_class' ] ) ) . '"';
	}

	// Get the wrapper style
	if ( ! empty( $settings[ 'wrapper_style' ] ) ) {
		$settings[ 'wrapper_style' ] = ' style="' . esc_attr( implode( ' ', $settings[ 'wrapper_style' ] ) ) . '"';
	}

	// Get the inner wrapper class
	if ( ! empty( $settings[ 'inner_wrapper_style' ] ) ) {
		$settings[ 'inner_wrapper_style' ] = ' style="' . esc_attr( implode( ' ', $settings[ 'inner_wrapper_style' ] ) ) . '"';
	}

	$wrapper = wpsp_clean_string( $settings[ 'wrapper' ] );
	$inner_wrapper = wpsp_clean_string( $settings[ 'inner_wrapper' ] );

	// Get the wrapper ID
	$wrapper_id = ' id="wpsp-' . esc_attr( $id ) . '"';

	$wrapper_atts = apply_filters( 'wpsp_wrapper_atts', '', $settings );

	do_action( 'wpsp_before_wrapper', $settings );

	// Start the wrapper
	echo '<' . $wrapper . $wrapper_id . $settings[ 'wrapper_class' ] . $settings[ 'wrapper_style' ] . $wrapper_atts . '>';

	do_action( 'wpsp_inside_wrapper', $settings );

	if ( $masonry ) {
		echo '<div class="grid-sizer wpsp-' . esc_attr( $settings[ 'columns' ] ) . '"></div>';
	}

	// Filter kept for backward compatibility.
	$args = apply_filters( 'wp_show_posts_shortcode_args', $args, $settings );

	// Start the query.
	$query = new WP_Query( apply_filters( 'wpsp_query_args', $args, $settings ) );

	// Start the loop
	if ( $query->have_posts() ) {
		while ( $query->have_posts() ) {
			$query->the_post();

			// Get page
			$paged_query = is_front_page() ? 'page' : 'paged';
			$paged = ( get_query_var( $paged_query ) ) ? get_query_var( $paged_query ) : 1;

			$featured = '';
			$column_class = '';

			// Featured post
			if ( $settings[ 'columns' ] !== 'col-12' && $featured_post ) {
				if ( $query->current_post == 0 && $paged == 1 ) {
					$featured = ' featured-column ' . $current_post;
				} else {
					$featured = ' wpsp-' . $settings[ 'columns' ];
				}
			} elseif ( $settings[ 'columns' ] !== 'col-12' ) {
				$column_class .= ' wpsp-' . $settings[ 'columns' ];
			}

			$post_classes = implode( ' ', $settings[ 'inner_wrapper_class' ] );

			// Merge our classes with the post classes.
			if ( has_filter( 'post_class', 'generate_blog_post_classes' ) ) {
				remove_filter( 'post_class', 'generate_blog_post_classes' ); // Remove GPP classes.
			}

			$post_classes .= ' ' . implode( ' ', get_post_class() );

			if ( function_exists( 'generate_blog_post_classes' ) ) {
				add_filter( 'post_class', 'generate_blog_post_classes' ); // Re-add them.
			}

			// Start inner container
			printf( '<%1$s class="%2$s" itemtype="http://schema.org/%3$s" itemscope>',
				$inner_wrapper,
				esc_attr( $post_classes . $column_class . $featured ),
				esc_attr( $settings[ 'itemtype' ] )
			);

				echo '<div class="wp-show-posts-inner"' . $settings[ 'inner_wrapper_style' ] . '>';

					do_action( 'wpsp_before_header', $settings );

					// The title
					if ( $settings[ 'include_title' ] || ( $settings[ 'include_author' ] && 'below-title' == $settings[ 'author_location' ] ) || ( $settings[ 'include_date' ] && 'below-title' == $settings[ 'date_location' ] ) || ( $settings[ 'include_terms' ] && 'below-title' == $settings[ 'terms_location' ] ) ) : ?>
						<header class="wp-show-posts-entry-header">
							<?php

							do_action( 'wpsp_before_title', $settings );

							$title_element = wpsp_clean_string( $settings[ 'title_element' ] );

							$before_title = sprintf(
								'<%1$s class="wp-show-posts-entry-title" itemprop="headline"><a href="%2$s" rel="bookmark">',
								$title_element,
								esc_url( get_permalink() )
							);

							$after_title = '</a></' . $title_element . '>';

							if ( apply_filters( 'wpsp_disable_title_link', false, $settings ) ) {
								$before_title = '<' . $title_element . ' class="wp-show-posts-entry-title" itemprop="headline">';
								$after_title = '</' . $title_element . '>';
							}

							if ( $settings[ 'include_title' ] ) {
								the_title( $before_title, $after_title );
							}

							do_action( 'wpsp_after_title', $settings );
							?>
						</header><!-- .entry-header -->
					<?php endif;

					do_action( 'wpsp_before_content', $settings );

					// Check to see if we have the more tag
					global $post;
					$more_tag = apply_filters( 'wpsp_more_tag', strpos( $post->post_content, '<!--more-->' ) );

					// The excerpt or full content
					if ( 'excerpt' == $settings[ 'content_type' ] && $settings[ 'excerpt_length' ] && ! $more_tag && 'none' !== $settings[ 'content_type' ] ) : ?>
						<div class="wp-show-posts-entry-summary" itemprop="text">
							<?php wpsp_excerpt( absint( $settings[ 'excerpt_length' ] ) ); ?>
						</div><!-- .entry-summary -->
					<?php elseif ( ( 'full' == $settings[ 'content_type' ] || $more_tag ) && 'none' !== $settings[ 'content_type' ] ) : ?>
						<div class="wp-show-posts-entry-content" itemprop="text">
							<?php the_content( false, false ); ?>
						</div><!-- .entry-content -->
					<?php endif;

					do_action( 'wpsp_after_content', $settings );

				echo '</div><!-- wp-show-posts-inner -->';

				if ( 'col-12' == $settings[ 'columns' ] ) {
					echo '<div class="wpsp-clear"></div>';
				}

			// End inner container
			echo '</' . $inner_wrapper . '>';
		}
	} else {
		// no posts found
		echo $settings[ 'columns' ] !== 'col-12' ? '<div class="wpsp-no-results" style="margin-left: ' . esc_attr( $settings[ 'columns_gutter' ] ) . ';">' : '';
			echo wpautop( wp_kses_post( $settings[ 'no_results' ] ) );
		echo $settings[ 'columns' ] !== 'col-12' ? '</div>' : '';
	}

	if ( $settings[ 'columns' ] !== 'col-12' ) {
		echo '<div class="wpsp-clear"></div>';
	}

	echo '</' . $wrapper . '><!-- .wp-show-posts -->';

	do_action( 'wpsp_after_wrapper', $settings );

	// Pagination
	if ( $settings[ 'pagination' ] && $query->have_posts() && ! is_single() ) {
		$ajax_pagination = wp_validate_boolean( wpsp_get_setting( $settings['list_id'], 'wpsp_ajax_pagination' ) );

		if ( $ajax_pagination && function_exists( 'wpsp_ajax_pagination' ) ) {

			$max_page = $query->max_num_pages;
			$nextpage = intval( $paged ) + 1;

			if ( $nextpage <= $max_page ) {
				$next_page_url = next_posts( $max_page, false );
			}

			wpsp_ajax_pagination( $next_page_url, $paged, $max_page );
			wp_enqueue_script( 'wpsp-imagesloaded' );
			wp_enqueue_script( 'wpsp-ajax-pagination' );
		} else {
			wpsp_pagination( $query->max_num_pages );
		}
	}

	if ( defined( 'WPSP_PRO_VERSION' ) && version_compare( WPSP_PRO_VERSION, '0.6', '<' ) ) {
		// Lightbox and gallery
		$image_lightbox = sanitize_text_field( wpsp_get_setting( $settings['list_id'], 'wpsp_image_lightbox' ) );
		if ( $image_lightbox ) {
			wp_enqueue_script( 'wpsp-featherlight' );
			wp_enqueue_style( 'wpsp-featherlight' );

			$image_gallery = sanitize_text_field( wpsp_get_setting( $settings['list_id'], 'wpsp_image_gallery' ) );
			if ( $image_gallery ) {
				wp_enqueue_script( 'wpsp-featherlight-gallery' );
				wp_enqueue_style( 'wpsp-featherlight-gallery' );
			}
		}
	}

	// Restore original Post Data
	wp_reset_postdata();
}

add_shortcode( 'wp_show_posts', 'wpsp_shortcode_function' );
/*
 * Build the shortcode
 *
 * @since 0.1
 *
 * @param array $atts The shortcode attributes.
 */
function wpsp_shortcode_function( $atts ) {
	$atts = shortcode_atts(
		array(
			'id' => '',
			'name' => '',
			'settings' => ''
		), $atts, 'wp_show_posts'
	);

	ob_start();

	// Get the ID from the list name if it's provided.
	if ( ! empty( $atts['name'] ) ) {
		$list = get_page_by_title( $atts['name'], 'OBJECT', 'wp_show_posts' );
		$atts['id'] = $list->ID;
	}

	if ( $atts['id'] ) {
		wpsp_display( $atts['id'], $atts['settings'] );
	}

	return ob_get_clean();
}