Changeset 3275104
- Timestamp:
- 04/16/2025 07:52:08 PM (12 months ago)
- Location:
- quick-ajax-post-loader/trunk
- Files:
-
- 12 edited
-
DEVELOPER_GUIDE.md (modified) (9 diffs)
-
admin/pages/help/help_en_US.json (modified) (4 diffs)
-
admin/pages/settings-page.php (modified) (2 diffs)
-
css/style.css (modified) (2 diffs)
-
css/style.min.css (modified) (1 diff)
-
inc/actions.php (modified) (2 diffs)
-
inc/class-ajax.php (modified) (2 diffs)
-
inc/class-helper.php (modified) (6 diffs)
-
inc/class-template-hooks.php (modified) (8 diffs)
-
quick-ajax-post-loader.php (modified) (2 diffs)
-
readme.txt (modified) (3 diffs)
-
templates/post-items/no-posts.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
quick-ajax-post-loader/trunk/DEVELOPER_GUIDE.md
r3269883 r3275104 41 41 - 4.7. [Hooks: Modify Template Elements](#47-hooks-modify-template-elements) 42 42 - 4.8. [Hooks: Modifying Post Content Elements](#48-hooks-modifying-post-content-elements) 43 - 4.9. [Hooks: Customize Load More Button HTML & Styling](#49-hooks-customize-load-more-button-html--styling)43 - 4.9. [Hooks: Customize "No Posts Found" Message](#49-hooks-customize-no-posts-found-message) 44 44 - 4.10. [Hooks: Customize End of Posts Message](#410-hooks-customize-end-of-posts-message) 45 - 4.11. [Debugging: Find & Log quick_ajax_id for AJAX Hooks](#411-debugging-find--log-quick_ajax_id-for-ajax-hooks) 46 - 4.12. [Best Practices for Hooks and Filters](#412-best-practices-for-hooks-and-filters) 45 - 4.11. [Hooks: Customize Load More Button HTML & Styling](#411-hooks-customize-load-more-button-html--styling) 46 - 4.12. [Debugging: Find & Log quick_ajax_id for AJAX Hooks](#412-debugging-find--log-quick_ajax_id-for-ajax-hooks) 47 - 4.13. [Best Practices for Hooks and Filters](#413-best-practices-for-hooks-and-filters) 47 48 5. [Advanced Features](#5-advanced-features) 48 49 - 5.1. [AJAX Function Generator](#51-ajax-function-generator) … … 257 258 #### Example File Structure 258 259 259 <div class="qapl-no-posts ">260 <div class="qapl-no-posts-found"> 260 261 <p>Sorry, no posts found to display.</p> 261 262 </div> … … 415 416 416 417 function my_filter_container_before( $quick_ajax_id ) { 417 if ( $quick_ajax_id === ' example_id' ) {418 if ( $quick_ajax_id === 'p963' ) { 418 419 echo '<div class="custom-filter-header">My Custom Filter Section</div>'; 419 420 } … … 543 544 544 545 function modify_query_args( $args, $quick_ajax_id ) { 545 if ($quick_ajax_id === ' some_specific_id') {546 if ($quick_ajax_id === 'p963') { 546 547 $args['posts_per_page'] = 5; // change posts per page to 5 547 548 } … … 568 569 569 570 function modify_sorting_options_variants( $sorting_options, $quick_ajax_id ) { 570 if ($quick_ajax_id === 'p 369') {571 if ($quick_ajax_id === 'p963') { 571 572 $sorting_options[] = [ 572 573 'orderby' => 'modified', … … 598 599 function modify_filter_buttons( $buttons, $quick_ajax_id ) { 599 600 foreach ($buttons as &$button) { 600 if ($quick_ajax_id === ' some_specific_id') {601 if ($quick_ajax_id === 'p963') { 601 602 if ($button['term_id'] === 'none') { 602 603 $button['button_label'] = 'View All'; … … 749 750 --- 750 751 751 ### 4.9. Hooks: Customize Load More Button HTML & Styling 752 ### 4.9. Hooks: Customize "No Posts Found" Message 753 754 Customize the **"No Posts Found" message** displayed when there are no posts to show initially (e.g., after filtering). 755 756 #### **qapl_template_no_post_message** 757 758 Modify the HTML output for the message shown when no posts match the filter or query. 759 760 **Parameters:** 761 - `$output` *(string)* - the default message HTML output. 762 - `$quick_ajax_id` *(string)* - unique instance identifier. 763 764 **Example:** 765 766 function customize_no_post_message( $output, $quick_ajax_id ) { 767 if ( $quick_ajax_id === 'p963' ) { 768 $output = '<div class="custom-no-posts-found"><p>Nothing to display</p></div>'; 769 } 770 return $output; 771 } 772 add_filter( 'qapl_template_no_post_message', 'customize_no_post_message', 10, 2 ); 773 774 This example replaces the **default "No Posts Found" message** with a custom message for a specific instance. 775 776 --- 777 778 ### 4.10. Hooks: Customize End of Posts Message 779 780 Customize the **"End of Posts" message** displayed when all posts have been loaded and there are no more items to show. 781 782 #### **qapl_template_end_post_message** 783 784 Modify the HTML output for the final message shown when no more posts are available to load. 785 786 **Parameters:** 787 - `$output` *(string)* - the default message HTML output. 788 - `$quick_ajax_id` *(string)* - unique instance identifier. 789 790 **Example:** 791 792 function customize_end_post_message( $output, $quick_ajax_id ) { 793 $output = '<div class="custom-end-message"><p>That\'s all we have for now!</p></div>'; 794 return $output; 795 } 796 add_filter( 'qapl_template_end_post_message', 'customize_end_post_message', 10, 2 ); 797 798 This example replaces the **default "End of Posts" message** with a custom-styled HTML block. 799 800 --- 801 802 ### 4.11. Hooks: Customize Load More Button HTML & Styling 752 803 753 804 Customize the **"Load More" button** styling and behavior. … … 773 824 --- 774 825 775 ### 4.10. Hooks: Customize End of Posts Message 776 777 Customize the **"End of Posts" message** displayed when all posts have been loaded and there are no more items to show. 778 779 #### **qapl_template_end_post_message** 780 781 Modify the HTML output for the final message shown when no more posts are available to load. 782 783 **Parameters:** 784 - `$output` *(string)* - the default message HTML output. 785 - `$template_name` *(string)* - the template type used. 786 - `$quick_ajax_id` *(string)* - unique instance identifier. 787 788 **Example:** 789 790 function customize_end_post_message( $output, $quick_ajax_id ) { 791 $output = '<div class="custom-end-message"><p>That\'s all we have for now!</p></div>'; 792 return $output; 793 } 794 add_filter( 'qapl_template_end_post_message', 'customize_end_post_message', 10, 2 ); 795 796 This example replaces the **default "End of Posts" message** with a custom-styled HTML block. 797 798 --- 799 800 ### 4.11. Debugging: Find & Log quick_ajax_id for AJAX Hooks 826 ### 4.12. Debugging: Find & Log quick_ajax_id for AJAX Hooks 801 827 802 828 Each **quick_ajax_id** is unique to an instance of the **Quick Ajax Post Loader** shortcode. It is needed when using hooks and filters to apply changes to a specific shortcode instance. … … 860 886 --- 861 887 862 ### 4.1 2. Best Practices for Hooks and Filters888 ### 4.13. Best Practices for Hooks and Filters 863 889 864 890 To ensure safe and effective modifications to the **Quick Ajax Post Loader**, follow these best practices: -
quick-ajax-post-loader/trunk/admin/pages/help/help_en_US.json
r3269883 r3275104 14 14 "3_custom_no_posts_template": { 15 15 "title": "<h4>Templates: Customize "No Posts Found" Message</h4>", 16 "content": "<p>By default, if no posts match the AJAX query, the plugin displays a <strong>"No Posts Found"</strong> message. You can customize this message by creating a custom template file.</p>\n<h4>Template File Location</h4>\n<p>Place a file named <strong>no-posts.php</strong> in the following directory:</p>\n<pre><code class=\"no-background\">wp-content/themes/your-theme/quick-ajax-post-loader/templates/post-items/\n</code></pre>\n<h4>Example File Structure</h4>\n<pre><code class=\"no-background\"><div class="qapl-no-posts ">\n <p>Sorry, no posts found to display.</p>\n</div>\n</code></pre>"16 "content": "<p>By default, if no posts match the AJAX query, the plugin displays a <strong>"No Posts Found"</strong> message. You can customize this message by creating a custom template file.</p>\n<h4>Template File Location</h4>\n<p>Place a file named <strong>no-posts.php</strong> in the following directory:</p>\n<pre><code class=\"no-background\">wp-content/themes/your-theme/quick-ajax-post-loader/templates/post-items/\n</code></pre>\n<h4>Example File Structure</h4>\n<pre><code class=\"no-background\"><div class="qapl-no-posts-found">\n <p>Sorry, no posts found to display.</p>\n</div>\n</code></pre>" 17 17 }, 18 18 "3_custom_end_of_posts_template": { … … 38 38 "4_filter_container_hooks": { 39 39 "title": "<h4>Hooks: Filter Container - Modify the Filtering Section</h4>", 40 "content": "<p>Filter container hooks allow you to insert custom elements within the filter section of the plugin interface. These hooks provide flexibility to enhance filtering options or add additional UI components.</p>\n<p>Below is a list of available hooks and their usage.</p>\n<h4><strong>qapl_filter_container_before</strong></h4>\n<p>Triggered just before rendering the filter container.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - the unique identifier of the plugin instance.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function my_filter_container_before( $quick_ajax_id ) {\n if ( $quick_ajax_id === ' example_id' ) {\n echo '<div class="custom-filter-header">My Custom Filter Section</div>';\n }\n}\nadd_action( 'qapl_filter_container_before', 'my_filter_container_before', 10, 1 );\n</code></pre>\n<h4><strong>qapl_filter_container_start</strong></h4>\n<p>Triggered at the beginning of the filter container rendering.</p>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function my_filter_container_start( $quick_ajax_id ) {\n echo '<div class="custom-filter-start">Start of the filter container</div>';\n}\nadd_action( 'qapl_filter_container_start', 'my_filter_container_start', 10, 1 );\n</code></pre>\n<h4><strong>qapl_filter_container_end</strong></h4>\n<p>Triggered just before finishing the rendering of the filter container.</p>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function my_filter_container_end( $quick_ajax_id ) {\n echo '<div class="custom-filter-end">End of the filter container</div>';\n}\nadd_action( 'qapl_filter_container_end', 'my_filter_container_end', 10, 1 );\n</code></pre>\n<h4><strong>qapl_filter_container_after</strong></h4>\n<p>Triggered immediately after rendering the filter container.</p>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function my_filter_container_after( $quick_ajax_id ) {\n echo '<div class="custom-filter-after">After the filter container</div>';\n}\nadd_action( 'qapl_filter_container_after', 'my_filter_container_after', 10, 1 );\n</code></pre>"40 "content": "<p>Filter container hooks allow you to insert custom elements within the filter section of the plugin interface. These hooks provide flexibility to enhance filtering options or add additional UI components.</p>\n<p>Below is a list of available hooks and their usage.</p>\n<h4><strong>qapl_filter_container_before</strong></h4>\n<p>Triggered just before rendering the filter container.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - the unique identifier of the plugin instance.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function my_filter_container_before( $quick_ajax_id ) {\n if ( $quick_ajax_id === 'p963' ) {\n echo '<div class="custom-filter-header">My Custom Filter Section</div>';\n }\n}\nadd_action( 'qapl_filter_container_before', 'my_filter_container_before', 10, 1 );\n</code></pre>\n<h4><strong>qapl_filter_container_start</strong></h4>\n<p>Triggered at the beginning of the filter container rendering.</p>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function my_filter_container_start( $quick_ajax_id ) {\n echo '<div class="custom-filter-start">Start of the filter container</div>';\n}\nadd_action( 'qapl_filter_container_start', 'my_filter_container_start', 10, 1 );\n</code></pre>\n<h4><strong>qapl_filter_container_end</strong></h4>\n<p>Triggered just before finishing the rendering of the filter container.</p>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function my_filter_container_end( $quick_ajax_id ) {\n echo '<div class="custom-filter-end">End of the filter container</div>';\n}\nadd_action( 'qapl_filter_container_end', 'my_filter_container_end', 10, 1 );\n</code></pre>\n<h4><strong>qapl_filter_container_after</strong></h4>\n<p>Triggered immediately after rendering the filter container.</p>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function my_filter_container_after( $quick_ajax_id ) {\n echo '<div class="custom-filter-after">After the filter container</div>';\n}\nadd_action( 'qapl_filter_container_after', 'my_filter_container_after', 10, 1 );\n</code></pre>" 41 41 }, 42 42 "4_post_container_hooks": { … … 50 50 "4_modify_posts_query": { 51 51 "title": "<h4>Hooks: Modify WP_Query Parameters for AJAX Requests</h4>", 52 "content": "<p>Query modification hooks allow you to <strong>customize the post retrieval process</strong> by altering WP_Query arguments before the AJAX request is executed. This enables fine-grained control over which posts are displayed.</p>\n<h4><strong>qapl_modify_posts_query_args</strong></h4>\n<p>This filter allows you to modify <strong>WP_Query</strong> arguments to fully control the data retrieved by AJAX requests.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$args</code> <em>(array)</em> - original query arguments.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function modify_query_args( $args, $quick_ajax_id ) {\n if ($quick_ajax_id === ' some_specific_id') {\n $args['posts_per_page'] = 5; // change posts per page to 5\n }\n return $args;\n}\nadd_filter( 'qapl_modify_posts_query_args', 'modify_query_args', 10, 2 );\n</code></pre>\n<p>This example shows how to change the number of posts per page to <strong>5</strong>, using a specific AJAX identifier.</p>"52 "content": "<p>Query modification hooks allow you to <strong>customize the post retrieval process</strong> by altering WP_Query arguments before the AJAX request is executed. This enables fine-grained control over which posts are displayed.</p>\n<h4><strong>qapl_modify_posts_query_args</strong></h4>\n<p>This filter allows you to modify <strong>WP_Query</strong> arguments to fully control the data retrieved by AJAX requests.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$args</code> <em>(array)</em> - original query arguments.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function modify_query_args( $args, $quick_ajax_id ) {\n if ($quick_ajax_id === 'p963') {\n $args['posts_per_page'] = 5; // change posts per page to 5\n }\n return $args;\n}\nadd_filter( 'qapl_modify_posts_query_args', 'modify_query_args', 10, 2 );\n</code></pre>\n<p>This example shows how to change the number of posts per page to <strong>5</strong>, using a specific AJAX identifier.</p>" 53 53 }, 54 54 "4_modify_sorting_options": { 55 55 "title": "<h4>Hooks: Modify Sorting Options for AJAX Queries</h4>", 56 "content": "<p>Sorting filters allow you to <strong>customize or extend the available sorting methods</strong> used by the AJAX query. This can be useful for adding new sorting options based on custom fields, modified dates, or taxonomies.</p>\n<h4><strong>qapl_modify_sorting_options_variants</strong></h4>\n<p>This filter allows modifying or extending the available sorting methods.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$sorting_options</code> <em>(array)</em> - array containing sorting options.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function modify_sorting_options_variants( $sorting_options, $quick_ajax_id ) {\nif ($quick_ajax_id === 'p 369') {\n $sorting_options[] = [\n 'orderby' => 'modified',\n 'order' => 'DESC',\n 'label' => 'Modify date',\n ];\n}\nreturn $sorting_options;\n</code></pre>\n<p>}\nadd_filter( 'qapl_modify_sorting_options_variants', 'modify_sorting_options_variants', 10, 2 );</p>\n<p>This example adds a <strong>sorting option based on the last modified date</strong> for the AJAX instance with <strong>quick_ajax_id = 'p369'</strong>.</p>"56 "content": "<p>Sorting filters allow you to <strong>customize or extend the available sorting methods</strong> used by the AJAX query. This can be useful for adding new sorting options based on custom fields, modified dates, or taxonomies.</p>\n<h4><strong>qapl_modify_sorting_options_variants</strong></h4>\n<p>This filter allows modifying or extending the available sorting methods.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$sorting_options</code> <em>(array)</em> - array containing sorting options.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function modify_sorting_options_variants( $sorting_options, $quick_ajax_id ) {\nif ($quick_ajax_id === 'p963') {\n $sorting_options[] = [\n 'orderby' => 'modified',\n 'order' => 'DESC',\n 'label' => 'Modify date',\n ];\n}\nreturn $sorting_options;\n</code></pre>\n<p>}\nadd_filter( 'qapl_modify_sorting_options_variants', 'modify_sorting_options_variants', 10, 2 );</p>\n<p>This example adds a <strong>sorting option based on the last modified date</strong> for the AJAX instance with <strong>quick_ajax_id = 'p369'</strong>.</p>" 57 57 }, 58 58 "4_modify_taxonomy_filters": { 59 59 "title": "<h4>Hooks: Modify Taxonomy Filter Buttons</h4>", 60 "content": "<p>Taxonomy filter hooks let you <strong>modify the taxonomy filter buttons</strong>, changing their appearance, labels, or even adding custom logic.</p>\n<h4><strong>qapl_modify_taxonomy_filter_buttons</strong></h4>\n<p>This filter allows modifying the properties of taxonomy filter buttons.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$buttons</code> <em>(array)</em> - array containing button data.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function modify_filter_buttons( $buttons, $quick_ajax_id ) {\n foreach ($buttons as &$button) {\n if ($quick_ajax_id === ' some_specific_id') {\n if ($button['term_id'] === 'none') {\n $button['button_label'] = 'View All';\n } else {\n $button['button_label'] = strtoupper($button['button_label']);\n }\n }\n }\n return $buttons;\n}\nadd_filter( 'qapl_modify_taxonomy_filter_buttons', 'modify_filter_buttons', 10, 2 );\n</code></pre>\n<p>This example changes the <strong>"Show All"</strong> button label to <strong>"View All"</strong> and converts the labels of other filter buttons to uppercase.</p>"60 "content": "<p>Taxonomy filter hooks let you <strong>modify the taxonomy filter buttons</strong>, changing their appearance, labels, or even adding custom logic.</p>\n<h4><strong>qapl_modify_taxonomy_filter_buttons</strong></h4>\n<p>This filter allows modifying the properties of taxonomy filter buttons.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$buttons</code> <em>(array)</em> - array containing button data.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function modify_filter_buttons( $buttons, $quick_ajax_id ) {\n foreach ($buttons as &$button) {\n if ($quick_ajax_id === 'p963') {\n if ($button['term_id'] === 'none') {\n $button['button_label'] = 'View All';\n } else {\n $button['button_label'] = strtoupper($button['button_label']);\n }\n }\n }\n return $buttons;\n}\nadd_filter( 'qapl_modify_taxonomy_filter_buttons', 'modify_filter_buttons', 10, 2 );\n</code></pre>\n<p>This example changes the <strong>"Show All"</strong> button label to <strong>"View All"</strong> and converts the labels of other filter buttons to uppercase.</p>" 61 61 }, 62 62 "4_modify_post_content": { … … 64 64 "content": "<p>These filters allow customizing different parts of the post content.</p>\n<h4>Modifying the Post Title</h4>\n<h4><strong>qapl_template_post_item_title</strong></h4>\n<p>Modify the <strong>title HTML output</strong>.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the original HTML of the post title.</li>\n<li><code class=\"code-tag\">$template</code> <em>(string)</em> - the template file name.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_post_title( $output, $template, $quick_ajax_id ) {\n if ( $template === 'post-item' ) {\n $output = '<div class="qapl-post-title"><h2 class="custom-title">' . esc_html(get_the_title()) . '</h2></div>';\n }\n return $output;\n}\nadd_filter( 'qapl_template_post_item_title', 'customize_post_title', 10, 3 );\n</code></pre>\n<p>This example wraps the title in an <strong>H2 tag</strong> and adds a permalink.</p>\n<h4>Modifying the Post Excerpt</h4>\n<h4><strong>qapl_template_post_item_excerpt</strong></h4>\n<p>Modify the <strong>excerpt HTML output</strong>.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the original HTML of the post excerpt.</li>\n<li><code class=\"code-tag\">$template</code> <em>(string)</em> - the template file name.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_post_excerpt( $output, $template, $quick_ajax_id ) {\n if ( $template === 'post-item' ) {\n $output = '<div class="qapl-post-description"><p class="custom-excerpt">' . wp_trim_words(get_the_excerpt(), 15) . '</p></div>';\n }\n return $output;\n}\nadd_filter( 'qapl_template_post_item_excerpt', 'customize_post_excerpt', 10, 3 );\n</code></pre>\n<p>This example limits the excerpt to <strong>15 words</strong> and wraps it in a <code class=\"code-tag\"><p></code> tag.</p>\n<h4>Modifying the Post Image</h4>\n<h4><strong>qapl_template_post_item_image</strong></h4>\n<p>Modify the <strong>featured image (thumbnail)</strong>.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the original HTML of the post thumbnail.</li>\n<li><code class=\"code-tag\">$template</code> <em>(string)</em> - the template file name (e.g., <code class=\"code-tag\">'post-item.php'</code>).</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_post_image( $output, $template, $quick_ajax_id ) {\n if ( $template === 'post-item' ) {\n $output = '<div class="qapl-post-image"><img src="' . esc_url(get_the_post_thumbnail_url(null, "large")) . '" alt="' . esc_attr(get_the_title()) . '"></div>';\n }\n return $output;\n}\nadd_filter( 'qapl_template_post_item_image', 'customize_post_image', 10, 3 );\n</code></pre>\n<p>This example forces <strong>large images</strong> instead of using the default thumbnail size.</p>\n<h4>Modifying the Post Date</h4>\n<h4><strong>qapl_template_post_item_date</strong></h4>\n<p>Modify how the <strong>post date</strong> is displayed.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the original HTML of the post date.</li>\n<li><code class=\"code-tag\">$template</code> <em>(string)</em> - the template file name (e.g., <code class=\"code-tag\">'post-item.php'</code>).</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_post_date( $output, $template, $quick_ajax_id ) {\n if ( $template === 'post-item' ) {\n $new_date = get_the_date( 'd-m-Y' );\n $output = '<div class="qapl-post-date"><div class="custom-date">Date: ' . esc_html( $new_date ) . '</div></div>';\n }\n return $output;\n}\nadd_filter( 'qapl_template_post_item_date', 'customize_post_date', 10, 3 );\n</code></pre>\n<p>This example changes the <strong>date format</strong> and wraps it in a <code class=\"code-tag\"><div class="custom-date"></div></code> container.</p>\n<h4>Modifying the Read More Label</h4>\n<h4><strong>qapl_template_post_item_read_more</strong></h4>\n<p>Modify the <strong>"Read More" label inside post content</strong>.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the original HTML of the "Read More" Label.</li>\n<li><code class=\"code-tag\">$template</code> <em>(string)</em> - the template file name.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_read_more( $output, $template, $quick_ajax_id ) {\n if ( $template === 'post-item' ) {\n $output = '<div class="qapl-read-more custom-read_more"><p>Read Full Article</p></div>';\n }\n return $output;\n}\nadd_filter( 'qapl_template_post_item_read_more', 'customize_read_more', 10, 3 );\n</code></pre>\n<p>This example changes the <strong>text of the "Read More" button</strong> to "Read Full Article".</p>" 65 65 }, 66 "4_modify_no_post_message": { 67 "title": "<h4>Hooks: Customize "No Posts Found" Message</h4>", 68 "content": "<p>Customize the <strong>"No Posts Found" message</strong> displayed when there are no posts to show initially (e.g., after filtering).</p>\n<h4><strong>qapl_template_no_post_message</strong></h4>\n<p>Modify the HTML output for the message shown when no posts match the filter or query.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the default message HTML output.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_no_post_message( $output, $quick_ajax_id ) {\n if ( $quick_ajax_id === 'p963' ) {\n $output = '<div class="custom-no-posts-found"><p>Nothing to display</p></div>';\n }\n return $output;\n}\nadd_filter( 'qapl_template_no_post_message', 'customize_no_post_message', 10, 2 );\n</code></pre>\n<p>This example replaces the <strong>default "No Posts Found" message</strong> with a custom message for a specific instance.</p>" 69 }, 70 "4_modify_end_post_message": { 71 "title": "<h4>Hooks: Customize End of Posts Message</h4>", 72 "content": "<p>Customize the <strong>"End of Posts" message</strong> displayed when all posts have been loaded and there are no more items to show.</p>\n<h4><strong>qapl_template_end_post_message</strong></h4>\n<p>Modify the HTML output for the final message shown when no more posts are available to load.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the default message HTML output.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_end_post_message( $output, $quick_ajax_id ) {\n $output = '<div class="custom-end-message"><p>That\\'s all we have for now!</p></div>';\n return $output;\n}\nadd_filter( 'qapl_template_end_post_message', 'customize_end_post_message', 10, 2 );\n</code></pre>\n<p>This example replaces the <strong>default "End of Posts" message</strong> with a custom-styled HTML block.</p>" 73 }, 66 74 "4_modify_loadmore_button": { 67 75 "title": "<h4>Hooks: Customize Load More Button HTML & Styling</h4>", 68 76 "content": "<p>Customize the <strong>"Load More" button</strong> styling and behavior.</p>\n<h4><strong>qapl_template_load_more_button</strong></h4>\n<p>Modify the <strong>"Load More" button</strong> HTML output.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the original HTML of the button.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_load_more_button( $output, $quick_ajax_id ) {\n $output = '<button type="button" class="custom-load-more qapl-load-more-button qapl-button" data-button="quick-ajax-load-more-button">Show More Posts</button>';\n return $output;\n}\nadd_filter( 'qapl_template_load_more_button', 'customize_load_more_button', 10, 2 );\n</code></pre>\n<p>This example replaces the <strong>default "Load More" button</strong> with a custom-styled version.</p>" 69 },70 "4_modify_end_post_message": {71 "title": "<h4>Hooks: Customize End of Posts Message</h4>",72 "content": "<p>Customize the <strong>"End of Posts" message</strong> displayed when all posts have been loaded and there are no more items to show.</p>\n<h4><strong>qapl_template_end_post_message</strong></h4>\n<p>Modify the HTML output for the final message shown when no more posts are available to load.</p>\n<p><strong>Parameters:</strong></p>\n<ul>\n<li><code class=\"code-tag\">$output</code> <em>(string)</em> - the default message HTML output.</li>\n<li><code class=\"code-tag\">$template_name</code> <em>(string)</em> - the template type used.</li>\n<li><code class=\"code-tag\">$quick_ajax_id</code> <em>(string)</em> - unique instance identifier.</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre><code class=\"no-background\">function customize_end_post_message( $output, $quick_ajax_id ) {\n $output = '<div class="custom-end-message"><p>That\\'s all we have for now!</p></div>';\n return $output;\n}\nadd_filter( 'qapl_template_end_post_message', 'customize_end_post_message', 10, 2 );\n</code></pre>\n<p>This example replaces the <strong>default "End of Posts" message</strong> with a custom-styled HTML block.</p>"73 77 }, 74 78 "4_finding_debugging_quick_ajax_id": { -
quick-ajax-post-loader/trunk/admin/pages/settings-page.php
r3269883 r3275104 25 25 $this->create_field($field_properties); 26 26 $field_properties = QAPL_Form_Fields_Helper::get_global_options_field_set_load_more_label(); 27 $this->create_field($field_properties); 28 $field_properties = QAPL_Form_Fields_Helper::get_global_options_field_set_no_post_message(); 27 29 $this->create_field($field_properties); 28 30 $field_properties = QAPL_Form_Fields_Helper::get_global_options_field_set_end_post_message(); … … 165 167 $content .= $this->add_field(QAPL_Quick_Ajax_Helper::global_options_field_set_show_all_label()); 166 168 $content .= $this->add_field(QAPL_Quick_Ajax_Helper::global_options_field_set_load_more_label()); 169 $content .= $this->add_field(QAPL_Quick_Ajax_Helper::global_options_field_set_no_post_message()); 167 170 $content .= $this->add_field(QAPL_Quick_Ajax_Helper::global_options_field_set_end_post_message()); 168 171 $content .= '<h4>'.__('Sorting Option Labels', 'quick-ajax-post-loader').'</h4>'; -
quick-ajax-post-loader/trunk/css/style.css
r3269883 r3275104 149 149 display: block; 150 150 width: 100%; 151 text-align: center; 151 152 } 152 153 .quick-ajax-posts-container.quick-ajax-theme .quick-ajax-end-message-container{ … … 415 416 width: 60px; 416 417 height: 60px; 418 margin: 1rem auto 1rem; 417 419 -webkit-animation: loader-one-spin 2s linear infinite; 418 420 animation: loader-one-spin 2s linear infinite; -
quick-ajax-post-loader/trunk/css/style.min.css
r3269883 r3275104 1 .quick-ajax-filter-container.quick-ajax-theme{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:10px;margin-bottom:2rem;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.quick-ajax-filter-container.quick-ajax-theme button.qapl-button,.quick-ajax-sort-options-container.quick-ajax-theme select{padding:10px 20px;font-size:16px;line-height:1;border:2px solid #1e1e1e;background-color:#1e1e1e;color:#fff;-webkit-box-shadow:0 0 22px rgba(0,0,0,.2);box-shadow:0 0 22px rgba(0,0,0,.2);border-radius:21px;outline:unset;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-filter-container.quick-ajax-theme button.qapl-button:focus{outline:0;text-decoration:none;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.quick-ajax-filter-container.quick-ajax-theme button.qapl-button.active,.quick-ajax-filter-container.quick-ajax-theme button.qapl-button:hover{border:2px solid #1e1e1e;background-color:transparent;color:#1e1e1e;-webkit-box-shadow:0 0 14px rgba(0,0,0,.5);box-shadow:0 0 14px rgba(0,0,0,.5);-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-controls-container{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.quick-ajax-controls-container .quick-ajax-filter-container{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.quick-ajax-controls-container .quick-ajax-sort-options-container{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.quick-ajax-controls-container .quick-ajax-filter-container.quick-ajax-theme{text-align:left;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:start}.quick-ajax-sort-options-container.quick-ajax-theme{margin-left:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:relative}.quick-ajax-sort-options-container.quick-ajax-theme select{background-color:#1e1e1e;background-image:url('data:image/svg+xml;charset=US-ASCII,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 5"><path fill="%23ffffff" d="M2 5L0 3h4z"/></svg>');background-repeat:no-repeat;background-position:calc(100% - 20px) 8px;background-size:10px;padding:5px 40px 5px 20px;min-height:40px;font-weight:500;text-align:center;outline:0;cursor:pointer;position:relative;-webkit-appearance:none;-moz-appearance:none;appearance:none}.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper select:hover,.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper:hover select{background-color:transparent;background-image:url('data:image/svg+xml;charset=US-ASCII,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 5"><path fill="%231e1e1e" d="M2 5L0 3h4z"/></svg>');background-repeat:no-repeat;background-position:calc(100% - 20px) 8px;background-size:10px;border:2px solid #1e1e1e;color:#1e1e1e;-webkit-box-shadow:0 0 14px rgba(0,0,0,.5);box-shadow:0 0 14px rgba(0,0,0,.5);-webkit-transition:background-color .3s ease;transition:background-color .3s ease}.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper select:focus{background-color:transparent;background-image:url('data:image/svg+xml;charset=US-ASCII,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 5"><path fill="%231e1e1e" d="M2 0L0 2h4z"/></svg>');background-repeat:no-repeat;background-position:calc(100% - 20px) 16px;background-size:10px;color:#1e1e1e;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper select option{background-color:#fff;color:#1e1e1e;font-weight:500;padding:10px;text-align:center}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-posts-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:calc(100% + 2rem);margin-left:-1rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-no-posts-found{display:block;width:100% }.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-end-message-container{display:block;width:100%;text-align:center;opacity:0;-webkit-animation:qapl-fade-in .3s ease forwards;animation:qapl-fade-in .3s ease forwards;-webkit-animation-delay:.5s;animation-delay:.5s}.quick-ajax-posts-container.quick-ajax-theme .qapl-load-more-button{display:block;width:auto;margin:0 auto}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%;padding:1rem}.quick-ajax-posts-container.quick-ajax-theme .col-qty-2 .qapl-post-item{width:calc(100% / 2)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-3 .qapl-post-item{width:calc(100% / 3)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-4 .qapl-post-item{width:calc(100% / 4)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-5 .qapl-post-item{width:calc(100% / 5)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-6 .qapl-post-item{width:calc(100% / 6)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-7 .qapl-post-item{width:calc(100% / 7)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-8 .qapl-post-item{width:calc(100% / 8)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-9 .qapl-post-item{width:calc(100% / 9)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-10 .qapl-post-item{width:calc(100% / 10)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-11 .qapl-post-item{width:calc(100% / 11)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-12 .qapl-post-item{width:calc(100% / 12)}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item a:focus{outline:0;text-decoration:none;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item a>div{position:relative;display:block;width:100%}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item a{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a{background-color:#fff;-webkit-box-shadow:0 0 10px rgba(0,0,0,.2);box-shadow:0 0 10px rgba(0,0,0,.2);text-decoration:none;border-radius:6px;text-decoration:none;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a:focus img{outline:0}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a:hover{-webkit-box-shadow:0 0 10px rgba(0,0,0,.5);box-shadow:0 0 10px rgba(0,0,0,.5);-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a>div{opacity:1;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a:hover>div{opacity:.8;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-image img{width:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;-o-object-position:center;object-position:center;border-top-right-radius:6px;border-top-left-radius:6px}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-date{position:absolute;top:1rem;left:1rem;z-index:1;background-color:rgba(255,255,255,.6);display:-webkit-box;display:-ms-flexbox;display:flex;width:auto;border-radius:6px}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-date span{line-height:1;padding:.5rem;font-size:14px;font-weight:700;color:#1e1e1e}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-title{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;padding:.5rem 1rem 1rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-title,.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-title>*{color:#1e1e1e}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-no-image+.qapl-post-title{margin-top:3rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-description{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;padding:0 1rem 1rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-description,.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-description *{color:#1e1e1e}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-read-more{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4;text-align:right;padding:0 1rem 1rem;color:#1e1e1e;margin-top:auto}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-read-more p{margin-bottom:0}.quick-ajax-posts-container.quick-ajax-theme.loading{margin-bottom:0}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-load-more-container{display:block;width:100%;opacity:1}.quick-ajax-posts-container.quick-ajax-theme.loading .quick-ajax-load-more-container{display:none;opacity:0}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-load-more-container .qapl-load-more-wrapper{margin-top:1rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-load-more-button{display:block;width:auto;margin:0 auto}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-load-more-container .qapl-load-more-button{display:block;padding:10px 20px;font-size:18px;line-height:1;border:2px solid #1e1e1e;background-color:#1e1e1e;color:#fff;-webkit-box-shadow:0 0 22px rgba(0,0,0,.2);box-shadow:0 0 22px rgba(0,0,0,.2);border-radius:21px;outline:unset;-webkit-transition:all .3s;transition:all .3s}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-load-more-container .qapl-load-more-button:hover{border:2px solid #1e1e1e;background-color:transparent;color:#1e1e1e;-webkit-box-shadow:0 0 14px rgba(0,0,0,.5);box-shadow:0 0 14px rgba(0,0,0,.5);-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container .quick-ajax-load-more-container.infinite-scroll{visibility:hidden}.quick-ajax-posts-container .quick-ajax-loader-container{visibility:hidden;opacity:0;height:0;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.quick-ajax-posts-container.loading .quick-ajax-loader-container{visibility:visible;opacity:1;height:auto;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-loader-container{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 auto 0}.quick-ajax-posts-container.quick-ajax-theme.loading .quick-ajax-loader-container{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:42px;height:auto}.qapl-loader-default{border:8px solid #ebeaea;border-top:8px solid #fff;border-radius:50%;width:60px;height:60px;-webkit-animation:loader-one-spin 2s linear infinite;animation:loader-one-spin 2s linear infinite}@-webkit-keyframes loader-one-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loader-one-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.qapl-loader-dot{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:1rem auto 1rem}.qapl-loader-dot .dot{width:15px;height:15px;background:#fff;border-radius:50%;margin:5px;-webkit-animation:dotPulse 1.2s infinite ease-in-out both;animation:dotPulse 1.2s infinite ease-in-out both}.qapl-loader-dot .dot:nth-child(1){-webkit-animation-delay:-.24s;animation-delay:-.24s}.qapl-loader-dot .dot:nth-child(2){-webkit-animation-delay:-.12s;animation-delay:-.12s}.qapl-loader-dot .dot:nth-child(3){-webkit-animation-delay:0;animation-delay:0}@-webkit-keyframes dotPulse{0%,100%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.7}50%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes dotPulse{0%,100%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.7}50%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.qapl-loader-wave{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:1rem auto 1rem}.qapl-loader-wave .wave{width:5px;height:30px;background:rgba(255,255,255,.1);margin:0 2px;-webkit-animation:wave 1.2s infinite ease-in-out;animation:wave 1.2s infinite ease-in-out}.qapl-loader-wave .wave:nth-child(1){-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.qapl-loader-wave .wave:nth-child(2){-webkit-animation-delay:-1s;animation-delay:-1s}.qapl-loader-wave .wave:nth-child(3){-webkit-animation-delay:-.9s;animation-delay:-.9s}.qapl-loader-wave .wave:nth-child(4){-webkit-animation-delay:-.8s;animation-delay:-.8s}.qapl-loader-wave .wave:nth-child(5){-webkit-animation-delay:-.7s;animation-delay:-.7s}@-webkit-keyframes wave{0%,100%,40%{-webkit-transform:scaleY(.4);transform:scaleY(.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1);background:#fff}}@keyframes wave{0%,100%,40%{-webkit-transform:scaleY(.4);transform:scaleY(.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1);background:#fff}}@-webkit-keyframes qapl-fade-in{from{opacity:0}to{opacity:1}}@keyframes qapl-fade-in{from{opacity:0}to{opacity:1}}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img{position:relative;overflow:hidden;color:#fff}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img a{text-decoration:none}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-image{position:absolute;top:0;left:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover;border-radius:4px;-o-object-position:center;object-position:center;object-fit:cover;z-index:1}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-no-image{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.6);border-radius:4px;z-index:0}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .post-content{position:relative;z-index:2;background-color:rgba(0,0,0,.6);padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;overflow:hidden}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .post-content::before{content:'';position:absolute;top:0;left:-200%;width:200%;height:100%;background:linear-gradient(45deg,rgba(0,0,0,.9) 0,rgba(0,0,0,.1) 65%,rgba(0,0,0,0) 70%,rgba(0,0,0,0) 100%);opacity:0;z-index:-1;border-top-left-radius:4px;border-top-right-radius:4px;-webkit-transition:all .6s ease;transition:all .6s ease}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img a:hover>.post-content::before{left:0;opacity:1;-webkit-transition:all .6s ease;transition:all .6s ease}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-date{position:relative;background:0 0;line-height:1;margin-bottom:20px;font-size:14px;font-weight:600}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-date span{padding:0;margin-bottom:.5rem;color:#fff;text-decoration:none}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-title{padding-top:3rem;margin-top:auto}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-title,.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-title *{color:#fff;text-decoration:none}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-description,.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-description *{color:#fff;text-decoration:none}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-read-more{text-align:right;font-weight:600;color:#fff;text-decoration:none;background:rgba(0,0,0,.4);display:inline-block;margin-top:1rem;margin-left:auto;margin-bottom:0;padding:6px 20px 8px;text-transform:uppercase;border-radius:7px;line-height:1;opacity:0;-webkit-transition:all .6s ease;transition:all .6s ease}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-read-more p{margin-bottom:0}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img a:hover .qapl-read-more{opacity:1;background:rgba(0,0,0,.6);-webkit-transition:all .6s ease;transition:all .6s ease}1 .quick-ajax-filter-container.quick-ajax-theme{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:10px;margin-bottom:2rem;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.quick-ajax-filter-container.quick-ajax-theme button.qapl-button,.quick-ajax-sort-options-container.quick-ajax-theme select{padding:10px 20px;font-size:16px;line-height:1;border:2px solid #1e1e1e;background-color:#1e1e1e;color:#fff;-webkit-box-shadow:0 0 22px rgba(0,0,0,.2);box-shadow:0 0 22px rgba(0,0,0,.2);border-radius:21px;outline:unset;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-filter-container.quick-ajax-theme button.qapl-button:focus{outline:0;text-decoration:none;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.quick-ajax-filter-container.quick-ajax-theme button.qapl-button.active,.quick-ajax-filter-container.quick-ajax-theme button.qapl-button:hover{border:2px solid #1e1e1e;background-color:transparent;color:#1e1e1e;-webkit-box-shadow:0 0 14px rgba(0,0,0,.5);box-shadow:0 0 14px rgba(0,0,0,.5);-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-controls-container{display:-webkit-box;display:-ms-flexbox;display:flex;gap:10px}.quick-ajax-controls-container .quick-ajax-filter-container{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.quick-ajax-controls-container .quick-ajax-sort-options-container{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.quick-ajax-controls-container .quick-ajax-filter-container.quick-ajax-theme{text-align:left;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:start}.quick-ajax-sort-options-container.quick-ajax-theme{margin-left:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:relative}.quick-ajax-sort-options-container.quick-ajax-theme select{background-color:#1e1e1e;background-image:url('data:image/svg+xml;charset=US-ASCII,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 5"><path fill="%23ffffff" d="M2 5L0 3h4z"/></svg>');background-repeat:no-repeat;background-position:calc(100% - 20px) 8px;background-size:10px;padding:5px 40px 5px 20px;min-height:40px;font-weight:500;text-align:center;outline:0;cursor:pointer;position:relative;-webkit-appearance:none;-moz-appearance:none;appearance:none}.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper select:hover,.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper:hover select{background-color:transparent;background-image:url('data:image/svg+xml;charset=US-ASCII,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 5"><path fill="%231e1e1e" d="M2 5L0 3h4z"/></svg>');background-repeat:no-repeat;background-position:calc(100% - 20px) 8px;background-size:10px;border:2px solid #1e1e1e;color:#1e1e1e;-webkit-box-shadow:0 0 14px rgba(0,0,0,.5);box-shadow:0 0 14px rgba(0,0,0,.5);-webkit-transition:background-color .3s ease;transition:background-color .3s ease}.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper select:focus{background-color:transparent;background-image:url('data:image/svg+xml;charset=US-ASCII,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 5"><path fill="%231e1e1e" d="M2 0L0 2h4z"/></svg>');background-repeat:no-repeat;background-position:calc(100% - 20px) 16px;background-size:10px;color:#1e1e1e;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-sort-options-container.quick-ajax-theme .quick-ajax-sort-option-wrapper select option{background-color:#fff;color:#1e1e1e;font-weight:500;padding:10px;text-align:center}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-posts-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:calc(100% + 2rem);margin-left:-1rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-no-posts-found{display:block;width:100%;text-align:center}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-end-message-container{display:block;width:100%;text-align:center;opacity:0;-webkit-animation:qapl-fade-in .3s ease forwards;animation:qapl-fade-in .3s ease forwards;-webkit-animation-delay:.5s;animation-delay:.5s}.quick-ajax-posts-container.quick-ajax-theme .qapl-load-more-button{display:block;width:auto;margin:0 auto}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%;padding:1rem}.quick-ajax-posts-container.quick-ajax-theme .col-qty-2 .qapl-post-item{width:calc(100% / 2)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-3 .qapl-post-item{width:calc(100% / 3)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-4 .qapl-post-item{width:calc(100% / 4)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-5 .qapl-post-item{width:calc(100% / 5)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-6 .qapl-post-item{width:calc(100% / 6)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-7 .qapl-post-item{width:calc(100% / 7)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-8 .qapl-post-item{width:calc(100% / 8)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-9 .qapl-post-item{width:calc(100% / 9)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-10 .qapl-post-item{width:calc(100% / 10)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-11 .qapl-post-item{width:calc(100% / 11)}.quick-ajax-posts-container.quick-ajax-theme .col-qty-12 .qapl-post-item{width:calc(100% / 12)}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item a:focus{outline:0;text-decoration:none;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item a>div{position:relative;display:block;width:100%}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item a{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a{background-color:#fff;-webkit-box-shadow:0 0 10px rgba(0,0,0,.2);box-shadow:0 0 10px rgba(0,0,0,.2);text-decoration:none;border-radius:6px;text-decoration:none;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a:focus img{outline:0}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a:hover{-webkit-box-shadow:0 0 10px rgba(0,0,0,.5);box-shadow:0 0 10px rgba(0,0,0,.5);-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a>div{opacity:1;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default a:hover>div{opacity:.8;-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-image img{width:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;-o-object-position:center;object-position:center;border-top-right-radius:6px;border-top-left-radius:6px}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-date{position:absolute;top:1rem;left:1rem;z-index:1;background-color:rgba(255,255,255,.6);display:-webkit-box;display:-ms-flexbox;display:flex;width:auto;border-radius:6px}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-date span{line-height:1;padding:.5rem;font-size:14px;font-weight:700;color:#1e1e1e}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-title{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;padding:.5rem 1rem 1rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-title,.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-title>*{color:#1e1e1e}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-no-image+.qapl-post-title{margin-top:3rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-description{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;padding:0 1rem 1rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-description,.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-post-description *{color:#1e1e1e}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-read-more{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4;text-align:right;padding:0 1rem 1rem;color:#1e1e1e;margin-top:auto}.quick-ajax-posts-container.quick-ajax-theme .qapl-post-item.qapl-post-item-default .qapl-read-more p{margin-bottom:0}.quick-ajax-posts-container.quick-ajax-theme.loading{margin-bottom:0}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-load-more-container{display:block;width:100%;opacity:1}.quick-ajax-posts-container.quick-ajax-theme.loading .quick-ajax-load-more-container{display:none;opacity:0}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-load-more-container .qapl-load-more-wrapper{margin-top:1rem}.quick-ajax-posts-container.quick-ajax-theme .qapl-load-more-button{display:block;width:auto;margin:0 auto}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-load-more-container .qapl-load-more-button{display:block;padding:10px 20px;font-size:18px;line-height:1;border:2px solid #1e1e1e;background-color:#1e1e1e;color:#fff;-webkit-box-shadow:0 0 22px rgba(0,0,0,.2);box-shadow:0 0 22px rgba(0,0,0,.2);border-radius:21px;outline:unset;-webkit-transition:all .3s;transition:all .3s}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-load-more-container .qapl-load-more-button:hover{border:2px solid #1e1e1e;background-color:transparent;color:#1e1e1e;-webkit-box-shadow:0 0 14px rgba(0,0,0,.5);box-shadow:0 0 14px rgba(0,0,0,.5);-webkit-transition:all .3s ease;transition:all .3s ease}.quick-ajax-posts-container .quick-ajax-load-more-container.infinite-scroll{visibility:hidden}.quick-ajax-posts-container .quick-ajax-loader-container{visibility:hidden;opacity:0;height:0;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.quick-ajax-posts-container.loading .quick-ajax-loader-container{visibility:visible;opacity:1;height:auto;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.quick-ajax-posts-container.quick-ajax-theme .quick-ajax-loader-container{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 auto 0}.quick-ajax-posts-container.quick-ajax-theme.loading .quick-ajax-loader-container{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:42px;height:auto}.qapl-loader-default{border:8px solid #ebeaea;border-top:8px solid #fff;border-radius:50%;width:60px;height:60px;margin:1rem auto 1rem;-webkit-animation:loader-one-spin 2s linear infinite;animation:loader-one-spin 2s linear infinite}@-webkit-keyframes loader-one-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loader-one-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.qapl-loader-dot{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:1rem auto 1rem}.qapl-loader-dot .dot{width:15px;height:15px;background:#fff;border-radius:50%;margin:5px;-webkit-animation:dotPulse 1.2s infinite ease-in-out both;animation:dotPulse 1.2s infinite ease-in-out both}.qapl-loader-dot .dot:nth-child(1){-webkit-animation-delay:-.24s;animation-delay:-.24s}.qapl-loader-dot .dot:nth-child(2){-webkit-animation-delay:-.12s;animation-delay:-.12s}.qapl-loader-dot .dot:nth-child(3){-webkit-animation-delay:0;animation-delay:0}@-webkit-keyframes dotPulse{0%,100%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.7}50%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes dotPulse{0%,100%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.7}50%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.qapl-loader-wave{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:1rem auto 1rem}.qapl-loader-wave .wave{width:5px;height:30px;background:rgba(255,255,255,.1);margin:0 2px;-webkit-animation:wave 1.2s infinite ease-in-out;animation:wave 1.2s infinite ease-in-out}.qapl-loader-wave .wave:nth-child(1){-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.qapl-loader-wave .wave:nth-child(2){-webkit-animation-delay:-1s;animation-delay:-1s}.qapl-loader-wave .wave:nth-child(3){-webkit-animation-delay:-.9s;animation-delay:-.9s}.qapl-loader-wave .wave:nth-child(4){-webkit-animation-delay:-.8s;animation-delay:-.8s}.qapl-loader-wave .wave:nth-child(5){-webkit-animation-delay:-.7s;animation-delay:-.7s}@-webkit-keyframes wave{0%,100%,40%{-webkit-transform:scaleY(.4);transform:scaleY(.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1);background:#fff}}@keyframes wave{0%,100%,40%{-webkit-transform:scaleY(.4);transform:scaleY(.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1);background:#fff}}@-webkit-keyframes qapl-fade-in{from{opacity:0}to{opacity:1}}@keyframes qapl-fade-in{from{opacity:0}to{opacity:1}}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img{position:relative;overflow:hidden;color:#fff}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img a{text-decoration:none}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-image{position:absolute;top:0;left:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover;border-radius:4px;-o-object-position:center;object-position:center;object-fit:cover;z-index:1}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-no-image{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.6);border-radius:4px;z-index:0}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .post-content{position:relative;z-index:2;background-color:rgba(0,0,0,.6);padding:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;overflow:hidden}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .post-content::before{content:'';position:absolute;top:0;left:-200%;width:200%;height:100%;background:linear-gradient(45deg,rgba(0,0,0,.9) 0,rgba(0,0,0,.1) 65%,rgba(0,0,0,0) 70%,rgba(0,0,0,0) 100%);opacity:0;z-index:-1;border-top-left-radius:4px;border-top-right-radius:4px;-webkit-transition:all .6s ease;transition:all .6s ease}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img a:hover>.post-content::before{left:0;opacity:1;-webkit-transition:all .6s ease;transition:all .6s ease}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-date{position:relative;background:0 0;line-height:1;margin-bottom:20px;font-size:14px;font-weight:600}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-date span{padding:0;margin-bottom:.5rem;color:#fff;text-decoration:none}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-title{padding-top:3rem;margin-top:auto}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-title,.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-title *{color:#fff;text-decoration:none}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-description,.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-post-description *{color:#fff;text-decoration:none}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-read-more{text-align:right;font-weight:600;color:#fff;text-decoration:none;background:rgba(0,0,0,.4);display:inline-block;margin-top:1rem;margin-left:auto;margin-bottom:0;padding:6px 20px 8px;text-transform:uppercase;border-radius:7px;line-height:1;opacity:0;-webkit-transition:all .6s ease;transition:all .6s ease}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img .qapl-read-more p{margin-bottom:0}.quick-ajax-posts-container .qapl-post-item.qapl-post-item-bg-img a:hover .qapl-read-more{opacity:1;background:rgba(0,0,0,.6);-webkit-transition:all .6s ease;transition:all .6s ease} -
quick-ajax-post-loader/trunk/inc/actions.php
r3269883 r3275104 49 49 50 50 51 $container_settings = [ 52 'quick_ajax_id' => $ajax_class->attributes['quick_ajax_id'], 53 'template_name' => $ajax_class->attributes['post_item_template'], 54 ]; 55 $qapl_post_template = QAPL_Post_Template_Factory::get_template($container_settings); 56 QAPL_Post_Template_Context::set_template($qapl_post_template); 51 57 52 $query = new WP_Query($args); 58 53 59 54 ob_start(); 60 55 if ($query->have_posts()) { 56 $container_settings = [ 57 'quick_ajax_id' => $ajax_class->attributes['quick_ajax_id'], 58 'template_name' => $ajax_class->attributes['post_item_template'], 59 ]; 60 $qapl_post_template = QAPL_Post_Template_Factory::get_template($container_settings); 61 QAPL_Post_Template_Context::set_template($qapl_post_template); 61 62 while ($query->have_posts()) { 62 63 $query->the_post(); 63 64 $template_path = $qapl_helper->plugin_templates_post_item_template(esc_attr($ajax_class->attributes[QAPL_Quick_Ajax_Helper::layout_post_item_template()])); 64 if ($template_path && file_exists($template_path)) { 65 include $template_path; 66 } else { 65 if (!$template_path || !file_exists($template_path)) { 67 66 wp_send_json_error(['message' => 'Quick Ajax Post Loader: Template file not found']); 68 67 } 69 } 70 68 include $template_path; 69 } 70 QAPL_Post_Template_Context::clear_template(); 71 71 } else { 72 72 // No posts found 73 $container_settings = [ 74 'quick_ajax_id' => $ajax_class->attributes['quick_ajax_id'], 75 'template_name' => 'no-post-message', 76 ]; 77 $qapl_no_post_template = QAPL_Post_Template_Factory::get_template($container_settings); 78 QAPL_Post_Template_Context::set_template($qapl_no_post_template); 73 79 $no_posts_template = $qapl_helper->plugin_templates_no_posts(); 74 if ($no_posts_template && file_exists($no_posts_template)) { 75 include $no_posts_template; 76 } else { 77 wp_send_json_error(['message' => 'Quick Ajax Post Loader: No posts template file not found']); 80 if (!$no_posts_template || !file_exists($no_posts_template)) { 81 wp_send_json_error(['message' => 'Quick Ajax Post Loader: Template file not found']); 78 82 } 83 include $no_posts_template; 84 QAPL_Post_Template_Context::clear_template(); 79 85 } 80 86 wp_reset_postdata(); … … 84 90 $show_end_message = $ajax_class->render_end_of_posts_message($ajax_class->attributes['show_end_message'], $load_more, esc_attr($query->max_num_pages), esc_attr($ajax_class->attributes['quick_ajax_id'])); 85 91 86 QAPL_Post_Template_Context::clear_template(); 92 87 93 //$output = $ajax_class->replace_placeholders($output); 88 94 wp_send_json_success([ -
quick-ajax-post-loader/trunk/inc/class-ajax.php
r3269883 r3275104 541 541 echo '<div class="quick-ajax-posts-wrapper '.esc_attr($container_inner_class).'">'; 542 542 543 $container_settings = [ 544 'quick_ajax_id' => $this->quick_ajax_id, 545 'template_name' => $this->attributes['post_item_template'], 546 ]; 547 $qapl_post_template = QAPL_Post_Template_Factory::get_template($container_settings); 548 QAPL_Post_Template_Context::set_template($qapl_post_template); 543 549 544 if ($query->have_posts()) { 545 $container_settings = [ 546 'quick_ajax_id' => $this->quick_ajax_id, 547 'template_name' => $this->attributes['post_item_template'], 548 ]; 549 $qapl_post_template = QAPL_Post_Template_Factory::get_template($container_settings); 550 QAPL_Post_Template_Context::set_template($qapl_post_template); 550 551 if ($this->ajax_initial_load) { 551 552 echo '<div class="qapl-initial-loader" data-button="quick-ajax-filter-button" style="display:none;" data-action="' . esc_attr(wp_json_encode($this->args)) . '" data-attributes="' . esc_attr(wp_json_encode($this->attributes)) . '"></div>'; … … 556 557 } 557 558 } 559 QAPL_Post_Template_Context::clear_template(); 558 560 } else { 561 // No posts found 562 $container_settings = [ 563 'quick_ajax_id' => $ajax_class->attributes['quick_ajax_id'], 564 'template_name' => 'no-post-message', 565 ]; 566 $qapl_no_post_template = QAPL_Post_Template_Factory::get_template($container_settings); 567 QAPL_Post_Template_Context::set_template($qapl_no_post_template); 559 568 include($this->helper->plugin_templates_no_posts()); 560 } 561 QAPL_Post_Template_Context::clear_template(); 569 QAPL_Post_Template_Context::clear_template(); 570 } 571 562 572 echo '</div>'; 563 573 do_action(QAPL_Hooks::HOOK_LOADER_BEFORE, $this->quick_ajax_id); -
quick-ajax-post-loader/trunk/inc/class-helper.php
r3269883 r3275104 15 15 public static function get_plugin_info() { 16 16 return [ 17 'version' => '1.6. 3',17 'version' => '1.6.4', 18 18 'name' => 'Quick Ajax Post Loader', 19 19 'text_domain' => 'quick-ajax-post-loader', … … 21 21 'minimum_php_version' => '7.4', 22 22 'minimum_wp_version' => '5.6', 23 'tested_wp_version' => '6. 7.2'23 'tested_wp_version' => '6.8' 24 24 ]; 25 25 } … … 574 574 return self::admin_page_global_options_name().'[load_more_label]'; 575 575 } 576 public static function global_options_field_set_no_post_message(){ 577 return self::admin_page_global_options_name().'[no_post_message]'; 578 } 576 579 public static function global_options_field_set_end_post_message(){ 577 580 return self::admin_page_global_options_name().'[end_post_message]'; 578 }579 public static function global_options_field_set_no_post_message(){580 return self::admin_page_global_options_name().'[no_post_message]';581 581 } 582 582 … … 1231 1231 return $field_properties; 1232 1232 } 1233 public static function get_global_options_field_set_no_post_message() { 1234 $field_properties = array( 1235 'name' => QAPL_Quick_Ajax_Helper::global_options_field_set_no_post_message(), 1236 'label' => __('Set "No Posts Found" Message', 'quick-ajax-post-loader'), 1237 'type' => 'text', 1238 'options' => '', // Not required for text field 1239 'default' => __('No posts found', 'quick-ajax-post-loader'), 1240 'placeholder' => __('Enter message for no posts found', 'quick-ajax-post-loader'), 1241 'description' => __('Customize the message shown when no posts match the selected filters. Examples: "No posts found", "Nothing to display", or "Try adjusting your filters".', 'quick-ajax-post-loader') 1242 ); 1243 return $field_properties; 1244 } 1233 1245 public static function get_global_options_field_set_end_post_message() { 1234 1246 $field_properties = array( … … 1237 1249 'type' => 'text', 1238 1250 'options' => '', // Not required for text field 1239 'default' => __('No more posts to load .', 'quick-ajax-post-loader'),1251 'default' => __('No more posts to load', 'quick-ajax-post-loader'), 1240 1252 'placeholder' => __('Enter message for end of posts', 'quick-ajax-post-loader'), 1241 1253 'description' => __('Customize the message that appears when there are no more posts to load. Examples: "No more posts", "You have reached the end", or "That\'s all for now".', 'quick-ajax-post-loader') 1242 1254 ); 1243 1255 return $field_properties; 1244 } 1245 public static function get_global_options_field_set_no_post_message() { 1246 $field_properties = array( 1247 'name' => QAPL_Quick_Ajax_Helper::global_options_field_set_no_post_message(), 1248 'label' => __('Set "No Posts Found" Message', 'quick-ajax-post-loader'), 1249 'type' => 'text', 1250 'options' => '', // Not required for text field 1251 'default' => __('No posts found.', 'quick-ajax-post-loader'), 1252 'placeholder' => __('Enter message for no posts found', 'quick-ajax-post-loader'), 1253 'description' => __('Customize the message shown when no posts match the selected filters. Examples: "No posts found", "Nothing to display", or "Try adjusting your filters".', 'quick-ajax-post-loader') 1254 ); 1255 return $field_properties; 1256 } 1256 } 1257 1257 public static function get_global_options_field_set_post_date_format() { 1258 1258 $field_properties = array( … … 1388 1388 const HOOK_TEMPLATE_POST_ITEM_READ_MORE = 'qapl_template_post_item_read_more'; 1389 1389 const HOOK_TEMPLATE_LOAD_MORE_BUTTON = 'qapl_template_load_more_button'; 1390 const HOOK_TEMPLATE_NO_POST_MESSAGE = 'qapl_template_no_post_message'; 1390 1391 const HOOK_TEMPLATE_END_POST_MESSAGE = 'qapl_template_end_post_message'; 1391 1392 } -
quick-ajax-post-loader/trunk/inc/class-template-hooks.php
r3269883 r3275104 33 33 } 34 34 35 interface QAPL_No_Post_Message_Interface { 36 public function render_no_post_message(); 37 } 38 35 39 function qapl_output_template_post_date() { 36 40 $template = QAPL_Post_Template_Context::get_template(); … … 67 71 if ($template && method_exists($template, 'render_load_more_button')) { 68 72 echo wp_kses_post($template->render_load_more_button()); 73 } 74 } 75 function qapl_output_template_no_post_message() { 76 $template = QAPL_Post_Template_Context::get_template(); 77 if ($template && method_exists($template, 'render_no_post_message')) { 78 echo wp_kses_post($template->render_no_post_message()); 69 79 } 70 80 } … … 85 95 'read_more_label' => null, // Read more label; 86 96 'load_more_label' => null, // Load more label; 97 'no_post_message' => null, // No post message; 87 98 'end_post_message' => null, // End post message; 88 99 ]; … … 124 135 $this->config->set('load_more_label', !empty($global_options['load_more_label']) ? $global_options['load_more_label'] : __('Load More', 'quick-ajax-post-loader')); 125 136 } 137 if ($this->config->get('no_post_message') === null) { 138 $this->config->set('no_post_message', !empty($global_options['no_post_message']) ? $global_options['no_post_message'] : __('No posts found', 'quick-ajax-post-loader')); 139 } 126 140 if ($this->config->get('end_post_message') === null) { 127 $this->config->set('end_post_message', !empty($global_options['end_post_message']) ? $global_options['end_post_message'] : __('No more posts to load .', 'quick-ajax-post-loader'));141 $this->config->set('end_post_message', !empty($global_options['end_post_message']) ? $global_options['end_post_message'] : __('No more posts to load', 'quick-ajax-post-loader')); 128 142 } 129 143 … … 221 235 222 236 class QAPL_Quick_Ajax_Template_Load_More_Button extends QAPL_Quick_Ajax_Template_Base implements QAPL_Load_More_Interface { 223 224 237 public function render_load_more_button() { 225 238 $label = $this->config->get('load_more_label'); … … 230 243 231 244 class QAPL_Quick_Ajax_Template_End_Post_Message extends QAPL_Quick_Ajax_Template_Base implements QAPL_End_Post_Message_Interface { 232 233 245 public function render_end_post_message() { 234 246 $end_post_message = $this->config->get('end_post_message'); 235 247 $output = '<p>' . esc_html($end_post_message) . '</p>'; 236 248 return apply_filters(QAPL_Hooks::HOOK_TEMPLATE_END_POST_MESSAGE, $output, $this->quick_ajax_id); 249 } 250 } 251 252 class QAPL_Quick_Ajax_Template_No_Post_Message extends QAPL_Quick_Ajax_Template_Base implements QAPL_No_Post_Message_Interface { 253 public function render_no_post_message() { 254 $no_post_message = $this->config->get('no_post_message'); 255 $output = '<p>' . esc_html($no_post_message) . '</p>'; 256 return apply_filters(QAPL_Hooks::HOOK_TEMPLATE_NO_POST_MESSAGE, $output, $this->quick_ajax_id); 237 257 } 238 258 } … … 246 266 public function render_read_more() { return ''; } 247 267 public function render_load_more_button() { return ''; } 268 public function render_no_post_message() { return ''; } 248 269 public function render_end_post_message() { return ''; } 249 270 } … … 255 276 'post-item-qapl-full-background-image' => QAPL_Quick_Ajax_Template_Post_Item_Qapl_Full_Background_Image::class, 256 277 'load-more-button' => QAPL_Quick_Ajax_Template_Load_More_Button::class, 278 'no-post-message' => QAPL_Quick_Ajax_Template_No_Post_Message::class, 257 279 'end-post-message' => QAPL_Quick_Ajax_Template_End_Post_Message::class, 258 280 -
quick-ajax-post-loader/trunk/quick-ajax-post-loader.php
r3269883 r3275104 5 5 * Text Domain: quick-ajax-post-loader 6 6 * Domain Path: /languages 7 * Version: 1.6. 37 * Version: 1.6.4 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 … … 12 12 * Requires PHP: 7.4 13 13 * Requires at least: 5.6 14 * Tested up to: 6. 7.214 * Tested up to: 6.8 15 15 */ 16 16 if (!defined('ABSPATH')) { -
quick-ajax-post-loader/trunk/readme.txt
r3269883 r3275104 4 4 Tags: ajax-load-more, infinite-scroll, category-filter, load-more, ajax 5 5 Requires at least: 5.6 6 Tested up to: 6. 7.27 Stable tag: 1.6. 36 Tested up to: 6.8 7 Stable tag: 1.6.4 8 8 Requires PHP: 7.4 9 9 License: GPLv2 or later … … 106 106 == Changelog == 107 107 108 = 1.6.4 - 2025-04-16 = 109 - Added a new global option to define a custom "No Posts Found" message. 110 - Updated the "No Posts Found" template and added the `qapl_template_no_post_message` filter hook to allow developers to customize the message. 111 - Fixed an issue where the loader icon did not appear correctly in some configurations. 112 - Fixed problems with text labels not displaying as expected. 113 - Tested and confirmed compatibility with WordPress 6.8. 114 108 115 = 1.6.3 - 2025-04-09 = 109 116 - Added a new option to display an "End Message" when there are no more posts to load via AJAX. 110 - The message can now be set via a global option in the plugin settings, customized in the template, or controlled using afilter hook for full flexibility.117 - The message can now be set via a global option in the plugin settings, customized in the template, or modified using the `qapl_template_end_post_message` filter hook for full flexibility. 111 118 - Improved CSS styling to ensure better compatibility with a wider range of WordPress themes. 112 119 - Updated Polish translations for improved clarity and consistency. … … 246 253 == Upgrade Notice == 247 254 255 = 1.6.4 = 256 This update adds a new global option and filter hook to customize the "No Posts Found" message. 257 258 **Important:** 259 - Developers can use the `qapl_template_no_post_message` filter to modify the output. 260 - Includes fixes for loader display and label issues. 261 262 Fully tested with WordPress 6.8. 263 264 = 1.6.3 = 265 This update adds support for an "End Message" that appears when there are no more posts to load. 266 267 **Important:** 268 - The message can be set globally, customized in templates, or modified using the `qapl_template_end_post_message` filter hook. 269 - This improves user experience but may require adjustments to your template or CSS. 270 271 Recommended update for improved usability and developer flexibility. 272 248 273 = 1.6.0 = 249 274 This update introduces an Infinite Scroll feature and an improved Help section within the plugin settings. -
quick-ajax-post-loader/trunk/templates/post-items/no-posts.php
r3238174 r3275104 5 5 ?> 6 6 <div class="qapl-no-posts-found"> 7 < p><?php echo esc_html__('No posts found', 'quick-ajax-post-loader') ?></p>7 <?php qapl_output_template_no_post_message(); ?> 8 8 </div>
Note: See TracChangeset
for help on using the changeset viewer.