Forked from ryanmeisters/rewrite-shop-categories.php
Created
November 1, 2016 17:26
-
-
Save kurtschlatzer/8551ce85be864d6e30caaa80eee7e792 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Rewrite Shop Categories | |
| * | |
| * @wordpress-plugin | |
| * Plugin Name: Rewrite Shop Categories | |
| * Description: Allows categories and products both to have 'shop' base | |
| * Author: Plant Ninja | |
| */ | |
| if ( ! defined( 'WPINC' ) ) { die; } | |
| // Flush rewrite rules on activation and deactivation. | |
| register_deactivation_hook( __FILE__, 'flush_rewrite_rules' ); | |
| register_activation_hook( __FILE__, 'flush_rewrite_rules' ); | |
| // Priority 20 so filter runs _after_ woocommerce filter. | |
| add_filter( 'rewrite_rules_array', 'rsc_rewrite_shop_categories' , 20 ); | |
| /** | |
| * Simple function to filter wordpress rewrite rules array. | |
| * | |
| * @param array $rules Rules array passed by wordpress. | |
| */ | |
| function rsc_rewrite_shop_categories( $rules ) { | |
| return rsc_get_product_category_rewrite_rules() + $rules; | |
| } | |
| function rsc_get_product_category_rewrite_rules() : array { | |
| /* | |
| Rewrite rules to match Plant Ninja categories and sub-categories. | |
| The Plant Ninja product url structure is as follows: | |
| - We want Urls to look like this: | |
| shop/<base-category>/<optional-sub-category>/<the-product> | |
| - Sharing the 'shop' base between categories and products is not supported | |
| by WP/woocommerce out of the box (presumably because wordpress would have | |
| no way to distinguish between categories and products. | |
| - We can get around this by defining a way to distinguish between the two. | |
| For Plant Ninja, the deepest category for a product must start with | |
| "vegan-". E.g. "vegan-protein", "vegan-creatine". | |
| - We will support one or two levels of categories for now. | |
| */ | |
| $new_rules = [ | |
| /* | |
| * Match arbitrarily named base categories. Products in these categories | |
| * must have an additional sub-category with the 'vegan-' prefix, and the | |
| * base category must not be prefixed with 'vegan-'. | |
| * | |
| * Matches: | |
| * shop/some-arbitrary-base-category | |
| * shop/some-arbitrary-base-category/ | |
| * | |
| * Should NOT match: | |
| * shop/vegan-<anything> | |
| * shop/vegan-<anything>/ | |
| * shop/base-category/<anything...> | |
| */ | |
| 'shop/(?!vegan-)([^/]+?)/?$' => 'index.php?product_cat=$matches[1]', | |
| /* | |
| * Matches: | |
| * shop/some-base-category/vegan-sub-category | |
| * shop/some-base-category/vegan-<sub-category>/ | |
| * | |
| * Should NOT match: | |
| * shop/arbitrary-base-category | |
| * shop/arbitrary-base-category/ | |
| * which should be covered by the previous rule. | |
| */ | |
| 'shop(?:/.*)*?/(vegan-[^/]+)/?$' => 'index.php?product_cat=$matches[1]', | |
| ]; | |
| return $new_rules; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment