HEX
Server: Apache
System: Linux webd006.cluster128.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User: zwafgyp (177615)
PHP: 7.4.33
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/zwafgyp/lacalita/wp-content/plugins/rey-core/inc/modules/cards/sources/posts.php
<?php
namespace ReyCore\Modules\Cards\Sources;

if (!defined('ABSPATH')) exit; // Exit if accessed directly

class Posts extends Base {

	public function get_id(){
		return 'posts';
	}

	public function get_title(){
		return esc_html__( 'Posts', 'rey-core' );
	}

	public function controls($element){

		$element->start_controls_section(
			'section_post_query',
			[
				'label' => __( 'Posts query', 'rey-core' ),
				'condition' => [
					'source' => 'posts',
				],
			]
		);

		$element->add_control(
			'posts_per_page',
			[
				'label' => __( 'Limit', 'rey-core' ),
				'description' => __( 'Select the number of items to load from query.', 'rey-core' ),
				'type' => \Elementor\Controls_Manager::NUMBER,
				'default' => 8,
				'min' => 1,
				'max' => 100,
			]
		);

		$element->add_control(
			'post_type',
			[
				'label' => esc_html__( 'Post Type', 'rey-core' ),
				'default' => 'post',
				'type' => 'rey-ajax-list',
				'query_args' => [
					'request' => 'post_types_list_except_product',
				],
			]
		);

		$element->add_control(
			'query_type',
			[
				'label' => esc_html__('Query Type', 'rey-core'),
				'type' => \Elementor\Controls_Manager::SELECT,
				'default' => 'recent',
				'options' => [
					'recent'           => esc_html__('Recent', 'rey-core'),
					'manual-selection' => esc_html__('Manual Selection', 'rey-core'),
					'current-query' => esc_html__('Current Query', 'rey-core'),
				],
				'condition' => [
					'post_type!' => 'page'
				],
			]
		);

		$element->add_control(
			'all_taxonomies',
			[
				'label' => esc_html__('Taxonomy Term', 'rey-core'),
				'placeholder' => esc_html__('- Select term -', 'rey-core'),
				'type' => 'rey-query',
				'query_args' => [
					'type' => 'terms',
					'taxonomy' => 'all_taxonomies',
				],
				'label_block' => true,
				'multiple' => true,
				'default'     => [],
				'condition' => [
					'query_type' => 'recent',
					'post_type!' => ['', 'page']
				],
			]
		);

		// Advanced settings
		$element->add_control(
			'include',
			[
				'label'       => esc_html__( 'Manual include', 'rey-core' ),
				'description' => __( 'Add posts IDs separated by comma.', 'rey-core' ),
				'label_block' => true,
				'type' => 'rey-query',
				'multiple' => true,
				'query_args' => [
					'type' => 'posts',
					'post_type' => '{post_type}',
				],
				'condition' => [
					'query_type' => 'manual-selection',
				],
			]
		);

		$element->add_control(
			'exclude',
			[
				'label'       => esc_html__( 'Exclude', 'rey-core' ),
				'type'        => \Elementor\Controls_Manager::TEXT,
				'label_block' => true,
				'type' => 'rey-query',
				'multiple' => true,
				'query_args' => [
					'type' => 'posts',
					'post_type' => '{post_type}',
				],
				'condition' => [
					'query_type!' => 'manual-selection',
				],
			]
		);

		/* wip
		$element->add_control(
			'posts_meta_query',
			[
				'label' => esc_html__( 'Use Meta Query', 'rey-core' ),
				'type' => \Elementor\Controls_Manager::SWITCHER,
				'default' => '',
			]
		); */

		$element->add_control(
			'orderby',
			[
				'label' => __( 'Order By', 'rey-core' ),
				'type' => \Elementor\Controls_Manager::SELECT,
				'default' => 'post_date',
				'options' => [
					'post_date' => __( 'Date', 'rey-core' ),
					'post_title' => __( 'Title', 'rey-core' ),
					'menu_order' => __( 'Menu Order', 'rey-core' ),
					'rand' => __( 'Random', 'rey-core' ),
				],
				// 'condition' => [
				// 	'query_type!' => 'manual-selection',
				// ],
			]
		);

		$element->add_control(
			'order',
				[
				'label' => __( 'Order', 'rey-core' ),
				'type' => \Elementor\Controls_Manager::SELECT,
				'default' => 'desc',
				'options' => [
					'asc' => __( 'ASC', 'rey-core' ),
					'desc' => __( 'DESC', 'rey-core' ),
				],
				// 'condition' => [
				// 	'query_type!' => 'manual-selection',
				// ],
			]
		);

		$element->add_control(
			'exclude_duplicates',
			[
				'label' => __( 'Exclude Duplicates', 'rey-core' ),
				'description' => __( 'Exclude duplicates that were already loaded in this page', 'rey-core' ),
				'type' => \Elementor\Controls_Manager::SWITCHER,
				'default' => 'yes',
			]
		);

		$element->add_control(
			'exclude_without_image',
			[
				'label' => __( 'Exclude posts without image', 'rey-core' ),
				'type' => \Elementor\Controls_Manager::SWITCHER,
				'default' => '',
			]
		);

		$element->add_control(
			'posts_map_label',
			[
				'label' => esc_html__( 'Use "Label" as', 'rey-core' ),
				'type' => \Elementor\Controls_Manager::SELECT,
				'default' => '',
				'options' => [
					''  => esc_html__( '- None -', 'rey-core' ),
					'date'  => esc_html__( 'Date', 'rey-core' ),
					'category'  => esc_html__( 'Category', 'rey-core' ),
				],
			]
		);

		$element->add_control(
			'query_id',
			[
				'label' => esc_html__( 'Custom Query ID', 'rey-core' ),
				'description' => esc_html__( 'Give your Query a custom unique id to allow server side modifications.', 'rey-core' ),
				'type' => \Elementor\Controls_Manager::TEXT,
				'default' => '',
				'placeholder' => esc_html__( 'eg: my_custom_action', 'rey-core' ),
				'separator' => 'before',
			]
		);

		$element->end_controls_section();

		/* wip

		$element->start_controls_section(
			'section_meta_query',
			[
				'label' => __( 'Meta Query', 'rey-core' ),
				'condition' => [
					'posts_meta_query! ' => '',
				],
			]
		);

			$meta_co = new \Elementor\Repeater();

			$element->add_control(
				'meta_key',
				[
					'label' => esc_html__( 'Meta Key', 'rey-core' ),
					'type' => \Elementor\Controls_Manager::TEXT,
					'default' => '',
				]
			);

			$element->add_control(
				'meta_value',
				[
					'label' => esc_html__( 'Meta Value', 'rey-core' ),
					'type' => \Elementor\Controls_Manager::TEXT,
					'default' => '',
				]
			);

			$element->add_control(
				'meta_compare',
				[
					'label' => esc_html__( 'Compare operator', 'rey-core' ),
					'type' => \Elementor\Controls_Manager::SELECT,
					'default' => '=',
					'options' => [
						'true'  => 'True',
						'false'  => 'False',
						'null'  => 'Is Null',
						'not_null'  => 'Not Null',
						'==' => esc_html__('Is equal to', 'rey-core'),
						'!=' => esc_html__('Is not equal to', 'rey-core'),
						'>' => esc_html__('Is greater than', 'rey-core'),
						'<' => esc_html__('Is less than', 'rey-core'),
						'!=empty' => esc_html__('Is not empty', 'rey-core'),
						'==empty' => esc_html__('Is empty', 'rey-core'),
					],
				]
			);

			$element->add_control(
				'meta_conditions',
				[
					'label' => __( 'Meta Conditions', 'rey-core' ),
					'type' => \Elementor\Controls_Manager::REPEATER,
					'fields' => $meta_co->get_controls(),
					'default' => [],
					'title_field' => '{{{ meta_key }}}',
				]
			);

		$element->end_controls_section();

		*/
	}

