Plugin Directory

Changeset 3476983


Ignore:
Timestamp:
03/07/2026 09:54:04 AM (4 weeks ago)
Author:
grzelkowski
Message:

version 1.8.10

Location:
quick-ajax-post-loader/trunk
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • quick-ajax-post-loader/trunk/includes/admin/cpt/creator/class-creator-form.php

    r3448095 r3476983  
    1515        $field = QAPL_Form_Field_Factory::build_select_taxonomy_field();
    1616        $this->create_field($field);
     17        //display show all button
     18        $field = QAPL_Form_Field_Factory::build_display_show_all_button_field();
     19        $this->create_field($field);
    1720        //manual term selection checkbox
    1821        $field = QAPL_Form_Field_Factory::build_manual_term_selection_field();
     
    111114        $shortcode_page .= $this->add_field(QAPL_Constants::QUERY_SETTING_SELECT_TAXONOMY, $field_options);
    112115
     116        //display show all button
     117        $field_options = $this->field_options([
     118            'is_trigger' => true,
     119            'visible_if' => [
     120                QAPL_Constants::QUERY_SETTING_SHOW_TAXONOMY_FILTER => '1'
     121            ]
     122        ]);
     123        $shortcode_page .= $this->add_field(QAPL_Constants::LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON, $field_options);
     124
    113125        // manual term selection checkbox
    114126        $field_options = $this->field_options([
  • quick-ajax-post-loader/trunk/includes/admin/pages/settings/tabs/class-settings-tab-php-snippet.php

    r3448095 r3476983  
    2020        //select taxonomy
    2121        $field = QAPL_Form_Field_Factory::build_select_taxonomy_field();
     22        $this->settings_page->register_field($field);
     23        //display show all button
     24        $field = QAPL_Form_Field_Factory::build_display_show_all_button_field();
    2225        $this->settings_page->register_field($field);
    2326        //manual term selection checkbox
     
    104107            $form_tab_function_generator .= '<h4>'.__('General Settings', 'quick-ajax-post-loader').'</h4>';
    105108            $form_tab_function_generator .= $this->settings_page->render_field(QAPL_Constants::QUERY_SETTING_SELECT_POST_TYPE);
     109
    106110            //show taxonomy checkbox
    107111            $field_options = $this->settings_page->field_options_wrapper([
     
    109113            ]);
    110114            $form_tab_function_generator .= $this->settings_page->render_field(QAPL_Constants::QUERY_SETTING_SHOW_TAXONOMY_FILTER, $field_options);
     115           
    111116            //taxonomy select option
    112117            $this->settings_page->update_field_options(QAPL_Constants::QUERY_SETTING_SELECT_TAXONOMY,$this->settings_page->get_taxonomy_options());
     
    118123            ]);
    119124            $form_tab_function_generator .= $this->settings_page->render_field(QAPL_Constants::QUERY_SETTING_SELECT_TAXONOMY, $field_options);
     125
     126            //display show all button
     127            $field_options = $this->settings_page->field_options_wrapper([
     128                'is_trigger' => true,
     129                'visible_if' => [
     130                    QAPL_Constants::QUERY_SETTING_SHOW_TAXONOMY_FILTER => '1'
     131                ]
     132            ]);
     133            $form_tab_function_generator .= $this->settings_page->render_field(QAPL_Constants::LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON, $field_options);
     134
    120135            // manual term selection checkbox
    121136            $field_options = $this->settings_page->field_options_wrapper([
  • quick-ajax-post-loader/trunk/includes/ajax-controller/class-ajax-frontend-controller.php

    r3458287 r3476983  
    2424            $layout_builder     = new QAPL_Ajax_Layout_Builder($file_manager, $helper);
    2525            $ui_renderer        = new QAPL_Ajax_Filter_Menu_Renderer($file_manager, $helper, $global_options);
    26             $load_more_renderer = new QAPL_Ajax_Load_More_Renderer($file_manager,$ui_renderer, $helper);
     26            $load_more_renderer = new QAPL_Ajax_Load_More_Renderer($file_manager, $ui_renderer, $helper);
    2727            $end_posts_renderer = new QAPL_Ajax_End_Message_Renderer($file_manager);
    2828           
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-filter-menu-renderer.php

    r3458287 r3476983  
    6767            $terms_args['include'] = $source_args['selected_terms'];
    6868        }           
    69         $terms = get_terms($terms_args);           
     69        $terms = get_terms($terms_args);     
     70        $terms_count = is_array($terms) ? count($terms) : 0;
     71        if (is_wp_error($terms) || !$this->should_render_filter_menu($terms_count)) {
     72            return '';
     73        }
    7074
    7175        $block_id = 'quick-ajax-filter-'.$quick_ajax_id;
     
    7882        }           
    7983        $container_class = $this->helper->extract_classes_from_string($class_container);
    80         if (!$this->should_render_filter_menu(count($terms))) {
    81             return '';
    82         }
    8384        ob_start(); // Start output buffering
    8485
     
    8687        echo '<div id="'.esc_attr($block_id).'" class="'.esc_attr($container_class).'">';
    8788        do_action(QAPL_Constants::HOOK_FILTER_CONTAINER_START, $quick_ajax_id);
    88         if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
    89             $attributes[QAPL_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $quick_ajax_id;
    90            
    91             $navigation_buttons = [];               
    92             $button_base = [
    93                 'data-button' => QAPL_Constants::TERM_FILTER_BUTTON_DATA_BUTTON,
    94                 'template' => $this->file_manager->get_taxonomy_filter_button_template(),
    95                 'data-attributes' => $attributes,
    96             ];
     89       
     90        $attributes[QAPL_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $quick_ajax_id;           
     91        $navigation_buttons = [];               
     92        $button_base = [
     93            'data-button' => QAPL_Constants::TERM_FILTER_BUTTON_DATA_BUTTON,
     94            'template' => $this->file_manager->get_taxonomy_filter_button_template(),
     95            'data-attributes' => $attributes,
     96        ];
     97        $display_show_all_button = isset($attributes[QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON]) ? $attributes[QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON] : QAPL_Constants::LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON_DEFAULT;
     98        $has_active_button = false;
     99        if($display_show_all_button == 1){
    97100            $show_all_label = $this->global_options['show_all_label'] ?? __('Show All', 'quick-ajax-post-loader');   
    98101            $show_all_button = [                   
     
    104107                'data-action' => $source_args,
    105108                'data-attributes' => $button_base['data-attributes'],
     109                'is_active' => true,
    106110            ];
    107             $show_all_button['is_active'] = true;
    108111            $navigation_buttons[] = $show_all_button;
    109             $exclude_ids = (isset($query_args['post__not_in'])) ? $query_args['post__not_in'] : '';
    110             foreach ( $terms as $term ) {
    111                 $not_empty = $this->get_post_assigned_to_the_term($term, $query_args['post_type'], $exclude_ids);
    112                 if($not_empty == true){
    113                     $data_action = $source_args;
    114                     $data_action['selected_terms'] = [$term->term_id];
    115                     $term_button_data = [                       
    116                         'term_id' => $term->term_id,
    117                         'taxonomy' => $term->taxonomy,
    118                         'template' => $button_base['template'],
    119                         'button_label' => $term->name,
    120                         'data-button' => $button_base['data-button'],
    121                         'data-action' => $data_action,
    122                         'data-attributes' => $button_base['data-attributes'],
    123                     ];
    124                     $navigation_buttons[] = $term_button_data;
     112            $has_active_button = true;
     113        }
     114        $exclude_ids = (isset($query_args['post__not_in'])) ? $query_args['post__not_in'] : '';
     115        foreach ( $terms as $term ) {
     116            $not_empty = $this->get_post_assigned_to_the_term($term, $query_args['post_type'], $exclude_ids);
     117            if($not_empty == true){
     118                $data_action = $source_args;
     119                $data_action['selected_terms'] = [$term->term_id];
     120                $term_button_data = [                       
     121                    'term_id' => $term->term_id,
     122                    'taxonomy' => $term->taxonomy,
     123                    'template' => $button_base['template'],
     124                    'button_label' => $term->name,
     125                    'data-button' => $button_base['data-button'],
     126                    'data-action' => $data_action,
     127                    'data-attributes' => $button_base['data-attributes'],
     128                    'is_active' => false,
     129                ];
     130                //if "show all" disabled and no active yet make first term active
     131                if (!$has_active_button) {
     132                    $term_button_data['is_active'] = true;
     133                    $has_active_button = true;
    125134                }
     135                $navigation_buttons[] = $term_button_data;
    126136            }
    127            
    128             $navigation_buttons = apply_filters(QAPL_Constants::HOOK_MODIFY_TAXONOMY_FILTER_BUTTONS, $navigation_buttons, $quick_ajax_id);
    129             $filter_buttons='';
    130             foreach ( $navigation_buttons as $button ) {
    131                 $filter_buttons .= $this->update_button_template($button);
    132             }
    133             echo wp_kses_post($filter_buttons);
    134         }
     137        }
     138       
     139        $navigation_buttons = apply_filters(QAPL_Constants::HOOK_MODIFY_TAXONOMY_FILTER_BUTTONS, $navigation_buttons, $quick_ajax_id);
     140        $filter_buttons='';
     141        foreach ( $navigation_buttons as $button ) {
     142            $filter_buttons .= $this->update_button_template($button);
     143        }
     144        echo wp_kses_post($filter_buttons);
     145       
    135146        do_action(QAPL_Constants::HOOK_FILTER_CONTAINER_END, $quick_ajax_id);
    136147        echo '</div>';
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-frontend-render.php

    r3458287 r3476983  
    1313    private $layout_builder;
    1414
    15 
    1615    public function __construct() {
    1716        $this->global_options       = get_option(QAPL_Constants::GLOBAL_OPTIONS_NAME, []);
     
    2322        $this->load_more_renderer   = new QAPL_Ajax_Load_More_Renderer($this->file_manager, $this->ui_renderer, $this->helper);
    2423        $this->layout_renderer      = new QAPL_Ajax_Layout_Renderer($this->file_manager, $this->load_more_renderer, $this->helper);
    25     }
    26     private function build_render_context($source_args, $attributes) {
    27         // build query args
    28         $query_args = $this->query_builder->wp_query_args($source_args, $attributes);
    29         if (!$query_args) {
    30             return false;
    31         }
    32         // build layout
    33         $layout_data = $this->layout_builder->layout_customization($attributes, $this->global_options);
    34         $context = [
    35             'query_args'    => $query_args,
    36             'layout'        => $layout_data['layout'],
    37             'attrs'         => $layout_data['attributes'],
    38             'ajax_initial'  => $layout_data['ajax_initial_load'] ?? null,
    39             'quick_ajax_id' => $this->query_builder->get_quick_ajax_id(),
    40         ];
    41         return $context;
    4224    }
    4325
     
    5234        $ajax_initial_load  = $context['ajax_initial'];
    5335        $quick_ajax_id      = $context['quick_ajax_id'];
    54 
    5536
    5637        ob_start();
     
    10687        return $this->ui_renderer->render_sort_options($sort_options, $layout, $query_args, $attrs, $source_args, $quick_ajax_id);
    10788    }
     89    private function build_render_context($source_args, $attributes) {
     90        // build query args
     91        $query_args = $this->query_builder->wp_query_args($source_args, $attributes);
     92        if (!$query_args) {
     93            return false;
     94        }
     95        // build layout
     96        $layout_data = $this->layout_builder->layout_customization($attributes, $this->global_options);
     97        $context = [
     98            'query_args'    => $query_args,
     99            'layout'        => $layout_data['layout'],
     100            'attrs'         => $layout_data['attributes'],
     101            'ajax_initial'  => $layout_data['ajax_initial_load'] ?? null,
     102            'quick_ajax_id' => $this->query_builder->get_quick_ajax_id(),
     103        ];
     104        return $context;
     105    }
    108106}
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-layout-builder.php

    r3409927 r3476983  
    5757        }
    5858        $ajax_initial_load = isset($attributes[QAPL_Constants::AJAX_SETTING_AJAX_INITIAL_LOAD]) ? intval($attributes[QAPL_Constants::AJAX_SETTING_AJAX_INITIAL_LOAD]) : QAPL_Constants::QUERY_SETTING_AJAX_ON_INITIAL_LOAD_DEFAULT;
    59        
     59        // display show all button
     60        if(isset($attributes[QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON])){
     61            $attrs[QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON] = intval($attributes[QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON]);
     62        } 
    6063        return [
    6164            'layout' => $layout,
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-layout-renderer.php

    r3438871 r3476983  
    1 <?php 
     1<?php
    22if (!defined('ABSPATH')) {
    33    exit;
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-query-builder.php

    r3438871 r3476983  
    4646            return !empty($value) || $value === 0 || $value === '0';
    4747        });
     48        $display_show_all_button = isset($attributes[QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON]) ? $attributes[QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON] : QAPL_Constants::LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON_DEFAULT;
     49
     50        $query_args = $this->adjust_tax_query_for_initial_state($query_args, $display_show_all_button);
    4851        $query_args = apply_filters(QAPL_Constants::HOOK_MODIFY_POSTS_QUERY_ARGS, $query_args, $this->quick_ajax_id);
    4952
     
    5356            return $query_args;
    5457        }
     58    }
     59    private function adjust_tax_query_for_initial_state($query_args, $display_show_all_button): array {
     60        // if show all enabled - do nothing
     61        if ($display_show_all_button !== 0) {
     62            return $query_args;
     63        }
     64        // if no tax query
     65        if (empty($query_args['tax_query']) || !is_array($query_args['tax_query'])) {
     66            return $query_args;
     67        }
     68        // if no terms defined get first taxonomy term
     69        if (empty($query_args['tax_query'][0]['terms']) || !is_array($query_args['tax_query'][0]['terms'])) {
     70            // if no taxonomy
     71            if (empty($query_args['tax_query'][0]['taxonomy'])) {
     72                return $query_args;
     73            }
     74            $taxonomy = $query_args['tax_query'][0]['taxonomy'];
     75            $terms = get_terms([
     76                'taxonomy' => $taxonomy,
     77                'hide_empty' => true,
     78                'number' => 1,
     79                'fields' => 'ids',
     80            ]);
     81            if (!is_wp_error($terms) && !empty($terms)) {
     82                $query_args['tax_query'][0]['terms'] = [$terms[0]];
     83                $query_args['tax_query'][0]['field'] = 'term_id';
     84                // remove exists operator
     85                if (isset($query_args['tax_query'][0]['operator'])) {
     86                    unset($query_args['tax_query'][0]['operator']);
     87                }
     88            }
     89            return $query_args;
     90        }
     91        //if show all button not visible show only first term posts on initial load
     92        $first_term = $query_args['tax_query'][0]['terms'][0];
     93        $query_args['tax_query'][0]['terms'] = [$first_term];
     94        return $query_args;
    5595    }
    5696    private function sanitize_to_int_array($value) {
  • quick-ajax-post-loader/trunk/includes/enqueue/class-enqueue-handler.php

    r3438871 r3476983  
    106106                'quick_ajax_taxonomy' => QAPL_Constants::QUERY_SETTING_SELECT_TAXONOMY,
    107107                'quick_ajax_manual_selected_terms' => QAPL_Constants::QUERY_SETTING_SELECTED_TERMS,
     108                'display_show_all_button' => QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON,
    108109                'quick_ajax_css_style' => QAPL_Constants::ATTRIBUTE_QUICK_AJAX_CSS_STYLE,
    109110                'grid_num_columns' => QAPL_Constants::ATTRIBUTE_GRID_NUM_COLUMNS,
  • quick-ajax-post-loader/trunk/includes/form/class-form-field-factory.php

    r3438871 r3476983  
    5757        return $builder->build();
    5858    }
     59    //show "show all" filter button
     60    public static function build_display_show_all_button_field(): QAPL_Form_Field_Interface {
     61        $builder = new QAPL_Form_Field_Builder();
     62        $global_sort_labels = get_option(QAPL_Constants::GLOBAL_OPTIONS_NAME, []);
     63        $global_label = ($global_sort_labels['show_all_label']) ? $global_sort_labels['show_all_label'] : __('Show All', 'quick-ajax-post-loader');
     64        $builder->set_name(QAPL_Constants::LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON);
     65        $builder->set_label(__('Display "Show All" Button', 'quick-ajax-post-loader'));
     66        $builder->set_type('checkbox');
     67        $builder->set_default(QAPL_Constants::LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON_DEFAULT);
     68        $description = sprintf(__('Display the "%s" button in the taxonomy filter to reset the filter and show all posts.', 'quick-ajax-post-loader'), $global_label);
     69        $builder->set_description($description);
     70        return $builder->build();
     71    }
    5972    //manual selected terms multiselect
    6073    public static function build_manual_selected_terms_field(): QAPL_Form_Field_Interface {
  • quick-ajax-post-loader/trunk/includes/resources/class-constants.php

    r3458287 r3476983  
    66class QAPL_Constants{
    77    // Plugin info
    8     public const PLUGIN_VERSION = '1.8.9';
     8    public const PLUGIN_VERSION = '1.8.10';
    99    public const PLUGIN_NAME = 'Quick Ajax Post Loader';
    1010    public const PLUGIN_TEXT_DOMAIN = 'quick-ajax-post-loader';
     
    115115    public const LAYOUT_SETTING_SELECT_LOADER_ICON_DEFAULT = 'loader-icon';
    116116
     117    public const LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON = 'qapl_display_show_all_button';
     118    public const LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON_DEFAULT = 1;
     119
    117120    // Ajax settings
    118121    public const AJAX_SETTING_AJAX_INITIAL_LOAD = 'ajax_initial_load';
     
    129132    public const ATTRIBUTE_AJAX_INFINITE_SCROLL = 'infinite_scroll';
    130133    public const ATTRIBUTE_SHOW_END_MESSAGE = 'show_end_message';
     134    public const ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON = 'display_show_all_button';
    131135
    132136    // Quick AJAX settings
  • quick-ajax-post-loader/trunk/includes/shortcode/class-shortcode.php

    r3438871 r3476983  
    33    exit;
    44}
    5 
    6 
    75
    86class QAPL_Shortcode {
  • quick-ajax-post-loader/trunk/includes/shortcode/handlers/class-shortcode-ajax-attributes-provider.php

    r3409927 r3476983  
    7878            'postmeta_key' => QAPL_Constants::QUERY_SETTING_SHOW_END_MESSAGE,
    7979            'type' => 'bool',
    80         ]); 
    81         return !empty($attributes) ? $attributes : false;
     80        ]);
     81        $attributes[QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON] = $this->get_sanitized_attribute([
     82            'shortcode_key' => QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON,
     83            'postmeta_key' => QAPL_Constants::LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON,
     84            'type' => 'bool',
     85            'default' => QAPL_Constants::LAYOUT_SETTING_DISPLAY_SHOW_ALL_BUTTON_DEFAULT,
     86        ]);
     87        return $attributes;
    8288    }
    83 
    8489    private function get_sanitized_attribute(array $config) {
    8590        /**
     
    97102        $meta_key = $config['postmeta_key'] ?? null;
    98103        $type = $config['type'] ?? 'string';
     104        $default = $config['default'] ?? null;
    99105        $only_if_meta_key_true = $config['only_if_meta_key_true'] ?? null;
    100106        $value = null;
    101107       
    102108        // try to get value from shortcode args
    103         if (!empty($this->shortcode_params[$shortcode_key])) {
     109        if ($shortcode_key !== null && array_key_exists($shortcode_key, $this->shortcode_params)) {
    104110            $value = $this->shortcode_params[$shortcode_key];
    105111        // if not found try to get value from shortcode settings
    106         } elseif (!empty($meta_key) && isset($this->shortcode_postmeta[$meta_key])) {
     112        } elseif ($meta_key !== null && array_key_exists($meta_key, $this->shortcode_postmeta)) {
    107113            // check if additional meta key condition is required
    108             if (!empty($only_if_meta_key_true)) {
     114            if ($only_if_meta_key_true !== null) {
    109115                if (!empty($this->shortcode_postmeta[$only_if_meta_key_true])) {
    110116                    $value = $this->shortcode_postmeta[$meta_key];
     
    118124        // return default empty value if value is still null
    119125        if ($value === null) {
    120             return ($type === 'number' || $type === 'bool') ? 0 : '';
     126            if ($default !== null) {
     127                $value = $default;
     128            } else {
     129                return ($type === 'number' || $type === 'bool') ? 0 : '';
     130            }
    121131        }
    122132        // sanitize value based on type
  • quick-ajax-post-loader/trunk/includes/shortcode/handlers/class-shortcode-params-handler.php

    r3383449 r3476983  
    33    exit;
    44}
     5
    56class QAPL_Shortcode_Params_Handler {
    67    public static function get_params($params) {
     
    1314            'orderby' => '',
    1415            'sort_options' => '',
     16            'display_show_all_button' => '',
    1517            'quick_ajax_css_style' => '',
    1618            'grid_num_columns' => '',
     
    3032        //retain only the keys that match the defaults
    3133        $params = array_intersect_key($params, $defaults);
    32         //merge provided parameters with defaults
    33         $params = shortcode_atts($defaults, $params, 'quick-ajax');       
    34 
    35         //sanitize and cast numeric and boolean parameters
    36         $params['id'] = intval($params['id']);
    37         $params['ignore_sticky_posts'] = filter_var($params['ignore_sticky_posts'], FILTER_VALIDATE_BOOLEAN);
    38         $params['ajax_initial_load'] = filter_var($params['ajax_initial_load'], FILTER_VALIDATE_BOOLEAN);
    39         $params['infinite_scroll'] = filter_var($params['infinite_scroll'], FILTER_VALIDATE_BOOLEAN);
    40         $params['show_end_message'] = filter_var($params['show_end_message'], FILTER_VALIDATE_BOOLEAN);
    41         $params['excluded_post_ids'] = array_filter(array_map('intval', explode(',', $params['excluded_post_ids'])));
    42         $params['posts_per_page'] = intval($params['posts_per_page']);
    43         $params['quick_ajax_css_style'] = intval($params['quick_ajax_css_style']);
    44         $params['grid_num_columns'] = intval($params['grid_num_columns']);
    45         $params['load_more_posts'] = intval($params['load_more_posts']);
    46         $params['quick_ajax_id'] = intval($params['quick_ajax_id']);
    47 
    48         //sanitize text parameters
    49         $params['post_type'] = sanitize_text_field($params['post_type']);
    50         $params['order'] = sanitize_text_field($params['order']);
    51         $params['orderby'] = sanitize_text_field($params['orderby']);
    52         //$params['sort_options'] = sanitize_text_field($params['sort_options']);
    53         $params['post_item_template'] = sanitize_text_field($params['post_item_template']);
    54         $params['taxonomy_filter_class'] = sanitize_html_class($params['taxonomy_filter_class']);
    55         $params['container_class'] = sanitize_html_class($params['container_class']);
    56         $params['loader_icon'] = sanitize_text_field($params['loader_icon']);
    57         $params['quick_ajax_taxonomy'] = sanitize_text_field($params['quick_ajax_taxonomy']);
    58         //$params['manual_selected_terms'] = (!empty($params['quick_ajax_taxonomy'])) ? array_filter(array_map('intval', explode(',', $params['manual_selected_terms']))) : '';
    59 
     34        //sanitize and cast numeric and boolean parameters only if they exist
     35        if (isset($params['id'])) {
     36            $params['id'] = intval($params['id']);
     37        }
     38        if (isset($params['ignore_sticky_posts'])) {
     39            $params['ignore_sticky_posts'] = filter_var($params['ignore_sticky_posts'], FILTER_VALIDATE_BOOLEAN);
     40        }
     41        if (isset($params['ajax_initial_load'])) {
     42            $params['ajax_initial_load'] = filter_var($params['ajax_initial_load'], FILTER_VALIDATE_BOOLEAN);
     43        }
     44        if (isset($params['infinite_scroll'])) {
     45            $params['infinite_scroll'] = filter_var($params['infinite_scroll'], FILTER_VALIDATE_BOOLEAN);
     46        }
     47        if (isset($params['show_end_message'])) {
     48            $params['show_end_message'] = filter_var($params['show_end_message'], FILTER_VALIDATE_BOOLEAN);
     49        }
     50        if (isset($params['excluded_post_ids'])) {
     51            $params['excluded_post_ids'] = array_filter(
     52                array_map('intval', explode(',', $params['excluded_post_ids']))
     53            );
     54        }
     55        if (isset($params['posts_per_page'])) {
     56            $params['posts_per_page'] = intval($params['posts_per_page']);
     57        }
     58        if (isset($params['display_show_all_button'])) {
     59            $params['display_show_all_button'] = filter_var($params['display_show_all_button'], FILTER_VALIDATE_BOOLEAN);
     60        }
     61        if (isset($params['quick_ajax_css_style'])) {
     62            $params['quick_ajax_css_style'] = intval($params['quick_ajax_css_style']);
     63        }
     64        if (isset($params['grid_num_columns'])) {
     65            $params['grid_num_columns'] = intval($params['grid_num_columns']);
     66        }
     67        if (isset($params['load_more_posts'])) {
     68            $params['load_more_posts'] = intval($params['load_more_posts']);
     69        }
     70        if (isset($params['quick_ajax_id'])) {
     71            $params['quick_ajax_id'] = intval($params['quick_ajax_id']);
     72        }
     73        //sanitize text parameters only if they exist
     74        if (isset($params['post_type'])) {
     75            $params['post_type'] = sanitize_text_field($params['post_type']);
     76        }
     77        if (isset($params['order'])) {
     78            $params['order'] = sanitize_text_field($params['order']);
     79        }
     80        if (isset($params['orderby'])) {
     81            $params['orderby'] = sanitize_text_field($params['orderby']);
     82        }
     83        //if (isset($params['sort_options'])) {
     84        //    $params['sort_options'] = sanitize_text_field($params['sort_options']);
     85        //}
     86        if (isset($params['post_item_template'])) {
     87            $params['post_item_template'] = sanitize_text_field($params['post_item_template']);
     88        }
     89        if (isset($params['taxonomy_filter_class'])) {
     90            $params['taxonomy_filter_class'] = sanitize_html_class($params['taxonomy_filter_class']);
     91        }
     92        if (isset($params['container_class'])) {
     93            $params['container_class'] = sanitize_html_class($params['container_class']);
     94        }
     95        if (isset($params['loader_icon'])) {
     96            $params['loader_icon'] = sanitize_text_field($params['loader_icon']);
     97        }
     98        if (isset($params['quick_ajax_taxonomy'])) {
     99            $params['quick_ajax_taxonomy'] = sanitize_text_field($params['quick_ajax_taxonomy']);
     100        }
     101        //if (isset($params['manual_selected_terms'])) {
     102        //    $terms = array_map(
     103        //        'intval',
     104        //        explode(',', $params['manual_selected_terms'])
     105        //    );
     106        //    $params['manual_selected_terms'] = array_values(
     107        //        array_filter($terms)
     108        //    );
     109        //}
    60110        //return sanitized data
    61111        return $params;
  • quick-ajax-post-loader/trunk/js/admin-script.js

    r3458287 r3476983  
    359359            let formattedItem = "";
    360360            quickAjaxAttributes[qapl_quick_ajax_admin_data.constants.quick_ajax_id] = quick_ajax_id;
     361            if (inputData.qapl_show_select_taxonomy === 1) {
     362                quickAjaxAttributes[qapl_quick_ajax_admin_data.constants.display_show_all_button] = inputData.qapl_display_show_all_button;
     363            }
    361364            if (inputData.qapl_layout_quick_ajax_css_style === 1) {
    362365                quickAjaxAttributes[qapl_quick_ajax_admin_data.constants.quick_ajax_css_style] = inputData.qapl_layout_quick_ajax_css_style;
  • quick-ajax-post-loader/trunk/js/admin-script.min.js

    r3458287 r3476983  
    1 !function(t){var a={data_available:"undefined"!=typeof qapl_quick_ajax_admin_data&&qapl_quick_ajax_admin_data,init:function(){this.click_and_select_shortcode(),this.click_and_select(),this.handle_post_type_change(),this.handle_taxonomy_change(),this.show_hide_element_on_change(),this.quick_ajax_tabs(),this.copy_code(),this.copy_input(),this.quick_ajax_function_generator(),this.accordion_block_toggle()},handle_post_type_change:function(){if(!this.data_available)return;const a=this,n=t("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_post_type);n.length&&n.on("change",(function(){const n=t(this).val();t.ajax({url:qapl_quick_ajax_admin_data.ajax_url,type:"POST",data:{action:"qapl_action_get_taxonomies_by_post_type",post_type:n,nonce:qapl_quick_ajax_admin_data.nonce},success:function(n){if(n&&n.data){const e=t("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_taxonomy);e.empty(),e.append(n.data),a.trigger_taxonomy_change()}},error:function(t,a,n){}})}))},handle_taxonomy_change:function(){if(!this.data_available)return;const a=this,n=t("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_taxonomy),e=t("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_manual_selected_terms);n.length&&n.on("change",(function(){e.empty(),a.admin_page_loader(e);let n=t(this).val(),_="";t("#post_ID").length&&(_=t("#post_ID").val()),t.ajax({url:qapl_quick_ajax_admin_data.ajax_url,type:"POST",data:{action:"qapl_action_get_terms_by_taxonomy",taxonomy:n,post_id:_,nonce:qapl_quick_ajax_admin_data.nonce},success:function(t){t&&t.data&&e.fadeOut(100,(function(){e.empty(),e.append(t.data),e.fadeIn(100)}))},error:function(t,a,n){}})}))},trigger_taxonomy_change:function(){if(!this.data_available)return;const a=this,n=t("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_taxonomy),e=t("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_manual_selected_terms);e.length&&(a.admin_page_loader(e),n.trigger("change"))},admin_page_loader:function(t){t.append('<div class="qapl-admin-page-loader"><span></span><span></span><span></span></div>')},show_hide_element_on_change:function(){t(".show-hide-trigger input, .show-hide-trigger select").on("change",(function(){t(".quick-ajax-field-container[data-conditional]").each((function(){const a=t(this),n=a.data("conditional");let e=!0;for(const a in n){if(!n.hasOwnProperty(a))continue;const _=n[a],o=t("#"+a);if((o.is(":checkbox")?o.is(":checked")?"1":"0":o.val())!==_){e=!1;break}}e?a.removeClass("inactive"):a.addClass("inactive")}))}))},quick_ajax_tabs:function(){if(t(".quick-ajax-tabs").length){const a=t(".quick-ajax-tab-button"),n=t(".quick-ajax-tab-content");a.on("click",(function(e){e.preventDefault();const _=t(this).data("tab"),o=Number(_.split("-").pop()),i=new URL(window.location.href);i.searchParams.set("tab",o),history.replaceState(null,"",i.toString()),a.removeClass("active").attr("aria-selected","false").attr("tabindex","-1"),n.removeClass("active").attr("hidden",!0),t(this).addClass("active").attr("aria-selected","true").attr("tabindex","0"),t("#"+_).addClass("active").attr("hidden",!1)})),a.on("keydown",(function(t){const n=a.index(this);let e;if("ArrowRight"===t.key)e=(n+1)%a.length;else{if("ArrowLeft"!==t.key)return;e=(n-1+a.length)%a.length}a.eq(e).focus().click()}));const e=new URLSearchParams(window.location.search),_=parseInt(e.get("tab"),10);if(!isNaN(_)){const a=t('.quick-ajax-tab-button[data-tab="'+("quick-ajax-tab-"+_)+'"]');a.length&&a.trigger("click")}}},copy_code:function(){const a=this;t(".copy-button-text").on("click",(function(){var n=t(this),e=t("#"+n.data("copy"));e.length&&a.copy_to_clipboard(e.text(),n,n.data("label-copied"),n.text())}))},copy_input:function(){const a=this;t(".copy-button-input").on("click",(function(){var n=t(this),e=document.getElementById(n.data("copy"));e&&a.copy_to_clipboard(e.value,n,n.data("label-copied"),n.text())}))},copy_to_clipboard:function(t,a,n,e,_){var o=_||1e3,i=function(){a.text(n),setTimeout((function(){a.text(e)}),o)};if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(t).then(i).catch((function(){}));else{var c=document.createElement("textarea");c.value=t,c.style.position="fixed",c.style.left="-9999px",document.body.appendChild(c),c.select();try{document.execCommand("copy"),i()}catch(t){}document.body.removeChild(c)}},generateId:function(t){let a=0;for(let n=0;n<t.length;n++)a+=t.charCodeAt(n),n%2==0?a+=t.charCodeAt(n):a-=t.charCodeAt(n);return a},getExcludedPostIds:function(t){var a=t.split(/[,\s]+/),n=[];return a.forEach((function(t){/^\d+$/.test(t)&&-1===n.indexOf(t)&&n.push(t)})),n.join(", ")},cleanClassNames:function(t){let a=t.replace(/,/g," ").split(/\s+/);return a=a.filter(((t,a,n)=>!/^\d/.test(t)&&""!==t&&n.indexOf(t)===a)),a.join(", ")},qapl_collect_input_data:function(){const a={};return t(".function-generator-wrap input, .function-generator-wrap select").each((function(n,e){const _=t(e),o=_.attr("name"),i=_.attr("id");if("checkbox"===e.type)if(o&&o.endsWith("[]")){let t=o.replace(/\[\]$/,"");a[t]||(a[t]=[]),_.prop("checked")&&a[t].push(_.val())}else a[i]=_.prop("checked")?1:0;else a[i]=_.val()})),a},qapl_generate_args:function(t){const a=this;let n="",e="",_="";(n+="$quick_ajax_args = [\n",n+="    'post_type' => '"+t.qapl_select_post_type+"',\n",n+="    'posts_per_page' => "+t.qapl_select_posts_per_page+",\n","none"!==t.qapl_select_orderby&&(n+="    'orderby' => '"+t.qapl_select_orderby+"',\n"),n+="    'order' => '"+t.qapl_select_order+"',\n",""!==t.qapl_select_post_not_in)&&(n+="    'post__not_in' => ["+a.getExcludedPostIds(t.qapl_select_post_not_in)+"],\n");if(1===t.qapl_ignore_sticky_posts&&(n+="    'ignore_sticky_posts' => "+t.qapl_ignore_sticky_posts+",\n"),1===t.qapl_show_select_taxonomy&&(n+="    'selected_taxonomy' => '"+t.qapl_select_taxonomy+"',\n"),1===t.qapl_show_select_taxonomy&&1===t.qapl_manual_term_selection){var o=t.qapl_manual_selected_terms;o&&o.length>0&&(e="[",e+=o.map((t=>`${t}`)).join(", "),e+="]"),e&&(n+="    'selected_terms' => "+e+",\n")}let i=n.trimEnd();return i.endsWith(",")&&(n=i.slice(0,-1)+"\n"),n+="];",""!==n.trim()&&(_+="\n// Define AJAX query parameters for '"+t.qapl_select_post_type+"' type posts.\n",_+=n.trim()+"\n"),_},qapl_generate_attributes:function(t,a){const n=this;let e={},_="";e[qapl_quick_ajax_admin_data.constants.quick_ajax_id]=a,1===t.qapl_layout_quick_ajax_css_style&&(e[qapl_quick_ajax_admin_data.constants.quick_ajax_css_style]=t.qapl_layout_quick_ajax_css_style,e[qapl_quick_ajax_admin_data.constants.grid_num_columns]=t.qapl_layout_select_columns_qty),t.qapl_layout_quick_ajax_post_item_template&&(e[qapl_quick_ajax_admin_data.constants.post_item_template]=t.qapl_layout_quick_ajax_post_item_template),t.qapl_layout_add_taxonomy_filter_class&&""!==t.qapl_layout_add_taxonomy_filter_class&&(e[qapl_quick_ajax_admin_data.constants.taxonomy_filter_class]=n.cleanClassNames(t.qapl_layout_add_taxonomy_filter_class)),t.qapl_layout_add_container_class&&""!==t.qapl_layout_add_container_class&&(e[qapl_quick_ajax_admin_data.constants.container_class]=n.cleanClassNames(t.qapl_layout_add_container_class)),1===t.qapl_show_custom_load_more_post_quantity&&(e[qapl_quick_ajax_admin_data.constants.load_more_posts]=t.qapl_select_custom_load_more_post_quantity),1===t.qapl_override_global_loader_icon&&(e[qapl_quick_ajax_admin_data.constants.loader_icon]=t.qapl_loader_icon),1===t.qapl_ajax_on_initial_load&&(e[qapl_quick_ajax_admin_data.constants.ajax_initial_load]=t.qapl_ajax_on_initial_load),1===t.qapl_ajax_infinite_scroll&&(e[qapl_quick_ajax_admin_data.constants.infinite_scroll]=t.qapl_ajax_infinite_scroll),1===t.qapl_show_end_post_message&&(e[qapl_quick_ajax_admin_data.constants.show_end_message]=t.qapl_show_end_post_message);var o="";return Object.keys(e).length>0&&(o="",o+="$quick_ajax_attributes = [\n",Object.entries(e).forEach((([t,a])=>{let e;e=n.quick_ajax_is_numeric(a)?parseInt(a):"string"==typeof a?`'${a}'`:a,o+=`    '${t}' => ${e},\n`})),o=o.slice(0,-2)+"\n",o+="];"),""!==o.trim()&&(_+="\n// Define attributes for AJAX.\n",_+=o.trim()+"\n"),_},qapl_generate_sort_controls:function(t){let a=null,n=null;1===t.qapl_show_order_button&&(a=t.qapl_select_orderby_button_options,a&&a.length>0&&(n="$quick_ajax_sort_options = [",n+=a.map((t=>`'${t}'`)).join(", "),n+="];"));var e="",_="";null!==a&&n&&(e="",e+=n,_="",_+="if(function_exists('qapl_render_sort_controls')){\n",_+="    qapl_render_sort_controls(\n",_+="        $quick_ajax_args,\n",_+="        $quick_ajax_attributes,\n",_+="        $quick_ajax_sort_options\n",_+="    );\n",_+="}");let o="";return"string"==typeof e&&""!==e.trim()&&(o+="\n// Set the sort options for the button.\n",o+=e.trim()+"\n"),"string"==typeof _&&""!==_.trim()&&(o+="\n// Render the sorting control button.\n",o+=_.trim()+"\n"),o},qapl_generate_taxonomy_filter:function(t){let a=null,n="",e="";return 1===t.qapl_show_select_taxonomy&&(a=t.qapl_select_taxonomy),null!==a&&(e+="if(function_exists('qapl_render_taxonomy_filter')){\n",e+="    qapl_render_taxonomy_filter(\n",e+="        $quick_ajax_args,\n",e+="        $quick_ajax_attributes,\n",e=e.slice(0,-2)+"\n",e+="    );\n",e+="}"),""!==e.trim()&&(n+="\n// Render the navigation for '"+t.qapl_select_taxonomy+"' taxonomy.\n",n+=e.trim()+"\n"),n},qapl_generate_post_container:function(t,a){let n="",e="";return e+="if(function_exists('qapl_render_post_container')){\n",e+="   qapl_render_post_container(\n",e+="       $quick_ajax_args,\n",""!==a&&(e+="       $quick_ajax_attributes,\n"),e=e.slice(0,-2)+"\n",e+="   );\n",e+="}",""!==e.trim()&&(n+="\n// Render the grid for '"+t.qapl_select_post_type+"' type posts.\n",n+=e.trim()+"\n"),n},quick_ajax_function_generator:function(){const a=this;this.data_available&&t(".generate-function-button").on("click",(function(){const n=t(this),e=n.attr("data-output"),_=t("#"+e),o=t('.copy-button-text[data-copy="'+e+'"]');n.prop("disabled",!0),o.prop("disabled",!0);const i=a.qapl_collect_input_data(),c=Object.values(i).join(""),s=a.generateId(c),l=a.qapl_generate_args(i),r=a.qapl_generate_attributes(i,s),d=[l,r,a.qapl_generate_sort_controls(i),a.qapl_generate_taxonomy_filter(i),a.qapl_generate_post_container(i,r)].filter(Boolean).join("");_.empty();for(var p=d.split("\n"),u=0;u<p.length;u++)!function(t){setTimeout((function(){_.append(p[t]+"\n"),t===p.length-1&&(n.prop("disabled",!1),o.prop("disabled",!1))}),50*u)}(u)}))},quick_ajax_is_numeric:function(t){return/^-?\d+(\.\d+)?$/.test(t)},quick_ajax_color_picker:function(){t(".color-picker-field").wpColorPicker()},quick_ajax_select_text_by_type:function(t,a){if(!t)return;if("input"===a)return t.focus(),void t.select();let n,e;document.body.createTextRange?(n=document.body.createTextRange(),n.moveToElementText(t),n.select()):window.getSelection&&(e=window.getSelection(),n=document.createRange(),n.selectNodeContents(t),e.removeAllRanges(),e.addRange(n))},click_and_select_shortcode:function(){const a=this;t(".click-and-select-node").on("click",(function(){a.quick_ajax_select_text_by_type(this,"node")}))},click_and_select:function(){const a=this;t(".click-and-select-input").on("click",(function(){a.quick_ajax_select_text_by_type(this,"input")}))},accordion_block_toggle:function(){var a=t("#wpbody-content");if(a.find(".quick-ajax-tabs").length>0){var n=t("#adminmenuwrap").outerHeight();a.css("min-height",n)}t(".quick-ajax-accordion-toggle").click((function(){t(this).toggleClass("active").next(".quick-ajax-accordion-content").slideToggle(200)}));var e=window.location.hash;if(e){var _=t(e);if(_.length){var o=_.find(".quick-ajax-accordion-toggle").first(),i=o.next(".quick-ajax-accordion-content");o.addClass("active"),i.show();var c=_.offset().top-110;c<0&&(c=0),t("html, body").scrollTop(c)}}}};t(document).ready((function(){a.init()}))}(jQuery);
     1!function(a){var t={data_available:"undefined"!=typeof qapl_quick_ajax_admin_data&&qapl_quick_ajax_admin_data,init:function(){this.click_and_select_shortcode(),this.click_and_select(),this.handle_post_type_change(),this.handle_taxonomy_change(),this.show_hide_element_on_change(),this.quick_ajax_tabs(),this.copy_code(),this.copy_input(),this.quick_ajax_function_generator(),this.accordion_block_toggle()},handle_post_type_change:function(){if(!this.data_available)return;const t=this,n=a("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_post_type);n.length&&n.on("change",(function(){const n=a(this).val();a.ajax({url:qapl_quick_ajax_admin_data.ajax_url,type:"POST",data:{action:"qapl_action_get_taxonomies_by_post_type",post_type:n,nonce:qapl_quick_ajax_admin_data.nonce},success:function(n){if(n&&n.data){const e=a("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_taxonomy);e.empty(),e.append(n.data),t.trigger_taxonomy_change()}},error:function(a,t,n){}})}))},handle_taxonomy_change:function(){if(!this.data_available)return;const t=this,n=a("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_taxonomy),e=a("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_manual_selected_terms);n.length&&n.on("change",(function(){e.empty(),t.admin_page_loader(e);let n=a(this).val(),_="";a("#post_ID").length&&(_=a("#post_ID").val()),a.ajax({url:qapl_quick_ajax_admin_data.ajax_url,type:"POST",data:{action:"qapl_action_get_terms_by_taxonomy",taxonomy:n,post_id:_,nonce:qapl_quick_ajax_admin_data.nonce},success:function(a){a&&a.data&&e.fadeOut(100,(function(){e.empty(),e.append(a.data),e.fadeIn(100)}))},error:function(a,t,n){}})}))},trigger_taxonomy_change:function(){if(!this.data_available)return;const t=this,n=a("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_taxonomy),e=a("#"+qapl_quick_ajax_admin_data.constants.quick_ajax_settings_wrapper+" #"+qapl_quick_ajax_admin_data.constants.quick_ajax_manual_selected_terms);e.length&&(t.admin_page_loader(e),n.trigger("change"))},admin_page_loader:function(a){a.append('<div class="qapl-admin-page-loader"><span></span><span></span><span></span></div>')},show_hide_element_on_change:function(){a(".show-hide-trigger input, .show-hide-trigger select").on("change",(function(){a(".quick-ajax-field-container[data-conditional]").each((function(){const t=a(this),n=t.data("conditional");let e=!0;for(const t in n){if(!n.hasOwnProperty(t))continue;const _=n[t],o=a("#"+t);if((o.is(":checkbox")?o.is(":checked")?"1":"0":o.val())!==_){e=!1;break}}e?t.removeClass("inactive"):t.addClass("inactive")}))}))},quick_ajax_tabs:function(){if(a(".quick-ajax-tabs").length){const t=a(".quick-ajax-tab-button"),n=a(".quick-ajax-tab-content");t.on("click",(function(e){e.preventDefault();const _=a(this).data("tab"),o=Number(_.split("-").pop()),i=new URL(window.location.href);i.searchParams.set("tab",o),history.replaceState(null,"",i.toString()),t.removeClass("active").attr("aria-selected","false").attr("tabindex","-1"),n.removeClass("active").attr("hidden",!0),a(this).addClass("active").attr("aria-selected","true").attr("tabindex","0"),a("#"+_).addClass("active").attr("hidden",!1)})),t.on("keydown",(function(a){const n=t.index(this);let e;if("ArrowRight"===a.key)e=(n+1)%t.length;else{if("ArrowLeft"!==a.key)return;e=(n-1+t.length)%t.length}t.eq(e).focus().click()}));const e=new URLSearchParams(window.location.search),_=parseInt(e.get("tab"),10);if(!isNaN(_)){const t=a('.quick-ajax-tab-button[data-tab="'+("quick-ajax-tab-"+_)+'"]');t.length&&t.trigger("click")}}},copy_code:function(){const t=this;a(".copy-button-text").on("click",(function(){var n=a(this),e=a("#"+n.data("copy"));e.length&&t.copy_to_clipboard(e.text(),n,n.data("label-copied"),n.text())}))},copy_input:function(){const t=this;a(".copy-button-input").on("click",(function(){var n=a(this),e=document.getElementById(n.data("copy"));e&&t.copy_to_clipboard(e.value,n,n.data("label-copied"),n.text())}))},copy_to_clipboard:function(a,t,n,e,_){var o=_||1e3,i=function(){t.text(n),setTimeout((function(){t.text(e)}),o)};if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(a).then(i).catch((function(){}));else{var c=document.createElement("textarea");c.value=a,c.style.position="fixed",c.style.left="-9999px",document.body.appendChild(c),c.select();try{document.execCommand("copy"),i()}catch(a){}document.body.removeChild(c)}},generateId:function(a){let t=0;for(let n=0;n<a.length;n++)t+=a.charCodeAt(n),n%2==0?t+=a.charCodeAt(n):t-=a.charCodeAt(n);return t},getExcludedPostIds:function(a){var t=a.split(/[,\s]+/),n=[];return t.forEach((function(a){/^\d+$/.test(a)&&-1===n.indexOf(a)&&n.push(a)})),n.join(", ")},cleanClassNames:function(a){let t=a.replace(/,/g," ").split(/\s+/);return t=t.filter(((a,t,n)=>!/^\d/.test(a)&&""!==a&&n.indexOf(a)===t)),t.join(", ")},qapl_collect_input_data:function(){const t={};return a(".function-generator-wrap input, .function-generator-wrap select").each((function(n,e){const _=a(e),o=_.attr("name"),i=_.attr("id");if("checkbox"===e.type)if(o&&o.endsWith("[]")){let a=o.replace(/\[\]$/,"");t[a]||(t[a]=[]),_.prop("checked")&&t[a].push(_.val())}else t[i]=_.prop("checked")?1:0;else t[i]=_.val()})),t},qapl_generate_args:function(a){const t=this;let n="",e="",_="";(n+="$quick_ajax_args = [\n",n+="    'post_type' => '"+a.qapl_select_post_type+"',\n",n+="    'posts_per_page' => "+a.qapl_select_posts_per_page+",\n","none"!==a.qapl_select_orderby&&(n+="    'orderby' => '"+a.qapl_select_orderby+"',\n"),n+="    'order' => '"+a.qapl_select_order+"',\n",""!==a.qapl_select_post_not_in)&&(n+="    'post__not_in' => ["+t.getExcludedPostIds(a.qapl_select_post_not_in)+"],\n");if(1===a.qapl_ignore_sticky_posts&&(n+="    'ignore_sticky_posts' => "+a.qapl_ignore_sticky_posts+",\n"),1===a.qapl_show_select_taxonomy&&(n+="    'selected_taxonomy' => '"+a.qapl_select_taxonomy+"',\n"),1===a.qapl_show_select_taxonomy&&1===a.qapl_manual_term_selection){var o=a.qapl_manual_selected_terms;o&&o.length>0&&(e="[",e+=o.map((a=>`${a}`)).join(", "),e+="]"),e&&(n+="    'selected_terms' => "+e+",\n")}let i=n.trimEnd();return i.endsWith(",")&&(n=i.slice(0,-1)+"\n"),n+="];",""!==n.trim()&&(_+="\n// Define AJAX query parameters for '"+a.qapl_select_post_type+"' type posts.\n",_+=n.trim()+"\n"),_},qapl_generate_attributes:function(a,t){const n=this;let e={},_="";e[qapl_quick_ajax_admin_data.constants.quick_ajax_id]=t,1===a.qapl_show_select_taxonomy&&(e[qapl_quick_ajax_admin_data.constants.display_show_all_button]=a.qapl_display_show_all_button),1===a.qapl_layout_quick_ajax_css_style&&(e[qapl_quick_ajax_admin_data.constants.quick_ajax_css_style]=a.qapl_layout_quick_ajax_css_style,e[qapl_quick_ajax_admin_data.constants.grid_num_columns]=a.qapl_layout_select_columns_qty),a.qapl_layout_quick_ajax_post_item_template&&(e[qapl_quick_ajax_admin_data.constants.post_item_template]=a.qapl_layout_quick_ajax_post_item_template),a.qapl_layout_add_taxonomy_filter_class&&""!==a.qapl_layout_add_taxonomy_filter_class&&(e[qapl_quick_ajax_admin_data.constants.taxonomy_filter_class]=n.cleanClassNames(a.qapl_layout_add_taxonomy_filter_class)),a.qapl_layout_add_container_class&&""!==a.qapl_layout_add_container_class&&(e[qapl_quick_ajax_admin_data.constants.container_class]=n.cleanClassNames(a.qapl_layout_add_container_class)),1===a.qapl_show_custom_load_more_post_quantity&&(e[qapl_quick_ajax_admin_data.constants.load_more_posts]=a.qapl_select_custom_load_more_post_quantity),1===a.qapl_override_global_loader_icon&&(e[qapl_quick_ajax_admin_data.constants.loader_icon]=a.qapl_loader_icon),1===a.qapl_ajax_on_initial_load&&(e[qapl_quick_ajax_admin_data.constants.ajax_initial_load]=a.qapl_ajax_on_initial_load),1===a.qapl_ajax_infinite_scroll&&(e[qapl_quick_ajax_admin_data.constants.infinite_scroll]=a.qapl_ajax_infinite_scroll),1===a.qapl_show_end_post_message&&(e[qapl_quick_ajax_admin_data.constants.show_end_message]=a.qapl_show_end_post_message);var o="";return Object.keys(e).length>0&&(o="",o+="$quick_ajax_attributes = [\n",Object.entries(e).forEach((([a,t])=>{let e;e=n.quick_ajax_is_numeric(t)?parseInt(t):"string"==typeof t?`'${t}'`:t,o+=`    '${a}' => ${e},\n`})),o=o.slice(0,-2)+"\n",o+="];"),""!==o.trim()&&(_+="\n// Define attributes for AJAX.\n",_+=o.trim()+"\n"),_},qapl_generate_sort_controls:function(a){let t=null,n=null;1===a.qapl_show_order_button&&(t=a.qapl_select_orderby_button_options,t&&t.length>0&&(n="$quick_ajax_sort_options = [",n+=t.map((a=>`'${a}'`)).join(", "),n+="];"));var e="",_="";null!==t&&n&&(e="",e+=n,_="",_+="if(function_exists('qapl_render_sort_controls')){\n",_+="    qapl_render_sort_controls(\n",_+="        $quick_ajax_args,\n",_+="        $quick_ajax_attributes,\n",_+="        $quick_ajax_sort_options\n",_+="    );\n",_+="}");let o="";return"string"==typeof e&&""!==e.trim()&&(o+="\n// Set the sort options for the button.\n",o+=e.trim()+"\n"),"string"==typeof _&&""!==_.trim()&&(o+="\n// Render the sorting control button.\n",o+=_.trim()+"\n"),o},qapl_generate_taxonomy_filter:function(a){let t=null,n="",e="";return 1===a.qapl_show_select_taxonomy&&(t=a.qapl_select_taxonomy),null!==t&&(e+="if(function_exists('qapl_render_taxonomy_filter')){\n",e+="    qapl_render_taxonomy_filter(\n",e+="        $quick_ajax_args,\n",e+="        $quick_ajax_attributes,\n",e=e.slice(0,-2)+"\n",e+="    );\n",e+="}"),""!==e.trim()&&(n+="\n// Render the navigation for '"+a.qapl_select_taxonomy+"' taxonomy.\n",n+=e.trim()+"\n"),n},qapl_generate_post_container:function(a,t){let n="",e="";return e+="if(function_exists('qapl_render_post_container')){\n",e+="   qapl_render_post_container(\n",e+="       $quick_ajax_args,\n",""!==t&&(e+="       $quick_ajax_attributes,\n"),e=e.slice(0,-2)+"\n",e+="   );\n",e+="}",""!==e.trim()&&(n+="\n// Render the grid for '"+a.qapl_select_post_type+"' type posts.\n",n+=e.trim()+"\n"),n},quick_ajax_function_generator:function(){const t=this;this.data_available&&a(".generate-function-button").on("click",(function(){const n=a(this),e=n.attr("data-output"),_=a("#"+e),o=a('.copy-button-text[data-copy="'+e+'"]');n.prop("disabled",!0),o.prop("disabled",!0);const i=t.qapl_collect_input_data(),c=Object.values(i).join(""),s=t.generateId(c),l=t.qapl_generate_args(i),r=t.qapl_generate_attributes(i,s),d=[l,r,t.qapl_generate_sort_controls(i),t.qapl_generate_taxonomy_filter(i),t.qapl_generate_post_container(i,r)].filter(Boolean).join("");_.empty();for(var p=d.split("\n"),u=0;u<p.length;u++)!function(a){setTimeout((function(){_.append(p[a]+"\n"),a===p.length-1&&(n.prop("disabled",!1),o.prop("disabled",!1))}),50*u)}(u)}))},quick_ajax_is_numeric:function(a){return/^-?\d+(\.\d+)?$/.test(a)},quick_ajax_color_picker:function(){a(".color-picker-field").wpColorPicker()},quick_ajax_select_text_by_type:function(a,t){if(!a)return;if("input"===t)return a.focus(),void a.select();let n,e;document.body.createTextRange?(n=document.body.createTextRange(),n.moveToElementText(a),n.select()):window.getSelection&&(e=window.getSelection(),n=document.createRange(),n.selectNodeContents(a),e.removeAllRanges(),e.addRange(n))},click_and_select_shortcode:function(){const t=this;a(".click-and-select-node").on("click",(function(){t.quick_ajax_select_text_by_type(this,"node")}))},click_and_select:function(){const t=this;a(".click-and-select-input").on("click",(function(){t.quick_ajax_select_text_by_type(this,"input")}))},accordion_block_toggle:function(){var t=a("#wpbody-content");if(t.find(".quick-ajax-tabs").length>0){var n=a("#adminmenuwrap").outerHeight();t.css("min-height",n)}a(".quick-ajax-accordion-toggle").click((function(){a(this).toggleClass("active").next(".quick-ajax-accordion-content").slideToggle(200)}));var e=window.location.hash;if(e){var _=a(e);if(_.length){var o=_.find(".quick-ajax-accordion-toggle").first(),i=o.next(".quick-ajax-accordion-content");o.addClass("active"),i.show();var c=_.offset().top-110;c<0&&(c=0),a("html, body").scrollTop(c)}}}};a(document).ready((function(){t.init()}))}(jQuery);
  • quick-ajax-post-loader/trunk/quick-ajax-post-loader.php

    r3458287 r3476983  
    55* Text Domain: quick-ajax-post-loader
    66* Domain Path: /languages
    7 * Version: 1.8.9
     7* Version: 1.8.10
    88* Description: Supercharge post loading with Quick Ajax Post Loader. Enhance user experience and optimize site performance using AJAX technology.
    99* Author: Pawel Grzelkowski
  • quick-ajax-post-loader/trunk/readme.txt

    r3458287 r3476983  
    55Requires at least: 5.6
    66Tested up to: 6.9
    7 Stable tag: 1.8.9
     7Stable tag: 1.8.10
    88Requires PHP: 7.4
    99License: GPLv2 or later
     
    106106== Changelog ==
    107107
     108
     109= 1.8.10 - 2026-03-07 =
     110- Added a new "Display Show All" option, allowing you to enable or disable the "Show All" button in taxonomy filters.
     111- Improved overall shortcode configuration handling for more consistent behavior.
     112- Enhanced reliability when combining shortcode attributes with saved settings.
     113- General internal refinements for improved stability and maintainability.
     114
    108115= 1.8.9 - 2026-02-10 =
    109116- Optimized post item image rendering to improve frontend performance.
Note: See TracChangeset for help on using the changeset viewer.