AlkantarClanX12
Current Path : /home/thanudqk/siamfreetour.com/wp-content/plugins/generateblocks/includes/ |
Current File : /home/thanudqk/siamfreetour.com/wp-content/plugins/generateblocks/includes/class-query-loop.php |
<?php /** * This file handles the Query Loop functions. * * @package GenerateBlocks */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Query Loop functions. * * @since 1.5.0 */ class GenerateBlocks_Query_Loop { /** * Instance. * * @access private * @var object Instance * @since 1.2.0 */ private static $instance; /** * Initiator. * * @since 1.2.0 * @return object initialized object of class. */ public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } /** * Constructor. */ public function __construct() { add_filter( 'generateblocks_attr_grid-wrapper', array( $this, 'add_grid_wrapper_attributes' ), 10, 2 ); add_filter( 'generateblocks_attr_container', array( $this, 'add_container_attributes' ), 10, 2 ); add_filter( 'generateblocks_attr_grid-item', array( $this, 'add_grid_item_attributes' ), 10, 2 ); add_filter( 'generateblocks_attr_button-container', array( $this, 'add_button_wrapper_attributes' ), 10, 2 ); add_filter( 'generateblocks_defaults', array( $this, 'add_block_defaults' ) ); add_filter( 'generateblocks_query_loop_args', array( $this, 'set_query_loop_defaults' ) ); } /** * Helper function that constructs a WP_Query args array from * a `Query` block properties. * * @param WP_Block $block Block instance. * @param int $page Current query's page. * * @todo: https://github.com/WordPress/wordpress-develop/blob/44e308c12e68b5c6b63845fd84369ba36985e193/src/wp-includes/blocks.php#L1126 */ public static function get_query_args( $block, $page ) { $query_attributes = ( is_array( $block->context ) && isset( $block->context['generateblocks/query'] ) ) ? $block->context['generateblocks/query'] : array(); // Set up our pagination. $query_attributes['paged'] = $page; $query_args = self::map_post_type_attributes( $query_attributes ); if ( isset( $query_args['tax_query'] ) ) { $query_args['tax_query'] = self::normalize_tax_query_attributes( $query_args['tax_query'] ); } if ( isset( $query_args['date_query_after'] ) || isset( $query_args['date_query_before'] ) ) { $query_args['date_query'] = self::normalize_date_query_attributes( isset( $query_args['date_query_after'] ) ? $query_args['date_query_after'] : null, isset( $query_args['date_query_before'] ) ? $query_args['date_query_before'] : null ); unset( $query_args['date_query_after'] ); unset( $query_args['date_query_before'] ); } if ( isset( $query_args['stickyPosts'] ) && 'ignore' === $query_args['stickyPosts'] ) { $query_args['ignore_sticky_posts'] = true; unset( $query_args['stickyPosts'] ); } if ( isset( $query_args['stickyPosts'] ) && 'exclude' === $query_args['stickyPosts'] ) { $sticky_posts = get_option( 'sticky_posts' ); $post_not_in = isset( $query_args['post__not_in'] ) && is_array( $query_args['post__not_in'] ) ? $query_args['post__not_in'] : array(); $query_args['post__not_in'] = array_merge( $sticky_posts, $post_not_in ); unset( $query_args['stickyPosts'] ); } if ( isset( $query_args['stickyPosts'] ) && 'only' === $query_args['stickyPosts'] ) { $sticky_posts = get_option( 'sticky_posts' ); $query_args['ignore_sticky_posts'] = true; $query_args['post__in'] = $sticky_posts; unset( $query_args['stickyPosts'] ); } if ( isset( $query_args['tax_query_exclude'] ) ) { $not_in_tax_query = self::normalize_tax_query_attributes( $query_args['tax_query_exclude'], 'NOT IN' ); $query_args['tax_query'] = isset( $query_args['tax_query'] ) ? array_merge( $query_args['tax_query'], $not_in_tax_query ) : $not_in_tax_query; unset( $query_args['tax_query_exclude'] ); } if ( isset( $query_args['posts_per_page'] ) && is_numeric( $query_args['posts_per_page'] ) ) { $per_page = intval( $query_args['posts_per_page'] ); $offset = 0; if ( isset( $query_args['offset'] ) && is_numeric( $query_args['offset'] ) ) { $offset = absint( $query_args['offset'] ); } $query_args['offset'] = ( $per_page * ( $page - 1 ) ) + $offset; $query_args['posts_per_page'] = $per_page; } if ( isset( $query_args['post_status'] ) && 'publish' !== $query_args['post_status'] && ! current_user_can( 'read_private_posts' ) ) { // If the user can't read private posts, we'll force the post status to be public. $query_args['post_status'] = 'publish'; } return $query_args; } /** * Map query parameters to their correct query names. * * @param array $attributes Block attributes. */ public static function map_post_type_attributes( $attributes ) { $attributes_map = array( 'page' => 'paged', 'per_page' => 'posts_per_page', 'search' => 's', 'after' => 'date_query_after', 'before' => 'date_query_before', 'author' => 'author__in', 'exclude' => 'post__not_in', 'include' => 'post__in', 'order' => 'order', 'orderby' => 'orderby', 'status' => 'post_status', 'parent' => 'post_parent__in', 'parent_exclude' => 'post_parent__not_in', 'author_exclude' => 'author__not_in', ); return generateblocks_map_array_keys( $attributes, $attributes_map ); } /** * Normalize the tax query attributes to be used in the WP_Query * * @param array $raw_tax_query Tax query. * @param string $operator Tax operator. * * @return array|array[] */ public static function normalize_tax_query_attributes( $raw_tax_query, $operator = 'IN' ) { return array_map( function( $tax ) use ( $operator ) { return array( 'taxonomy' => $tax['taxonomy'], 'field' => 'term_id', 'terms' => $tax['terms'], 'operator' => $operator, 'include_children' => isset( $tax['includeChildren'] ) ? $tax['includeChildren'] : true, ); }, $raw_tax_query ); } /** * Normalize the date query attributes to be used in the WP_Query * * @param string|null $after The after date. * @param string|null $before The before date. * * @return array */ public static function normalize_date_query_attributes( $after = null, $before = null ) { $result = array( 'inclusive' => true ); if ( generateblocks_is_valid_date( $after ) ) { $result['after'] = $after; } if ( generateblocks_is_valid_date( $before ) ) { $result['before'] = $before; } return $result; } /** * Add defaults for our Query settings. * * @param array $defaults Block defaults. */ public function add_block_defaults( $defaults ) { $defaults['container']['isQueryLoopItem'] = false; $defaults['container']['isPagination'] = false; $defaults['gridContainer']['isQueryLoop'] = false; $defaults['buttonContainer']['isPagination'] = false; return $defaults; } /** * Add HTML attributes to the Query Loop wrapper. * * @param array $attributes Existing HTML attributes. * @param array $settings Block settings. */ public function add_grid_wrapper_attributes( $attributes, $settings ) { if ( $settings['isQueryLoop'] ) { $attributes['class'] .= ' gb-query-loop-wrapper'; } return $attributes; } /** * Add HTML attributes to the Query Loop Containers. * * @param array $attributes Existing HTML attributes. * @param array $settings Block settings. */ public function add_container_attributes( $attributes, $settings ) { if ( $settings['isPagination'] ) { $attributes['class'] .= ' gb-query-loop-pagination'; } return $attributes; } /** * Add HTML attributes to the Query Loop Item wrapper. * * @param array $attributes Existing HTML attributes. * @param array $settings Block settings. */ public function add_grid_item_attributes( $attributes, $settings ) { if ( $settings['isQueryLoopItem'] ) { $attributes['class'] .= ' ' . implode( ' ', get_post_class( 'gb-query-loop-item' ) ); } return $attributes; } /** * Add HTML attributes to the Button wrapper. * * @param array $attributes Existing HTML attributes. * @param array $settings Block settings. */ public function add_button_wrapper_attributes( $attributes, $settings ) { if ( $settings['isPagination'] ) { $attributes['class'] .= ' gb-query-loop-pagination'; } return $attributes; } /** * Set the default query loop arguments. * * @param array $query_args The query loop arguments. * @return array The query loop arguments with defaults. */ public function set_query_loop_defaults( $query_args ) { if ( ! isset( $query_args['posts_per_page'] ) || '' === $query_args['posts_per_page'] ) { $query_args['posts_per_page'] = 10; } return $query_args; } } GenerateBlocks_Query_Loop::get_instance();