	public function query($element){

		$query_args = [
			'posts_per_page' => $element->_settings['posts_per_page'] ? $element->_settings['posts_per_page'] : get_option('posts_per_page'),
			'post_type' => $element->_settings['post_type'],
			'post_status' => 'publish',
			'ignore_sticky_posts' => true,
			'update_post_term_cache' => false, //useful when taxonomy terms will not be utilized
			'orderby' => isset($element->_settings['orderby']) ? $element->_settings['orderby'] : 'date',
			'order' => isset($element->_settings['order']) ? $element->_settings['order'] : 'DESC',
			'fields' => 'ids',
		];

		if( isset($element->_settings['load_more_enable']) && '' !== $element->_settings['load_more_enable'] ){
			if( $offset = $element->get_offset() ){
				$query_args['offset'] = $offset;
			}
		}

		if( $element->_settings['query_type'] == 'current-query' ){
			$current_query_args = array_filter($GLOBALS['wp_query']->query_vars);
			$query_args = array_merge($current_query_args, $query_args);
		}
		else if( $element->_settings['query_type'] == 'manual-selection' && !empty($element->_settings['include']) ) {
			$query_args['post__in'] = array_map( 'absint', $element->_settings['include'] );
			// $query_args['orderby'] = 'post__in';
		}
		else {

			if(
				// 'post' !== $element->_settings['post_type'] &&
				isset($element->_settings['all_taxonomies']) &&
				$all_taxonomies = $element->_settings['all_taxonomies']
			){

				unset($query_args['update_post_term_cache']);

				foreach ( $all_taxonomies as $term_id ) {

					$term = get_term( $term_id );

					if( isset($term->taxonomy) ){
						$query_args['tax_query'][] = [
							'taxonomy' => $term->taxonomy,
							'field' => 'term_id',
							'terms' => absint($term_id),
						];
					}
				}

			}

			if( ! empty($element->_settings['exclude']) ) {
				$query_args['post__not_in'] = array_map( 'absint', $element->_settings['exclude'] );
			}

		}

		// Exclude duplicates
		if( $element->_settings['exclude_duplicates'] !== '' ){
			if(
				isset($GLOBALS["rey_exclude_posts"])
				&& ($to_exclude = $GLOBALS["rey_exclude_posts"]) ) {
				$query_args['post__not_in'] = isset($query_args['post__not_in']) ? array_merge( $query_args['post__not_in'], $to_exclude ) : $to_exclude;
			}
		}

		// get_the_ID() sometimes returns odd results
		$current_id = get_queried_object_id();

		if( isset($query_args['post__not_in']) ){
			$query_args['post__not_in'][] = $current_id;
		}
		else {
			$query_args['post__not_in'] = [$current_id];
		}

		if( $element->_settings['exclude_without_image'] !== '' ){
			$query_args['meta_query'] = [
				[
					'key' => '_thumbnail_id'
				]
			];
		}

		// Deprecated
		$query_args = apply_filters_deprecated( 'reycore/elementor/carousel/query_args', [$query_args, $element], '2.4.4', 'reycore/elementor/card/query_args' );

		$query_args = apply_filters( 'reycore/elementor/card/query_args', $query_args, $element );

		if ( isset($element->_settings['query_id']) && !empty($element->_settings['query_id']) ) {
			add_action( 'pre_get_posts', [ $element, 'pre_get_posts_query_filter' ] );
		}

		$query = \ReyCore\Helper::get_query( $query_args );

		remove_action( 'pre_get_posts', [ $element, 'pre_get_posts_query_filter' ] );

		do_action( 'reycore/elementor/query/query_results', $query, $element );

		$post_ids = $query->get_posts();

		// create the global exclusion array
		$GLOBALS["rey_exclude_posts"] = isset($GLOBALS["rey_exclude_posts"]) ? array_merge($GLOBALS["rey_exclude_posts"], $post_ids) : $post_ids;

		if( isset($element->_settings['load_more_enable']) && '' !== $element->_settings['load_more_enable'] ){
			$element::$more_total = count($post_ids);
		}

		return $post_ids;

	}

