Changeset 3399506
- Timestamp:
- 11/20/2025 08:21:07 AM (4 months ago)
- Location:
- quick-ajax-post-loader/trunk
- Files:
-
- 7 added
- 3 deleted
- 13 edited
-
includes/admin/cpt/class-cpt-editor-form.php (modified) (1 diff)
-
includes/admin/pages/class-admin-options-page-form.php (modified) (1 diff)
-
includes/ajax (deleted)
-
includes/ajax-controller (added)
-
includes/ajax-controller/class-ajax-action-controller.php (added)
-
includes/ajax-controller/class-ajax-controller.php (added)
-
includes/ajax-render/class-ajax-controller.php (deleted)
-
includes/ajax-render/class-ajax-end-message-renderer.php (added)
-
includes/ajax-render/class-ajax-helper.php (modified) (1 diff)
-
includes/ajax-render/class-ajax-layout-builder.php (added)
-
includes/ajax-render/class-ajax-layout-renderer.php (modified) (5 diffs)
-
includes/ajax-render/class-ajax-load-more-renderer.php (added)
-
includes/ajax-render/class-ajax-query-builder.php (modified) (3 diffs)
-
includes/ajax-render/class-ajax-render-handler.php (deleted)
-
includes/ajax-render/class-ajax-ui-renderer.php (modified) (12 diffs)
-
includes/class-plugin-starter.php (modified) (1 diff)
-
includes/form/class-form-content-builder.php (modified) (1 diff)
-
includes/form/class-form-helper.php (added)
-
includes/resources/class-constants.php (modified) (1 diff)
-
includes/resources/class-resource-manager.php (modified) (2 diffs)
-
includes/template-renderers/class-template-hooks.php (modified) (1 diff)
-
quick-ajax-post-loader.php (modified) (1 diff)
-
readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
quick-ajax-post-loader/trunk/includes/admin/cpt/class-cpt-editor-form.php
r3369893 r3399506 50 50 $this->unserialize_data($post->ID); 51 51 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()); 53 53 wp_nonce_field(QAPL_Quick_Ajax_Constants::NONCE_FORM_QUICK_AJAX_ACTION, QAPL_Quick_Ajax_Constants::NONCE_FORM_QUICK_AJAX_FIELD); 54 54 echo '</div>'; -
quick-ajax-post-loader/trunk/includes/admin/pages/class-admin-options-page-form.php
r3369893 r3399506 74 74 echo '<div class="wrap">'; 75 75 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()); 77 77 echo '</div>'; 78 78 echo '<div class="quick-ajax-form-wrap ' . esc_attr($this->get_quick_ajax_form_class()) . '" id="form-' . esc_attr($this->option_group) . '">'; 79 79 //echo '<form method="post" action="options.php">'; 80 80 //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()); 83 83 //echo '</form>'; 84 84 echo '</div>'; -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-helper.php
r3383449 r3399506 30 30 return $data; 31 31 } 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; 35 49 } 36 50 } -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-layout-renderer.php
r3383449 r3399506 7 7 private $file_manager; 8 8 private $ui_renderer; 9 private $load_more_renderer; 10 private $helper; 9 11 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; 13 17 } 14 18 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)) { 68 21 return false; 69 22 } 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'] ?? []); 72 25 73 $query = new WP_Query($ args);26 $query = new WP_Query($query_args); 74 27 //$this->attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $this->quick_ajax_id; 75 28 //$layout_quick_ajax_id = esc_attr($this->attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID]); … … 85 38 $class_inner_container .= ' '.$layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_CONTAINER_CLASS]; 86 39 } 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); 89 42 ob_start(); 90 43 // Start output buffering … … 106 59 $attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $quick_ajax_id; 107 60 } 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>'; 109 62 } else { 110 63 while ($query->have_posts()) { … … 143 96 144 97 //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); 146 101 } 147 102 do_action(QAPL_Quick_Ajax_Constants::HOOK_POSTS_CONTAINER_END, $quick_ajax_id); … … 156 111 return $output; // Return the content 157 112 } 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 set174 // if we want to add a different number of posts than displayed at the start175 // 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 page178 $initial_offset = isset($load_more_args['offset']) ? intval($load_more_args['offset']) : 0;179 //get number of posts per page180 $posts_per_page = intval($load_more_args['posts_per_page']);181 182 //old logic183 //if post_found smaller than initial offset and post per page184 //if ($found_posts <= $initial_offset + $posts_per_page) {185 // return false;186 //}187 //new logic188 $shown_posts = $initial_offset + $post_count;189 if ($found_posts <= $shown_posts) {190 return false;191 }192 // Update offset193 $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 load197 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 anything228 }229 if ($load_more) {230 return ''; // load more still available, don't show anything231 }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 separators250 $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 digit254 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 digit257 unset($class_container_array[$key]);258 }259 }260 $container_class = implode(' ', $class_container_array);261 return $container_class;262 }263 113 } -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-query-builder.php
r3383449 r3399506 10 10 return $this->quick_ajax_id; 11 11 } 12 public function wp_query_args($ args, $attributes = false){12 public function wp_query_args($source_args, $attributes = false){ 13 13 // sanitize and normalize input 14 $ args = $this->normalize_args($args);14 $source_args = $this->normalize_args($source_args); 15 15 16 16 $this->generate_block_id($attributes); 17 17 18 18 //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); 20 20 //$this->action_args = $this->input_args; 21 21 22 22 // 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); 24 24 25 25 $query_args['post_status'] = QAPL_Quick_Ajax_Constants::QUERY_SETTING_SELECT_POST_STATUS_DEFAULT; … … 36 36 37 37 /* 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']; 40 40 } 41 41 */ … … 67 67 return $int_array; 68 68 } 69 private function normalize_args($ args) {69 private function normalize_args($source_args) { 70 70 // 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']); 73 73 } 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']); 76 76 } 77 return $ args;77 return $source_args; 78 78 } 79 private function initialize_query_args($ args) {79 private function initialize_query_args($source_args) { 80 80 // 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); 84 84 return $query_args; 85 85 } 86 private function query_args_base_query_args($ args) {86 private function query_args_base_query_args($source_args) { 87 87 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, 95 95 ]; 96 96 } 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) { 98 98 // 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'])) { 100 100 // 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']); 102 102 unset($query_args['paged']); 103 103 } 104 104 return $query_args; 105 105 } 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'] : []; 109 109 110 110 if ($taxonomy && !empty($terms)) { -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-ui-renderer.php
r3383449 r3399506 7 7 private $file_manager; 8 8 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; 13 15 } 14 16 private function get_post_assigned_to_the_term($term, $post_type, $excluded_post_ids){ 15 $ args = array(17 $query_args = array( 16 18 'posts_per_page' => 1, 17 19 'post_type' => $post_type, … … 27 29 'fields' => 'ids', 28 30 ); 29 $posts = get_posts($ args);31 $posts = get_posts($query_args); 30 32 31 33 if (!empty($posts)) { … … 38 40 * 39 41 * 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. 41 43 * The 'selected_taxonomy' exists only if a taxonomy has been chosen. 42 44 * If a taxonomy has been chosen, the filter will be rendered. … … 44 46 * so this method should also accommodate such a scenario if implemented. 45 47 */ 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)) { 48 50 return false; 49 51 } 50 52 if(!$taxonomy){ 51 $taxonomy = $ input_args['selected_taxonomy'];53 $taxonomy = $source_args['selected_taxonomy']; 52 54 } 53 55 54 56 $terms_args = array( 55 57 'taxonomy' => $taxonomy, 56 'object_type' => array($ args['post_type']),58 'object_type' => array($query_args['post_type']), 57 59 'hide_empty' => true, 58 60 ); 59 61 // 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']; 62 64 } 63 65 $terms = get_terms($terms_args); … … 71 73 $class_container .= ' ' . $layout[QAPL_Quick_Ajax_Constants::ATTRIBUTE_TAXONOMY_FILTER_CLASS]; 72 74 } 73 $container_class = $this-> extract_classes_from_string($class_container);75 $container_class = $this->helper->extract_classes_from_string($class_container); 74 76 75 77 ob_start(); // Start output buffering … … 94 96 'button_label' => $show_all_label, 95 97 'data-button' => $button_base['data-button'], 96 'data-action' => $ action_args,98 'data-action' => $source_args, 97 99 'data-attributes' => $button_base['data-attributes'], 98 100 ]; 99 101 $show_all_button['is_active'] = true; 100 102 $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'] : ''; 102 104 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); 104 106 if($not_empty == true){ 105 $data_action = $ action_args;107 $data_action = $source_args; 106 108 $data_action['selected_terms'] = [$term->term_id]; 107 109 $term_button_data = [ … … 133 135 return $output; // Return the content 134 136 } 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) { 136 139 $block_id = 'quick-ajax-sort-options-'.$quick_ajax_id; 137 140 $class_container = 'quick-ajax-sort-options-container'; … … 139 142 $class_container .= ' quick-ajax-theme'; 140 143 } 141 $container_class = $this-> extract_classes_from_string($class_container);144 $container_class = $this->helper->extract_classes_from_string($class_container); 142 145 $sort_buttons =''; 143 146 $allowed_button_html = [ … … 210 213 'options' => $filtered_orderby_options 211 214 ]; 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); 213 216 } 214 217 echo wp_kses($sort_buttons, $allowed_button_html); … … 219 222 return $output; // Return the content 220 223 } 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) { 222 225 $attributes[QAPL_Quick_Ajax_Constants::ATTRIBUTE_QUICK_AJAX_ID] = $quick_ajax_id; 223 226 $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']); 225 228 // escape the aria-label 226 229 $aria_label = isset($button_data['label']) ? esc_attr($button_data['label']) : ''; … … 233 236 } 234 237 $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>'; 236 239 $sort_option .= '</div>'; 237 240 return $sort_option; … … 323 326 return $modified_content; 324 327 } 325 private function extract_classes_from_string($string){326 // Split the input string into an array using whitespace or comma as separators327 $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 digit331 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 digit334 unset($class_container_array[$key]);335 }336 }337 $container_class = implode(' ', $class_container_array);338 return $container_class;339 }340 328 } -
quick-ajax-post-loader/trunk/includes/class-plugin-starter.php
r3383449 r3399506 23 23 'QAPL_Quick_Ajax_Utilities', 24 24 'QAPL_Quick_Ajax_Enqueue_Handler', 25 'QAPL_Form_Helper', 25 26 'QAPL_Quick_Ajax_Form_Field', 26 27 'QAPL_Quick_Ajax_Form_Field_Builder', -
quick-ajax-post-loader/trunk/includes/form/class-form-content-builder.php
r3369893 r3399506 320 320 </div>'; 321 321 } 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 }438 322 } -
quick-ajax-post-loader/trunk/includes/resources/class-constants.php
r3383449 r3399506 6 6 class QAPL_Quick_Ajax_Constants{ 7 7 // Plugin info 8 public const PLUGIN_VERSION = '1.8. 4';8 public const PLUGIN_VERSION = '1.8.5'; 9 9 public const PLUGIN_NAME = 'Quick Ajax Post Loader'; 10 10 public const PLUGIN_TEXT_DOMAIN = 'quick-ajax-post-loader'; -
quick-ajax-post-loader/trunk/includes/resources/class-resource-manager.php
r3383449 r3399506 35 35 private const COMPONENT_FILES = [ 36 36 //form 37 'class-form-helper' => 'includes/form/class-form-helper.php', //form helper functions 37 38 'interface-form-field' => 'includes/form/interface-form-field.php', //interface for form field 38 39 'class-form-field' => 'includes/form/class-form-field.php', //final form field object … … 46 47 'class-shortcode-query-args' => 'includes/shortcode/handlers/class-shortcode-query-args-provider.php', 47 48 '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 50 51 'class-ajax-helper' => 'includes/ajax-render/class-ajax-helper.php', 51 52 'class-ajax-query-builder' => 'includes/ajax-render/class-ajax-query-builder.php', 52 53 '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', 57 61 //template-renderers 58 62 'template-renderers' => 'includes/template-renderers/class-template-hooks.php', -
quick-ajax-post-loader/trunk/includes/template-renderers/class-template-hooks.php
r3358086 r3399506 239 239 public function render_load_more_button() { 240 240 $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>'; 242 242 return apply_filters(QAPL_Quick_Ajax_Constants::HOOK_TEMPLATE_LOAD_MORE_BUTTON, $output, $this->quick_ajax_id); 243 243 } -
quick-ajax-post-loader/trunk/quick-ajax-post-loader.php
r3383449 r3399506 5 5 * Text Domain: quick-ajax-post-loader 6 6 * Domain Path: /languages 7 * Version: 1.8. 47 * Version: 1.8.5 8 8 * Description: Supercharge post loading with Quick Ajax Post Loader. Enhance user experience and optimize site performance using AJAX technology. 9 9 * Author: Pawel Grzelkowski -
quick-ajax-post-loader/trunk/readme.txt
r3383449 r3399506 5 5 Requires at least: 5.6 6 6 Tested up to: 6.8 7 Stable tag: 1.8. 47 Stable tag: 1.8.5 8 8 Requires PHP: 7.4 9 9 License: GPLv2 or later … … 106 106 == Changelog == 107 107 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 108 114 = 1.8.4 - 2025-10-23 = 109 115 - Fixed issue with multiple initial post loaders not triggering correctly on the same page.
Note: See TracChangeset
for help on using the changeset viewer.