Plugin Directory

Changeset 3399506


Ignore:
Timestamp:
11/20/2025 08:21:07 AM (4 months ago)
Author:
grzelkowski
Message:

version 1.8.5

Location:
quick-ajax-post-loader/trunk
Files:
7 added
3 deleted
13 edited

Legend:

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

    r3369893 r3399506  
    5050            $this->unserialize_data($post->ID);
    5151            echo '<div class="quick-ajax-form-wrap '.esc_attr($this->get_quick_ajax_form_class()).'" id="' . esc_attr($this->form_id) . '">';
    52             echo wp_kses($this->render_form(), $this->wp_kses_allowed_tags());
     52            echo wp_kses($this->render_form(), QAPL_Form_Helper::wp_kses_allowed_tags());
    5353            wp_nonce_field(QAPL_Quick_Ajax_Constants::NONCE_FORM_QUICK_AJAX_ACTION, QAPL_Quick_Ajax_Constants::NONCE_FORM_QUICK_AJAX_FIELD);
    5454            echo '</div>';
  • quick-ajax-post-loader/trunk/includes/admin/pages/class-admin-options-page-form.php

    r3369893 r3399506  
    7474        echo '<div class="wrap">';
    7575        echo '<div class="quick-ajax-heading">';
    76         echo wp_kses($this->render_quick_ajax_page_heading(), $this->wp_kses_allowed_tags());
     76        echo wp_kses($this->render_quick_ajax_page_heading(), QAPL_Form_Helper::wp_kses_allowed_tags());
    7777        echo '</div>';
    7878        echo '<div class="quick-ajax-form-wrap ' . esc_attr($this->get_quick_ajax_form_class()) . '" id="form-' . esc_attr($this->option_group) . '">';
    7979        //echo '<form method="post" action="options.php">';
    8080        //settings_fields($this->option_group); // Output security fields for the registered settings
    81         echo wp_kses($this->render_quick_ajax_tabs_navigation(), $this->wp_kses_allowed_tags());
    82         echo wp_kses($this->render_quick_ajax_tabs_content(), $this->wp_kses_allowed_tags());
     81        echo wp_kses($this->render_quick_ajax_tabs_navigation(), QAPL_Form_Helper::wp_kses_allowed_tags());
     82        echo wp_kses($this->render_quick_ajax_tabs_content(), QAPL_Form_Helper::wp_kses_allowed_tags());
    8383        //echo '</form>';
    8484        echo '</div>';
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-helper.php

    r3383449 r3399506  
    3030        return $data;
    3131    }
    32     public function args_json(array $args){
    33         $json_data = wp_json_encode($args);
    34         return $json_data;
     32    public function args_json(array $args) {
     33        return wp_json_encode($args);
     34    }
     35    public function extract_classes_from_string($string){
     36        // Split the input string into an array using whitespace or comma as separators
     37        $class_container_array = preg_split('/[\s,]+/', $string);
     38        $class_container_array = array_map('sanitize_html_class', $class_container_array);
     39
     40        // Iterate over the array and remove elements that start with a digit
     41        foreach ($class_container_array as $key => $item) {
     42            if (preg_match('/^\d/', $item)) {
     43                // Use unset to remove the item from the array if it starts with a digit
     44                unset($class_container_array[$key]);
     45            }
     46        }
     47        $container_class = implode(' ', $class_container_array);
     48        return $container_class;
    3549    }
    3650}
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-layout-renderer.php

    r3383449 r3399506  
    77    private $file_manager;
    88    private $ui_renderer;
     9    private $load_more_renderer;
     10    private $helper;
    911
    10     public function __construct(QAPL_Quick_Ajax_File_Manager $file_manager, QAPL_Ajax_UI_Renderer $ui_renderer) {
    11         $this->file_manager = $file_manager;
    12         $this->ui_renderer  = $ui_renderer;
     12    public function __construct(QAPL_Quick_Ajax_File_Manager $file_manager, QAPL_Ajax_UI_Renderer $ui_renderer, QAPL_Ajax_Load_More_Renderer $load_more_renderer, QAPL_Ajax_Helper $helper) {
     13        $this->file_manager         = $file_manager;
     14        $this->ui_renderer          = $ui_renderer;
     15        $this->load_more_renderer   = $load_more_renderer;
     16        $this->helper               = $helper;
    1317    }
    1418
    15     public function layout_customization($attributes, $global_options){
    16         $layout = [];
    17         $attrs = [];
    18         //Apply quick AJAX CSS Style
    19         $layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_CSS_STYLE] = (isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_CSS_STYLE])) ? esc_attr($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_CSS_STYLE]) : 0;
    20         //Number of columns
    21         $layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_GRID_NUM_COLUMNS] = (isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_GRID_NUM_COLUMNS])) ? esc_attr($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_GRID_NUM_COLUMNS]) : 0;
    22         //add custom class for taxonomy filter
    23         if(isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_TAXONOMY_FILTER_CLASS])){
    24             $layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_TAXONOMY_FILTER_CLASS] = $this->extract_classes_from_string($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_TAXONOMY_FILTER_CLASS]);
    25         }
    26         //Add class to post container
    27         if(isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_CONTAINER_CLASS])){
    28             $layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_CONTAINER_CLASS] = $this->extract_classes_from_string($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_CONTAINER_CLASS]);
    29         }
    30         //Post Item Template
    31         $post_item_template = isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_POST_ITEM_TEMPLATE]) ? $attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_POST_ITEM_TEMPLATE] : false;
    32         $layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_POST_ITEM_TEMPLATE] = $this->file_manager->get_post_item_template($post_item_template);
    33         $attrs[QAPL_Quick_Ajax_Constants::ATTRIBUTE_POST_ITEM_TEMPLATE] = $post_item_template;
    34         //Custom Load More Post Quantity           
    35         if(isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOAD_MORE_POSTS])){
    36             $attrs[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOAD_MORE_POSTS] = intval($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOAD_MORE_POSTS]);
    37         }           
    38         //Select Loader Icon
    39         if (isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOADER_ICON]) && !empty($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOADER_ICON])) {
    40             $loader_icon = $attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOADER_ICON];
    41         } elseif (isset($global_options['loader_icon']) && !empty($global_options['loader_icon'])) {
    42             // fallback to global option if attributes value is invalid
    43             $loader_icon = $global_options['loader_icon'];
    44         } else {
    45             // final fallback to default value
    46             $loader_icon = QAPL_Quick_Ajax_Constants::LAYOUT_SETTING_SELECT_LOADER_ICON_DEFAULT;
    47         }
    48         $layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOADER_ICON] = $this->file_manager->get_loader_icon_template($loader_icon);
    49         $attrs[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOADER_ICON] = $loader_icon;
    50         // infinite_scroll
    51         if(isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_AJAX_INFINITE_SCROLL])){
    52             $attrs[QAPL_Quick_Ajax_Constants::ATTRIBUTE_AJAX_INFINITE_SCROLL] = intval($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_AJAX_INFINITE_SCROLL]);
    53         }
    54         // show_end_message
    55         if(isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_SHOW_END_MESSAGE])){
    56             $attrs[QAPL_Quick_Ajax_Constants::ATTRIBUTE_SHOW_END_MESSAGE] = intval($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_SHOW_END_MESSAGE]);
    57         }
    58         $ajax_initial_load = isset($attributes[QAPL_Quick_Ajax_Constants::AJAX_SETTING_AJAX_INITIAL_LOAD]) ? intval($attributes[QAPL_Quick_Ajax_Constants::AJAX_SETTING_AJAX_INITIAL_LOAD]) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_AJAX_ON_INITIAL_LOAD_DEFAULT;
    59         return [
    60             'layout' => $layout,
    61             'attributes' => $attrs,
    62             'ajax_initial_load' => $ajax_initial_load,
    63         ];
    64     }
    65 
    66     public function wp_query($args, $input_args, $layout, $attributes, $ajax_initial_load, $action_args, $quick_ajax_id) {
    67         if (empty($args)) {
     19    public function render_layout($query_args, $source_args, $layout, $attributes, $ajax_initial_load, $quick_ajax_id) {
     20        if (empty($query_args)) {
    6821            return false;
    6922        }
    70         $args['selected_taxonomy'] = sanitize_text_field($input_args['selected_taxonomy'] ?? '');
    71         $args['selected_terms'] = array_map('absint', $input_args['selected_terms'] ?? []);
     23        $query_args['selected_taxonomy'] = sanitize_text_field($source_args['selected_taxonomy'] ?? '');
     24        $query_args['selected_terms'] = array_map('absint', $source_args['selected_terms'] ?? []);
    7225
    73         $query = new WP_Query($args);
     26        $query = new WP_Query($query_args);
    7427        //$this->attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $this->quick_ajax_id;
    7528        //$layout_quick_ajax_id = esc_attr($this->attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID]);
     
    8538            $class_inner_container .= ' '.$layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_CONTAINER_CLASS];
    8639        }
    87         $container_class = $this->extract_classes_from_string($class_container);
    88         $container_inner_class = $this->extract_classes_from_string($class_inner_container);
     40        $container_class = $this->helper->extract_classes_from_string($class_container);
     41        $container_inner_class = $this->helper->extract_classes_from_string($class_inner_container);
    8942        ob_start();
    9043        // Start output buffering
     
    10659                    $attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $quick_ajax_id;
    10760                }
    108                 echo '<div class="qapl-initial-loader" data-button="quick-ajax-filter-button" style="display:none;" data-action="' . esc_attr(wp_json_encode($input_args)) . '" data-attributes="' . esc_attr(wp_json_encode($attributes)) . '"></div>';
     61                echo '<div class="qapl-initial-loader" data-button="'.QAPL_Quick_Ajax_Constants::TERM_FILTER_BUTTON_DATA_BUTTON.'" style="display:none;" data-action="' . esc_attr(wp_json_encode($source_args)) . '" data-attributes="' . esc_attr(wp_json_encode($attributes)) . '"></div>';
    10962            } else {
    11063                while ($query->have_posts()) {
     
    14396         
    14497            //echo wp_kses_post($this->load_more_button(intval($query->get('paged')), intval($query->max_num_pages), intval($query->found_posts), intval($query->post_count), $infinite_scroll));
    145             echo wp_kses_post($this->load_more_button($args, $attributes, $action_args, $query_data, $quick_ajax_id));
     98            //echo wp_kses_post($this->load_more_button($attributes, $source_args, $query_data, $quick_ajax_id));
     99            $load_more_data = $this->load_more_renderer->build_load_more_button($attributes, $source_args, $query_data, $quick_ajax_id);
     100            echo $this->load_more_renderer->render_load_more_button($load_more_data);
    146101        }
    147102        do_action(QAPL_Quick_Ajax_Constants::HOOK_POSTS_CONTAINER_END, $quick_ajax_id);
     
    156111        return $output; // Return the content
    157112    }
    158     public function load_more_button($args, $attributes, $action_args, $query_data, $quick_ajax_id) {
    159         if (empty($query_data) || !is_array($query_data)) {
    160             return false;
    161         }
    162         $paged           = intval($query_data['paged'] ?? 1);
    163         $max_num_pages   = intval($query_data['max_num_pages'] ?? 1);
    164         $found_posts     = intval($query_data['found_posts'] ?? 0);
    165         $post_count      = intval($query_data['post_count'] ?? 0);
    166         $infinite_scroll = !empty($query_data['infinite_scroll']);
    167         //echo 'paged:'.$paged.'<br />$max_num_pages:'.$max_num_pages.'<br />$found_posts:'.$found_posts.'<br />';
    168         //print_r($this->args);
    169         $load_more_args = $action_args;
    170         //$load_more_args['paged'] = isset($this->args['paged']) ? intval($this->args['paged']) : 1;
    171         $load_more_args['paged'] = $paged;
    172         if (isset($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOAD_MORE_POSTS]) && !empty($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOAD_MORE_POSTS])) {
    173         // Check if load_more_posts attribute is set
    174         // if we want to add a different number of posts than displayed at the start
    175         // use 'offset' not 'paged'
    176             $load_more_posts = intval($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_LOAD_MORE_POSTS]);
    177             //get initial offset and number of posts per page
    178             $initial_offset = isset($load_more_args['offset']) ? intval($load_more_args['offset']) : 0;
    179             //get number of posts per page
    180             $posts_per_page = intval($load_more_args['posts_per_page']);
    181                        
    182             //old logic
    183             //if post_found smaller than initial offset and post per page
    184             //if ($found_posts <= $initial_offset + $posts_per_page) {
    185             //   return false;
    186             //}
    187             //new logic
    188             $shown_posts = $initial_offset + $post_count;
    189             if ($found_posts <= $shown_posts) {
    190                 return false;
    191             }
    192                 // Update offset
    193             $load_more_args['offset'] = isset($load_more_args['offset']) ? intval($load_more_args['offset']) + $load_more_posts : intval($load_more_args['posts_per_page']);
    194             $load_more_args['posts_per_page'] = $load_more_posts;
    195         } else {
    196             // Check if there are no more pages to load
    197             if ($max_num_pages <= $paged) {
    198                 return false;
    199             }               
    200             $load_more_args['paged'] += 1;
    201         }
    202         $class = '';
    203         if ($infinite_scroll) {
    204             $class = ' infinite-scroll';
    205         }
    206         //do_action(QAPL_Quick_Ajax_Constants::HOOK_LOAD_MORE_BEFORE);
    207         if (empty($attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID])) {
    208             $attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $quick_ajax_id;
    209         }
    210         $button_data['template'] = $this->file_manager->get_load_more_button_template();
    211         $button_data['button_label'] = __('Load More', 'quick-ajax-post-loader');
    212         $button_data['data-button'] = QAPL_Quick_Ajax_Constants::LOAD_MORE_BUTTON_DATA_BUTTON;
    213         $button_data['data-action'] = $load_more_args;
    214         $button_data['data-attributes'] = $attributes;
    215         $load_more_button = '<div class="quick-ajax-load-more-container'.$class.'">';
    216         $load_more_button .= $this->ui_renderer->update_button_template($button_data);
    217         //$load_more_button .=  $this->update_button_template($button_data);
    218         $load_more_button .= '</div>';
    219         return $load_more_button;
    220         //do_action(QAPL_Quick_Ajax_Constants::HOOK_LOAD_MORE_AFTER);
    221     }
    222     public function render_end_of_posts_message($load_more, $max_num_pages, $quick_ajax_id, $show_end_post_message = false) {
    223         if(!$show_end_post_message){
    224             return '';
    225         }
    226         if ($max_num_pages <= 1) {
    227             return ''; // only one page, don't show anything
    228         }
    229         if ($load_more) {
    230             return ''; // load more still available, don't show anything
    231         }
    232         $end_post_message_settings = [
    233             'quick_ajax_id' => $quick_ajax_id, //$this->quick_ajax_id returns'c'
    234             'template_name' => 'end-post-message',
    235         ];
    236         $qapl_end_post_message_template = QAPL_Post_Template_Factory::get_template($end_post_message_settings);
    237         QAPL_Post_Template_Context::set_template($qapl_end_post_message_template);
    238        
    239         ob_start();
    240         echo '<div class="quick-ajax-end-message-container">';
    241         include($this->file_manager->get_end_posts_template());
    242         echo '</div>';
    243         $content = ob_get_clean();
    244         QAPL_Post_Template_Context::clear_template();
    245         return $content;
    246     }
    247 
    248     private function extract_classes_from_string($string){
    249         // Split the input string into an array using whitespace or comma as separators
    250         $class_container_array = preg_split('/[\s,]+/', $string);
    251         $class_container_array = array_map('sanitize_html_class', $class_container_array);
    252 
    253         // Iterate over the array and remove elements that start with a digit
    254         foreach ($class_container_array as $key => $item) {
    255             if (preg_match('/^\d/', $item)) {
    256                 // Use unset to remove the item from the array if it starts with a digit
    257                 unset($class_container_array[$key]);
    258             }
    259         }
    260         $container_class = implode(' ', $class_container_array);
    261         return $container_class;
    262     }
    263113}
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-query-builder.php

    r3383449 r3399506  
    1010        return $this->quick_ajax_id;
    1111    }
    12     public function wp_query_args($args, $attributes = false){
     12    public function wp_query_args($source_args, $attributes = false){
    1313        // sanitize and normalize input
    14         $args = $this->normalize_args($args);
     14        $source_args = $this->normalize_args($source_args);
    1515
    1616        $this->generate_block_id($attributes);
    1717
    1818        //normalize input args (sanitize selected_terms, post__not_in, etc.)
    19         //$this->input_args = $this->normalize_args($args);
     19        //$this->input_args = $this->normalize_args($source_args);
    2020        //$this->action_args = $this->input_args;
    2121       
    2222        // generate query args (post_type, tax_query, etc.)
    23         $query_args = $this->initialize_query_args($args);
     23        $query_args = $this->initialize_query_args($source_args);
    2424
    2525        $query_args['post_status'] = QAPL_Quick_Ajax_Constants::QUERY_SETTING_SELECT_POST_STATUS_DEFAULT;
     
    3636
    3737        /* not in use yet
    38         if(isset($args['tax_query']) && !empty($args['tax_query'])){
    39             $this->args['tax_query'] = $args['tax_query'];
     38        if(isset($source_args['tax_query']) && !empty($source_args['tax_query'])){
     39            $this->args['tax_query'] = $source_args['tax_query'];
    4040        }
    4141        */
     
    6767        return $int_array;
    6868    }
    69     private function normalize_args($args) {
     69    private function normalize_args($source_args) {
    7070        // convert comma-separated string to array of integers
    71         if (isset($args['post__not_in'])) {
    72             $args['post__not_in'] = $this->sanitize_to_int_array($args['post__not_in']);
     71        if (isset($source_args['post__not_in'])) {
     72            $source_args['post__not_in'] = $this->sanitize_to_int_array($source_args['post__not_in']);
    7373        }       
    74         if (isset($args['selected_terms'])) {
    75             $args['selected_terms'] = $this->sanitize_to_int_array($args['selected_terms']);
     74        if (isset($source_args['selected_terms'])) {
     75            $source_args['selected_terms'] = $this->sanitize_to_int_array($source_args['selected_terms']);
    7676        }
    77         return $args;
     77        return $source_args;
    7878    }
    79     private function initialize_query_args($args) {
     79    private function initialize_query_args($source_args) {
    8080        // Set default query arguments
    81         $query_args = $this->query_args_base_query_args($args);
    82         $query_args = $this->query_args_add_tax_query($query_args, $args);           
    83         $query_args = $this->query_args_apply_offset_or_paged($query_args, $args);
     81        $query_args = $this->query_args_base_query_args($source_args);
     82        $query_args = $this->query_args_add_tax_query($query_args, $source_args);           
     83        $query_args = $this->query_args_apply_offset_or_paged($query_args, $source_args);
    8484        return $query_args;   
    8585    }
    86     private function query_args_base_query_args($args) {
     86    private function query_args_base_query_args($source_args) {
    8787        return [
    88             'post_type' => isset($args['post_type']) ? sanitize_text_field($args['post_type']) : null,
    89             'posts_per_page' => isset($args['posts_per_page']) ? intval($args['posts_per_page']) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_SELECT_POSTS_PER_PAGE_DEFAULT,
    90             'orderby' => isset($args['orderby']) ? sanitize_text_field($args['orderby']) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_SELECT_ORDERBY_DEFAULT,
    91             'order' => isset($args['order']) ? sanitize_text_field($args['order']) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_SELECT_ORDER_DEFAULT,
    92             'post__not_in' => $args['post__not_in'] ?? [],
    93             'ignore_sticky_posts' => isset($args['ignore_sticky_posts']) ? intval($args['ignore_sticky_posts']) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_IGNORE_STICKY_POSTS_DEFAULT,
    94             'paged' => isset($args['paged']) ? intval($args['paged']) : 1,
     88            'post_type' => isset($source_args['post_type']) ? sanitize_text_field($source_args['post_type']) : null,
     89            'posts_per_page' => isset($source_args['posts_per_page']) ? intval($source_args['posts_per_page']) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_SELECT_POSTS_PER_PAGE_DEFAULT,
     90            'orderby' => isset($source_args['orderby']) ? sanitize_text_field($source_args['orderby']) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_SELECT_ORDERBY_DEFAULT,
     91            'order' => isset($source_args['order']) ? sanitize_text_field($source_args['order']) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_SELECT_ORDER_DEFAULT,
     92            'post__not_in' => $source_args['post__not_in'] ?? [],
     93            'ignore_sticky_posts' => isset($source_args['ignore_sticky_posts']) ? intval($source_args['ignore_sticky_posts']) : QAPL_Quick_Ajax_Constants::QUERY_SETTING_IGNORE_STICKY_POSTS_DEFAULT,
     94            'paged' => isset($source_args['paged']) ? intval($source_args['paged']) : 1,
    9595        ];
    9696    } 
    97     private function query_args_apply_offset_or_paged($query_args, $args) {
     97    private function query_args_apply_offset_or_paged($query_args, $source_args) {
    9898        // Check if 'offset' is provided and use it instead of 'paged'
    99         if (isset($args['offset']) && !is_null($args['offset'])) {
     99        if (isset($source_args['offset']) && !is_null($source_args['offset'])) {
    100100            // Set the offset value and remove 'paged' from the query
    101             $query_args['offset'] = intval($args['offset']);
     101            $query_args['offset'] = intval($source_args['offset']);
    102102            unset($query_args['paged']);
    103103        }
    104104        return $query_args;
    105105    }
    106     private function query_args_add_tax_query($query_args, $args) {
    107         $taxonomy = isset($args['selected_taxonomy']) ? sanitize_text_field($args['selected_taxonomy']) : '';
    108         $terms = isset($args['selected_terms']) ? $args['selected_terms'] : [];
     106    private function query_args_add_tax_query($query_args, $source_args) {
     107        $taxonomy = isset($source_args['selected_taxonomy']) ? sanitize_text_field($source_args['selected_taxonomy']) : '';
     108        $terms = isset($source_args['selected_terms']) ? $source_args['selected_terms'] : [];
    109109   
    110110        if ($taxonomy && !empty($terms)) {
  • quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-ui-renderer.php

    r3383449 r3399506  
    77    private $file_manager;
    88    private $global_options;
    9 
    10     public function __construct(QAPL_Quick_Ajax_File_Manager $file_manager, array $global_options = []) {
    11         $this->file_manager = $file_manager;
    12         $this->global_options = $global_options;
     9    private $helper;
     10
     11    public function __construct(QAPL_Quick_Ajax_File_Manager $file_manager, array $global_options = [], QAPL_Ajax_Helper $helper) {
     12        $this->file_manager     = $file_manager;
     13        $this->global_options   = $global_options;
     14        $this->helper           = $helper;
    1315    }
    1416    private function get_post_assigned_to_the_term($term, $post_type, $excluded_post_ids){
    15         $args = array(
     17        $query_args = array(
    1618            'posts_per_page' => 1,
    1719            'post_type' => $post_type,
     
    2729            'fields' => 'ids',
    2830        );
    29         $posts = get_posts($args);
     31        $posts = get_posts($query_args);
    3032
    3133        if (!empty($posts)) {
     
    3840     *
    3941     * This method allows passing a taxonomy directly, but if it's not provided,
    40      * it tries to use the 'selected_taxonomy' value from $input_args.
     42     * it tries to use the 'selected_taxonomy' value from $source_args.
    4143     * The 'selected_taxonomy' exists only if a taxonomy has been chosen.
    4244     * If a taxonomy has been chosen, the filter will be rendered.
     
    4446     * so this method should also accommodate such a scenario if implemented.
    4547     */
    46     public function render_taxonomy_terms_filter($taxonomy, $args, $input_args, $layout, $attributes, $action_args, $quick_ajax_id){
    47         if (empty($args)) {
     48    public function render_taxonomy_terms_filter($taxonomy, $query_args, $source_args, $layout, $attributes, $quick_ajax_id){
     49        if (empty($query_args)) {
    4850            return false;
    4951        }
    5052        if(!$taxonomy){
    51             $taxonomy = $input_args['selected_taxonomy'];
     53            $taxonomy = $source_args['selected_taxonomy'];
    5254        }
    5355
    5456        $terms_args = array(
    5557            'taxonomy'     => $taxonomy,
    56             'object_type'  => array($args['post_type']),
     58            'object_type'  => array($query_args['post_type']),
    5759            'hide_empty'   => true,
    5860        );           
    5961        // only include specific terms if selected_terms is not empty
    60         if (!empty($input_args['selected_terms']) && is_array($input_args['selected_terms'])) {
    61             $terms_args['include'] = $input_args['selected_terms'];
     62        if (!empty($source_args['selected_terms']) && is_array($source_args['selected_terms'])) {
     63            $terms_args['include'] = $source_args['selected_terms'];
    6264        }           
    6365        $terms = get_terms($terms_args);           
     
    7173            $class_container .= ' ' . $layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_TAXONOMY_FILTER_CLASS];
    7274        }           
    73         $container_class = $this->extract_classes_from_string($class_container);
     75        $container_class = $this->helper->extract_classes_from_string($class_container);
    7476
    7577        ob_start(); // Start output buffering
     
    9496                'button_label' => $show_all_label,
    9597                'data-button' => $button_base['data-button'],
    96                 'data-action' => $action_args,
     98                'data-action' => $source_args,
    9799                'data-attributes' => $button_base['data-attributes'],
    98100            ];
    99101            $show_all_button['is_active'] = true;
    100102            $navigation_buttons[] = $show_all_button;
    101             $exclude_ids = (isset($args['post__not_in'])) ? $args['post__not_in'] : '';
     103            $exclude_ids = (isset($query_args['post__not_in'])) ? $query_args['post__not_in'] : '';
    102104            foreach ( $terms as $term ) {
    103                 $not_empty = $this->get_post_assigned_to_the_term($term, $args['post_type'], $exclude_ids);
     105                $not_empty = $this->get_post_assigned_to_the_term($term, $query_args['post_type'], $exclude_ids);
    104106                if($not_empty == true){
    105                     $data_action = $action_args;
     107                    $data_action = $source_args;
    106108                    $data_action['selected_terms'] = [$term->term_id];
    107109                    $term_button_data = [                       
     
    133135        return $output; // Return the content
    134136    }
    135         public function render_sort_options($sort_options, $layout, $args, $attributes, $action_args, $quick_ajax_id) {
     137
     138    public function render_sort_options($sort_options, $layout, $query_args, $attributes, $source_args, $quick_ajax_id) {
    136139        $block_id = 'quick-ajax-sort-options-'.$quick_ajax_id;
    137140        $class_container = 'quick-ajax-sort-options-container';
     
    139142            $class_container .= ' quick-ajax-theme';
    140143        }       
    141         $container_class = $this->extract_classes_from_string($class_container);
     144        $container_class = $this->helper->extract_classes_from_string($class_container);
    142145        $sort_buttons ='';
    143146        $allowed_button_html = [
     
    210213                'options' => $filtered_orderby_options
    211214            ];
    212             $sort_buttons .= $this->create_sort_button($button_option, $args, $attributes, $action_args, $quick_ajax_id);           
     215            $sort_buttons .= $this->create_sort_button($button_option, $query_args, $attributes, $source_args, $quick_ajax_id);           
    213216        }
    214217        echo wp_kses($sort_buttons, $allowed_button_html);
     
    219222        return $output; // Return the content
    220223    }
    221     private function create_sort_button($button_data, $args, $attributes, $action_args, $quick_ajax_id) {         
     224    private function create_sort_button($button_data, $query_args, $attributes, $source_args, $quick_ajax_id) {         
    222225        $attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $quick_ajax_id;
    223226        $sort_option = '<div class="quick-ajax-sort-option-wrapper">';
    224         $default_option = strtolower($args['orderby']).'-'.strtolower($args['order']);
     227        $default_option = strtolower($query_args['orderby']).'-'.strtolower($query_args['order']);
    225228        // escape the aria-label
    226229        $aria_label = isset($button_data['label']) ? esc_attr($button_data['label']) : '';
     
    233236        }
    234237        $sort_option .= '</select>';
    235         $sort_option .= '<span class="quick-ajax-settings" data-button="'.QAPL_Quick_Ajax_Constants::SORT_OPTION_BUTTON_DATA_BUTTON.'" data-attributes="' . esc_attr(wp_json_encode($attributes)) . '" data-action="' . esc_attr(wp_json_encode($action_args)) . '"></span>';
     238        $sort_option .= '<span class="quick-ajax-settings" data-button="'.QAPL_Quick_Ajax_Constants::SORT_OPTION_BUTTON_DATA_BUTTON.'" data-attributes="' . esc_attr(wp_json_encode($attributes)) . '" data-action="' . esc_attr(wp_json_encode($source_args)) . '"></span>';
    236239        $sort_option .= '</div>';                     
    237240        return $sort_option;
     
    323326        return $modified_content;
    324327    }
    325     private function extract_classes_from_string($string){
    326         // Split the input string into an array using whitespace or comma as separators
    327         $class_container_array = preg_split('/[\s,]+/', $string);
    328         $class_container_array = array_map('sanitize_html_class', $class_container_array);
    329 
    330         // Iterate over the array and remove elements that start with a digit
    331         foreach ($class_container_array as $key => $item) {
    332             if (preg_match('/^\d/', $item)) {
    333                 // Use unset to remove the item from the array if it starts with a digit
    334                 unset($class_container_array[$key]);
    335             }
    336         }
    337         $container_class = implode(' ', $class_container_array);
    338         return $container_class;
    339     }
    340328}
  • quick-ajax-post-loader/trunk/includes/class-plugin-starter.php

    r3383449 r3399506  
    2323                'QAPL_Quick_Ajax_Utilities',
    2424                'QAPL_Quick_Ajax_Enqueue_Handler',
     25                'QAPL_Form_Helper',
    2526                'QAPL_Quick_Ajax_Form_Field',
    2627                'QAPL_Quick_Ajax_Form_Field_Builder',
  • quick-ajax-post-loader/trunk/includes/form/class-form-content-builder.php

    r3369893 r3399506  
    320320        </div>';
    321321    }
    322     protected function wp_kses_allowed_tags(){
    323         return array(
    324             'div' => array(
    325                 'class' => array(),
    326                 'id' => array(),
    327                 'style' => array(),
    328                 'tabindex' => array(),
    329                 'data-item' => array(),
    330                 'data-conditional' => array(),
    331                 'role' => array(),
    332                 'hidden' => array(),
    333             ),
    334             'button' => array(
    335                 'type' => array(),
    336                 'class' => array(),
    337                 'style' => array(),
    338                 'id' => array(),               
    339                 'data-tab' => array(),
    340                 'data-output' => array(),
    341                 'data-copy' => array(),
    342                 'role' => array(),
    343                 'aria-selected' => array(),
    344                 'aria-controls' => array(),
    345             ),
    346             'input' => array(
    347                 'type' => array(),
    348                 'name' => array(),
    349                 'id' => array(),
    350                 'value' => array(),
    351                 'checked' => array(),
    352                 'style' => array(),
    353                 'placeholder' => array(),
    354                 'class' => array(),
    355                 'disabled' => array(),
    356                 'readonly' => array(),
    357                 'size' => array(),
    358                 'maxlength' => array(),
    359                 'min' => array(),
    360                 'max' => array(),
    361                 'step' => array(),
    362                 'required' => array(),
    363             ),
    364             'select' => array(
    365                 'name' => array(),
    366                 'id' => array(),
    367                 'style' => array(),
    368             ),
    369             'option' => array(
    370                 'value' => array(),
    371                 'selected' => array(),
    372                 'style' => array(),
    373             ),
    374             'label' => array(
    375                 'for' => array(),
    376                 'style' => array(),
    377             ),
    378             'span' => array(
    379                 'class' => array(),
    380                 'style' => array(),
    381             ),
    382             'p' => array(
    383                 'class' => array(),
    384                 'style' => array(),
    385             ),
    386             'h1' => array(
    387                 'class' => array(),
    388                 'style' => array(),
    389             ),
    390             'h2' => array(
    391                 'class' => array(),
    392                 'style' => array(),
    393             ),
    394             'h3' => array(
    395                 'class' => array(),
    396                 'style' => array(),
    397             ),
    398             'h4' => array(
    399                 'class' => array(),
    400                 'style' => array(),
    401             ),
    402             'h5' => array(
    403                 'class' => array(),
    404                 'style' => array(),
    405             ),
    406             'h6' => array(
    407                 'class' => array(),
    408                 'style' => array(),
    409             ),
    410             'strong' => array(
    411                 'class' => array(),
    412             ),
    413             'ul' => array(
    414                 'class' => array(),
    415                 'style' => array(),
    416                 'id' => array(),
    417             ),
    418             'li' => array(
    419                 'class' => array(),
    420                 'style' => array(),
    421                 'id' => array(),
    422             ),
    423             'code' => array(
    424                 'class' => array(),
    425             ),
    426             'pre' => array(
    427                 'class' => array(),
    428                 'id' => array(),
    429             ),           
    430             'form' => array(
    431                 'class' => array(),
    432                 'id' => array(),
    433                 'action' => array(),
    434                 'method' => array(),
    435             ),
    436         );
    437     }
    438322}
  • quick-ajax-post-loader/trunk/includes/resources/class-constants.php

    r3383449 r3399506  
    66class QAPL_Quick_Ajax_Constants{
    77    // Plugin info
    8     public const PLUGIN_VERSION = '1.8.4';
     8    public const PLUGIN_VERSION = '1.8.5';
    99    public const PLUGIN_NAME = 'Quick Ajax Post Loader';
    1010    public const PLUGIN_TEXT_DOMAIN = 'quick-ajax-post-loader';
  • quick-ajax-post-loader/trunk/includes/resources/class-resource-manager.php

    r3383449 r3399506  
    3535    private const COMPONENT_FILES = [
    3636        //form
     37        'class-form-helper'                 => 'includes/form/class-form-helper.php', //form helper functions
    3738        'interface-form-field'              => 'includes/form/interface-form-field.php', //interface for form field
    3839        'class-form-field'                  => 'includes/form/class-form-field.php', //final form field object
     
    4647        'class-shortcode-query-args'        => 'includes/shortcode/handlers/class-shortcode-query-args-provider.php',
    4748        'class-shortcode'                   => 'includes/shortcode/class-shortcode.php',
    48         'shortcode-generator'               => 'includes/shortcode/class-shortcode-generator.php',
    49         //AJAX
     49        'class-shortcode-generator'               => 'includes/shortcode/class-shortcode-generator.php',
     50        //AJAX render
    5051        'class-ajax-helper'                 => 'includes/ajax-render/class-ajax-helper.php',
    5152        'class-ajax-query-builder'          => 'includes/ajax-render/class-ajax-query-builder.php',
    5253        'class-ajax-ui-renderer'            => 'includes/ajax-render/class-ajax-ui-renderer.php',
    53         'class-ajax-layout-renderer'        => 'includes/ajax-render/class-ajax-layout-renderer.php',
    54         'class-ajax-render-handler'         => 'includes/ajax-render/class-ajax-render-handler.php',
    55         'class-ajax-controller'             => 'includes/ajax-render/class-ajax-controller.php',
    56         'ajax-actions'                      => 'includes/ajax/class-ajax-action-controller.php',
     54        'class-ajax-layout-builder'         => 'includes/ajax-render/class-ajax-layout-builder.php',
     55        'class-ajax-end-message-renderer'   => 'includes/ajax-render/class-ajax-load-more-renderer.php', 
     56        'class-ajax-load-more-renderer'     => 'includes/ajax-render/class-ajax-end-message-renderer.php', 
     57        'class-ajax-layout-renderer'        => 'includes/ajax-render/class-ajax-layout-renderer.php', 
     58        //AJAX controller
     59        'class-ajax-controller'             => 'includes/ajax-controller/class-ajax-controller.php',
     60        'ajax-actions'                      => 'includes/ajax-controller/class-ajax-action-controller.php',
    5761        //template-renderers
    5862        'template-renderers'                => 'includes/template-renderers/class-template-hooks.php',
  • quick-ajax-post-loader/trunk/includes/template-renderers/class-template-hooks.php

    r3358086 r3399506  
    239239    public function render_load_more_button() {   
    240240        $label = $this->config->get('load_more_label');
    241         $output = '<button type="button" class="qapl-load-more-button qapl-button" data-button="quick-ajax-load-more-button">' . esc_html($label) . '</button>';
     241        $output = '<button type="button" class="qapl-load-more-button qapl-button" data-button="'.QAPL_Quick_Ajax_Constants::LOAD_MORE_BUTTON_DATA_BUTTON.'">' . esc_html($label) . '</button>';
    242242        return apply_filters(QAPL_Quick_Ajax_Constants::HOOK_TEMPLATE_LOAD_MORE_BUTTON, $output, $this->quick_ajax_id);
    243243    }
  • quick-ajax-post-loader/trunk/quick-ajax-post-loader.php

    r3383449 r3399506  
    55* Text Domain: quick-ajax-post-loader
    66* Domain Path: /languages
    7 * Version: 1.8.4
     7* Version: 1.8.5
    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

    r3383449 r3399506  
    55Requires at least: 5.6
    66Tested up to: 6.8
    7 Stable tag: 1.8.4
     7Stable tag: 1.8.5
    88Requires PHP: 7.4
    99License: GPLv2 or later
     
    106106== Changelog ==
    107107
     108= 1.8.5 - 2025-11-20 =
     109- Refactored internal AJAX rendering logic for improved structure and maintainability.
     110- Improved internal code organization for better stability and future development.
     111- Applied backend optimizations to reduce redundancy and improve overall performance.
     112- Performed minor cleanups across related core classes.
     113
    108114= 1.8.4 - 2025-10-23 =
    109115- Fixed issue with multiple initial post loaders not triggering correctly on the same page.
Note: See TracChangeset for help on using the changeset viewer.