Changeset 3476983
- Timestamp:
- 03/07/2026 09:54:04 AM (4 weeks ago)
- Location:
- quick-ajax-post-loader/trunk
- Files:
-
- 18 edited
-
includes/admin/cpt/creator/class-creator-form.php (modified) (2 diffs)
-
includes/admin/pages/settings/tabs/class-settings-tab-php-snippet.php (modified) (4 diffs)
-
includes/ajax-controller/class-ajax-frontend-controller.php (modified) (1 diff)
-
includes/ajax-render/class-ajax-filter-menu-renderer.php (modified) (4 diffs)
-
includes/ajax-render/class-ajax-frontend-render.php (modified) (4 diffs)
-
includes/ajax-render/class-ajax-layout-builder.php (modified) (1 diff)
-
includes/ajax-render/class-ajax-layout-renderer.php (modified) (1 diff)
-
includes/ajax-render/class-ajax-query-builder.php (modified) (2 diffs)
-
includes/enqueue/class-enqueue-handler.php (modified) (1 diff)
-
includes/form/class-form-field-factory.php (modified) (1 diff)
-
includes/resources/class-constants.php (modified) (3 diffs)
-
includes/shortcode/class-shortcode.php (modified) (1 diff)
-
includes/shortcode/handlers/class-shortcode-ajax-attributes-provider.php (modified) (3 diffs)
-
includes/shortcode/handlers/class-shortcode-params-handler.php (modified) (3 diffs)
-
js/admin-script.js (modified) (1 diff)
-
js/admin-script.min.js (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/creator/class-creator-form.php
r3448095 r3476983 15 15 $field = QAPL_Form_Field_Factory::build_select_taxonomy_field(); 16 16 $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); 17 20 //manual term selection checkbox 18 21 $field = QAPL_Form_Field_Factory::build_manual_term_selection_field(); … … 111 114 $shortcode_page .= $this->add_field(QAPL_Constants::QUERY_SETTING_SELECT_TAXONOMY, $field_options); 112 115 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 113 125 // manual term selection checkbox 114 126 $field_options = $this->field_options([ -
quick-ajax-post-loader/trunk/includes/admin/pages/settings/tabs/class-settings-tab-php-snippet.php
r3448095 r3476983 20 20 //select taxonomy 21 21 $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(); 22 25 $this->settings_page->register_field($field); 23 26 //manual term selection checkbox … … 104 107 $form_tab_function_generator .= '<h4>'.__('General Settings', 'quick-ajax-post-loader').'</h4>'; 105 108 $form_tab_function_generator .= $this->settings_page->render_field(QAPL_Constants::QUERY_SETTING_SELECT_POST_TYPE); 109 106 110 //show taxonomy checkbox 107 111 $field_options = $this->settings_page->field_options_wrapper([ … … 109 113 ]); 110 114 $form_tab_function_generator .= $this->settings_page->render_field(QAPL_Constants::QUERY_SETTING_SHOW_TAXONOMY_FILTER, $field_options); 115 111 116 //taxonomy select option 112 117 $this->settings_page->update_field_options(QAPL_Constants::QUERY_SETTING_SELECT_TAXONOMY,$this->settings_page->get_taxonomy_options()); … … 118 123 ]); 119 124 $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 120 135 // manual term selection checkbox 121 136 $field_options = $this->settings_page->field_options_wrapper([ -
quick-ajax-post-loader/trunk/includes/ajax-controller/class-ajax-frontend-controller.php
r3458287 r3476983 24 24 $layout_builder = new QAPL_Ajax_Layout_Builder($file_manager, $helper); 25 25 $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); 27 27 $end_posts_renderer = new QAPL_Ajax_End_Message_Renderer($file_manager); 28 28 -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-filter-menu-renderer.php
r3458287 r3476983 67 67 $terms_args['include'] = $source_args['selected_terms']; 68 68 } 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 } 70 74 71 75 $block_id = 'quick-ajax-filter-'.$quick_ajax_id; … … 78 82 } 79 83 $container_class = $this->helper->extract_classes_from_string($class_container); 80 if (!$this->should_render_filter_menu(count($terms))) {81 return '';82 }83 84 ob_start(); // Start output buffering 84 85 … … 86 87 echo '<div id="'.esc_attr($block_id).'" class="'.esc_attr($container_class).'">'; 87 88 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){ 97 100 $show_all_label = $this->global_options['show_all_label'] ?? __('Show All', 'quick-ajax-post-loader'); 98 101 $show_all_button = [ … … 104 107 'data-action' => $source_args, 105 108 'data-attributes' => $button_base['data-attributes'], 109 'is_active' => true, 106 110 ]; 107 $show_all_button['is_active'] = true;108 111 $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; 125 134 } 135 $navigation_buttons[] = $term_button_data; 126 136 } 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 135 146 do_action(QAPL_Constants::HOOK_FILTER_CONTAINER_END, $quick_ajax_id); 136 147 echo '</div>'; -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-frontend-render.php
r3458287 r3476983 13 13 private $layout_builder; 14 14 15 16 15 public function __construct() { 17 16 $this->global_options = get_option(QAPL_Constants::GLOBAL_OPTIONS_NAME, []); … … 23 22 $this->load_more_renderer = new QAPL_Ajax_Load_More_Renderer($this->file_manager, $this->ui_renderer, $this->helper); 24 23 $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 args28 $query_args = $this->query_builder->wp_query_args($source_args, $attributes);29 if (!$query_args) {30 return false;31 }32 // build layout33 $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;42 24 } 43 25 … … 52 34 $ajax_initial_load = $context['ajax_initial']; 53 35 $quick_ajax_id = $context['quick_ajax_id']; 54 55 36 56 37 ob_start(); … … 106 87 return $this->ui_renderer->render_sort_options($sort_options, $layout, $query_args, $attrs, $source_args, $quick_ajax_id); 107 88 } 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 } 108 106 } -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-layout-builder.php
r3409927 r3476983 57 57 } 58 58 $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 } 60 63 return [ 61 64 'layout' => $layout, -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-layout-renderer.php
r3438871 r3476983 1 <?php 1 <?php 2 2 if (!defined('ABSPATH')) { 3 3 exit; -
quick-ajax-post-loader/trunk/includes/ajax-render/class-ajax-query-builder.php
r3438871 r3476983 46 46 return !empty($value) || $value === 0 || $value === '0'; 47 47 }); 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); 48 51 $query_args = apply_filters(QAPL_Constants::HOOK_MODIFY_POSTS_QUERY_ARGS, $query_args, $this->quick_ajax_id); 49 52 … … 53 56 return $query_args; 54 57 } 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; 55 95 } 56 96 private function sanitize_to_int_array($value) { -
quick-ajax-post-loader/trunk/includes/enqueue/class-enqueue-handler.php
r3438871 r3476983 106 106 'quick_ajax_taxonomy' => QAPL_Constants::QUERY_SETTING_SELECT_TAXONOMY, 107 107 'quick_ajax_manual_selected_terms' => QAPL_Constants::QUERY_SETTING_SELECTED_TERMS, 108 'display_show_all_button' => QAPL_Constants::ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON, 108 109 'quick_ajax_css_style' => QAPL_Constants::ATTRIBUTE_QUICK_AJAX_CSS_STYLE, 109 110 'grid_num_columns' => QAPL_Constants::ATTRIBUTE_GRID_NUM_COLUMNS, -
quick-ajax-post-loader/trunk/includes/form/class-form-field-factory.php
r3438871 r3476983 57 57 return $builder->build(); 58 58 } 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 } 59 72 //manual selected terms multiselect 60 73 public static function build_manual_selected_terms_field(): QAPL_Form_Field_Interface { -
quick-ajax-post-loader/trunk/includes/resources/class-constants.php
r3458287 r3476983 6 6 class QAPL_Constants{ 7 7 // Plugin info 8 public const PLUGIN_VERSION = '1.8. 9';8 public const PLUGIN_VERSION = '1.8.10'; 9 9 public const PLUGIN_NAME = 'Quick Ajax Post Loader'; 10 10 public const PLUGIN_TEXT_DOMAIN = 'quick-ajax-post-loader'; … … 115 115 public const LAYOUT_SETTING_SELECT_LOADER_ICON_DEFAULT = 'loader-icon'; 116 116 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 117 120 // Ajax settings 118 121 public const AJAX_SETTING_AJAX_INITIAL_LOAD = 'ajax_initial_load'; … … 129 132 public const ATTRIBUTE_AJAX_INFINITE_SCROLL = 'infinite_scroll'; 130 133 public const ATTRIBUTE_SHOW_END_MESSAGE = 'show_end_message'; 134 public const ATTRIBUTE_DISPLAY_SHOW_ALL_BUTTON = 'display_show_all_button'; 131 135 132 136 // Quick AJAX settings -
quick-ajax-post-loader/trunk/includes/shortcode/class-shortcode.php
r3438871 r3476983 3 3 exit; 4 4 } 5 6 7 5 8 6 class QAPL_Shortcode { -
quick-ajax-post-loader/trunk/includes/shortcode/handlers/class-shortcode-ajax-attributes-provider.php
r3409927 r3476983 78 78 'postmeta_key' => QAPL_Constants::QUERY_SETTING_SHOW_END_MESSAGE, 79 79 '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; 82 88 } 83 84 89 private function get_sanitized_attribute(array $config) { 85 90 /** … … 97 102 $meta_key = $config['postmeta_key'] ?? null; 98 103 $type = $config['type'] ?? 'string'; 104 $default = $config['default'] ?? null; 99 105 $only_if_meta_key_true = $config['only_if_meta_key_true'] ?? null; 100 106 $value = null; 101 107 102 108 // 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)) { 104 110 $value = $this->shortcode_params[$shortcode_key]; 105 111 // 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)) { 107 113 // check if additional meta key condition is required 108 if ( !empty($only_if_meta_key_true)) {114 if ($only_if_meta_key_true !== null) { 109 115 if (!empty($this->shortcode_postmeta[$only_if_meta_key_true])) { 110 116 $value = $this->shortcode_postmeta[$meta_key]; … … 118 124 // return default empty value if value is still null 119 125 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 } 121 131 } 122 132 // sanitize value based on type -
quick-ajax-post-loader/trunk/includes/shortcode/handlers/class-shortcode-params-handler.php
r3383449 r3476983 3 3 exit; 4 4 } 5 5 6 class QAPL_Shortcode_Params_Handler { 6 7 public static function get_params($params) { … … 13 14 'orderby' => '', 14 15 'sort_options' => '', 16 'display_show_all_button' => '', 15 17 'quick_ajax_css_style' => '', 16 18 'grid_num_columns' => '', … … 30 32 //retain only the keys that match the defaults 31 33 $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 //} 60 110 //return sanitized data 61 111 return $params; -
quick-ajax-post-loader/trunk/js/admin-script.js
r3458287 r3476983 359 359 let formattedItem = ""; 360 360 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 } 361 364 if (inputData.qapl_layout_quick_ajax_css_style === 1) { 362 365 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 5 5 * Text Domain: quick-ajax-post-loader 6 6 * Domain Path: /languages 7 * Version: 1.8. 97 * Version: 1.8.10 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
r3458287 r3476983 5 5 Requires at least: 5.6 6 6 Tested up to: 6.9 7 Stable tag: 1.8. 97 Stable tag: 1.8.10 8 8 Requires PHP: 7.4 9 9 License: GPLv2 or later … … 106 106 == Changelog == 107 107 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 108 115 = 1.8.9 - 2026-02-10 = 109 116 - Optimized post item image rendering to improve frontend performance.
Note: See TracChangeset
for help on using the changeset viewer.