	public function parse_item($element){

		if( ! (isset($element->_items[$element->item_key]) && ($item = $element->_items[$element->item_key])) ){
			return [];
		}

		$args = [
			'image'        => [],
			'_id'          => 'posts-' . $item,
			'post_id'      => $item,
			// 'item_classes' => get_post_class('', $item),
			'item_classes' => [
				'post-' . $item,
				'type-' . esc_attr($element->_settings['post_type'])
			],
		];

		if( in_array($element->_settings[$this->base::CARD_KEY], array_keys($this->base->get_cards_list()), true) ):

			if( 'no' !== $element->_settings['image_show'] ){
				$args['image'] = [
					'id' => get_post_thumbnail_id($item),
				];
			}

			$args['button_url'] = [
				'url' => get_permalink($item)
			];
			$args['button_text'] = $element->_settings['button_text'];
			$args['captions'] = 'yes';

			$args['title'] = get_the_title($item);
			$args['subtitle'] = get_the_excerpt( $item );

			if( $map_label = $element->_settings['posts_map_label'] ){
				if( 'date' === $map_label ){
					$args['label'] = get_the_date( '', $item );
				}
				else if( 'category' === $map_label ){
					$post_cats = array_column(get_the_category( $item ), 'name');
					$args['label'] = implode(', ', $post_cats);
				}
			}

		endif;

		return $args;
	}

	public function load_more_button_per_page($element){
		return $element->_settings['posts_per_page'] ? $element->_settings['posts_per_page'] : get_option('posts_per_page');
	}
}