diff --git a/CHANGELOG.md b/CHANGELOG.md index e6568a8..c4a3b82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,26 +1,42 @@ -## Changelog -### 1.5.1 - 2025-02-13 +# Changelog + +## 1.5.3 - 2025-02-28 + +- Live filtering for type and subject + +## 1.5.2 - 2025-02-13 + +- Bugfix for repo update feature + +## 1.5.1 - 2025-02-13 + - Fixed bug in filter removal functionality -### 1.5.0 - 2025-02-13 +## 1.5.0 - 2025-02-13 + - Added repo update feature -### 1.4.0 - 2025-02-13 +## 1.4.0 - 2025-02-13 + - Added admin configuration page -### 1.3.0 - 2025-02-12 +## 1.3.0 - 2025-02-12 + - Feature-complete for initial release - Add pagination - Add general reset button - Add tag close functionality -### 1.2.0 - 2025-02-05 +## 1.2.0 - 2025-02-05 + - Name change to reflect future ability to filter any content, not just `resources` - Add secondary search template -### 1.1.0 - 2025-02-05 +## 1.1.0 - 2025-02-05 + - Fully templated for use in any theme - Added result sorting -### 1.0.0 - 2025-02-04 +## 1.0.0 - 2025-02-04 + - Initial release diff --git a/README.md b/README.md index b541617..5e8287c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # Content Filter Plugin ## Brief Description + The Content Filter Plugin is a WordPress plugin designed to enhance content discoverability by allowing users to filter resources based on custom taxonomies such as resource type and subject. It provides a user-friendly interface for filtering and sorting resources, making it easier for visitors to find the content they need. ## Features + - **Customizable Filter Form**: Allows filtering by resource type, subject, and search terms. - **AJAX-Powered Filtering**: Provides a seamless user experience with instant filtering without page reloads. - **Responsive Design**: Ensures the filter form and results look great on all devices. @@ -12,23 +14,29 @@ The Content Filter Plugin is a WordPress plugin designed to enhance content disc - **Summary Display**: Shows the number of resources and applied filters dynamically. ## Installation + 1. Clone this repo or download the plugin files and place them in the `wp-content/plugins/resource-filter` directory. 2. Log in to your WordPress admin dashboard. 3. Navigate to **Plugins** > **Installed Plugins**. 4. Activate the **Content Filter** plugin. ## Usage + To use the plugin, add the `[resource_filter]` shortcode to any page or post where you want the filter form to appear. The plugin supports two types of forms: + - **Default Form**: Use `[resource_filter]` for the full filter form with search, resource type, and subject filters. - **Homepage/Secondary Form**: Use `[resource_filter type="homepage"]` for a simplified form suitable for the homepage. ### Example + Add one of the following shortcodes to your page or post content where you want the filter form to appear: `[resource_filter]` or `[resource_filter type="homepage"]` ## Configuration + The plugin is designed to work out of the box with minimal configuration. However, you can customize the following: + - **Templates**: Override the default templates and styles by placing your custom versions in your theme's `resource-filter` directory. You will need to add `"./resource-filter/**/*.{php,vue,js,cjs}",` to the `content` object in your `tailwind-config.js` file to compile the custom styles. - **Template Files**: - `filter-form.php` - Main form template @@ -40,6 +48,7 @@ The plugin is designed to work out of the box with minimal configuration. Howeve - **Taxonomies**: Ensure your WordPress site has the `resource_type` and `resource_subject` taxonomies set up for the `resource` post type. ## Roadmap + - ~~Repo updates~~ - ~~Admin configuration page~~ - ~~tag close functionality~~ @@ -47,40 +56,59 @@ The plugin is designed to work out of the box with minimal configuration. Howeve - ~~pagination~~ ## Changelog + +### 1.5.3 - 2025-02-28 + +- Live filtering for type and subject + +### 1.5.2 - 2025-02-13 + +- Bugfix for repo update feature + ### 1.5.1 - 2025-02-13 + - Fixed bug in filter removal functionality ### 1.5.0 - 2025-02-13 + - Added repo update feature ### 1.4.0 - 2025-02-13 + - Added admin configuration page ### 1.3.0 - 2025-02-12 + - Feature-complete for initial release - Add pagination - Add general reset button - Add tag close functionality ### 1.2.0 - 2025-02-05 + - Name change to reflect future ability to filter any content, not just `resources` - Add secondary search template ### 1.1.0 - 2025-02-05 + - Fully templated for use in any theme - Added result sorting ### 1.0.0 - 2025-02-04 + - Initial release ## License + This plugin is licensed under the GNU General Public License v2 or later. See the [LICENSE](LICENSE) file for more details. ## Acknowledgements + - **Author**: Keith Solomon - **Contributors**: Open to contributions from the community. ## Contribution Guidelines + We welcome contributions! If you'd like to contribute to the Content Filter Plugin, please follow these steps: 1. Fork the repository. diff --git a/assets/script-bak.js b/assets/script-bak.js index 2cca681..2f57939 100644 --- a/assets/script-bak.js +++ b/assets/script-bak.js @@ -134,7 +134,6 @@ jQuery(document).ready(function ($) { triggerFiltering(); }); - // Handle pagination click $(document).on('click', '.pagination a', function (e) { e.preventDefault(); diff --git a/assets/script.js b/assets/script.js index f46725d..b594683 100644 --- a/assets/script.js +++ b/assets/script.js @@ -10,38 +10,19 @@ jQuery(document).ready(function ($) { let searchTerm = $('#search').val(); let appliedFilters = []; - let formData = { - action: 'filter_resources', - nonce: resourceFilterAjax.nonce, - search: searchTerm, - paged: paged, - sort_order: $('#sort-order').val(), - taxonomies: {}, // Store selected taxonomy terms - }; + let selectedTypes = $('input[name="resource_type[]"]:checked') + .map(function () { + return $(this).closest('label').text().trim(); + }) + .get(); - // Dynamically handle all taxonomy inputs - $('.taxonomy-filter').each(function () { - let taxonomy = $(this).data('taxonomy'); - let selectedTerms = $(this).find('input:checked').map(function () { - return this.value; - }).get(); + let selectedSubjects = $('input[name="resource_subject[]"]:checked') + .map(function () { + return $(this).closest('label').text().trim(); + }) + .get(); - if (selectedTerms.length > 0) { - formData.taxonomies[taxonomy] = selectedTerms; - - // Add to applied filters - selectedTerms.forEach(function (term) { - appliedFilters.push( - ` - ${taxonomy}: ${term} - - ` - ); - }); - } - }); - - // Include search term in applied filters + // Search Term if (searchTerm) { appliedFilters.push( ` @@ -51,13 +32,60 @@ jQuery(document).ready(function ($) { ); } - // Update "Filters Used" section - $('#applied-filters').html(appliedFilters.length ? appliedFilters.join(' ') : 'None'); + // Resource Types + $('input[name="resource_type[]"]:checked').each(function () { + const slug = $(this).val(); // Get the slug + const name = $(this).closest('label').text().trim(); // Get the name + + appliedFilters.push( + ` + Type: ${name} + + ` + ); + }); + + // Resource Subjects + selectedSubjects.forEach(function (subject) { + appliedFilters.push( + ` + Subject: ${subject} + + ` + ); + }); + + $('#applied-filters').html( + appliedFilters.length ? appliedFilters.join(' ') : 'None' + ); + + let formData = { + action: 'filter_resources', + nonce: resourceFilterAjax.nonce, + search: searchTerm, + paged: paged, + sort_order: $('#sort-order').val(), + resource_type: $('input[name="resource_type[]"]:checked') + .map(function () { + return this.value; + }) + .get(), + resource_subject: $('input[name="resource_subject[]"]:checked') + .map(function () { + return this.value; + }) + .get(), + }; + + console.log(formData); + // Perform AJAX request $.post(resourceFilterAjax.ajaxurl, formData, function (response) { response = JSON.parse(response); + console.log(response); + $('#resource-results').html(response.html); $('#result-count').text(response.count || 0); @@ -73,11 +101,27 @@ jQuery(document).ready(function ($) { /** * Handle form submission for filtering resources. */ - $('#resource-filter','#homepage-filter').on('submit', function (e) { + $('#homepage-filter').on('submit', function (e) { e.preventDefault(); triggerFiltering(1); // Start at page 1 on new form submission }); + // Handle sort order change + $('#sort-order').on('change', function () { + triggerFiltering(); + }); + + // Trigger filtering when dropdowns or checkboxes change + $('#resource-filter select, #resource-filter input[type="checkbox"]').on('change', function () { + triggerFiltering(1); + }); + + // Allow the search field to be submitted manually + $('#resource-filter').on('submit', function (e) { + e.preventDefault(); + triggerFiltering(1); + }); + /** * Handle pagination link clicks. */ @@ -112,3 +156,31 @@ jQuery(document).ready(function ($) { triggerFiltering(1); // Refresh results starting at page 1 }); }); + +document.addEventListener('DOMContentLoaded', function () { + // Toggle dropdown visibility + document.querySelectorAll('.custom-dropdown .dropdown-toggle').forEach(function (button) { + button.addEventListener('click', function () { + const dropdown = this.parentElement; + + // Close all other dropdowns + document.querySelectorAll('.custom-dropdown').forEach(function (otherDropdown) { + if (otherDropdown !== dropdown) { + otherDropdown.classList.remove('open'); + } + }); + + // Toggle the current dropdown + dropdown.classList.toggle('open'); + }); + }); + + // Close dropdowns when clicking outside + document.addEventListener('click', function (event) { + if (!event.target.closest('.custom-dropdown')) { + document.querySelectorAll('.custom-dropdown').forEach(function (dropdown) { + dropdown.classList.remove('open'); + }); + } + }); +}); diff --git a/resource-filter.php b/resource-filter.php index 68a608c..abff45d 100644 --- a/resource-filter.php +++ b/resource-filter.php @@ -4,7 +4,7 @@ * Plugin URI: https://github.com/Vincent-Design-Inc/resource-filter * Update URI: https://github.com/Vincent-Design-Inc/resource-filter * Description: Adds filtering for the content typed by various taxonomies. - * Version: 1.5.2 + * Version: 1.5.3 * Author: Keith Solomon */ diff --git a/templates/filter-form.php b/templates/filter-form.php index e525e77..8c61b21 100644 --- a/templates/filter-form.php +++ b/templates/filter-form.php @@ -1,43 +1,59 @@ 'resource_type', 'hide_empty' => true]); +$resource_subjects = get_terms(['taxonomy' => 'resource_subject', 'hide_empty' => true]); ?> -
- + +
- - + + -
- - +
+ + +
- if ($taxonomy_obj) : - $terms = get_terms(['taxonomy' => $taxonomy, 'hide_empty' => true]); - - if (!empty($terms)) : ?> -
- labels->singular_name); ?> -
- - - -
-
- - - - + +
+ + +
+ +
+ + +
diff --git a/templates/resource-results-bak.php b/templates/resource-results-bak.php new file mode 100644 index 0000000..1915e25 --- /dev/null +++ b/templates/resource-results-bak.php @@ -0,0 +1,38 @@ +ID; + $postTitle = get_the_title($postID); + $postLink = get_permalink($postID); + ?> +
+

+ +
+

Resource Type: name); ?>

+

+ Resource Subject(s): + name); + } else { + echo esc_html($subject->name) . ', '; + } + + $i++; + } + ?> +

+
+
+ + +

No resources found.

+ diff --git a/templates/resource-results.php b/templates/resource-results.php index 1915e25..df7bb96 100644 --- a/templates/resource-results.php +++ b/templates/resource-results.php @@ -6,30 +6,32 @@ if (!empty($resources)) : $postID = $resource->ID; $postTitle = get_the_title($postID); $postLink = get_permalink($postID); + $terms = get_the_terms($postID, 'resource_type'); ?> -
-

+
+ +
+ + <?php echo esc_attr($postTitle); ?> + +
+ -
-

Resource Type: name); ?>

-

- Resource Subject(s): - + name)) : ''; ?> +

- foreach ($subjects as $subject) { - if ($i === $count) { - echo esc_html($subject->name); - } else { - echo esc_html($subject->name) . ', '; - } +
+
+

+
- $i++; - } - ?> -

+
+ + + +