Taxonomy with children taxonomies.
JavaScript:
// http://wordpress.stackexchange.com/a/31772/113662
/**
* Changes the permalink setting <:> post_type_link
* Functions by looking for %product-type% and %product-brands% in the URL
*
* products_type_link(): returns the converted url after inserting tags
*
* products_add_rewrite_rules(): creates the post type, taxonomies and applies the rewrites rules to the url
*
*
* Setting: [ produkter / %product-type% / %product-brand% / %postname% ]
* Is actually: [ post-type / taxonomy / taxonomy / postname ]
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Desired result: [ products / cellphones / apple / iphone-4 ]
*/
// Add the actual filter
add_filter('post_type_link', 'products_type_link', 1, 3);
function products_type_link($url, $post = null, $leavename = false)
{
// products only
if ($post->post_type != 'products') {
return $url;
}
// Post ID
$post_id = $post->ID;
/**
* URL tag <:> %product-type%
*/
$taxonomy = 'product-type';
$taxonomy_tag = '%' . $taxonomy . '%';
// Check if taxonomy exists in the url
if (strpos($taxonomy_tag, $url) <= 0) {
// Get the terms
$terms = wp_get_post_terms($post_id, $taxonomy);
if (is_array($terms) && sizeof($terms) > 0) {
$category = $terms[0];
}
// replace taxonomy tag with the term slug » /products/%product-type%/productname
$url = str_replace($taxonomy_tag, $category->slug, $url);
}
/**
* URL tag <:> %product-brand%
*/
$brand = 'product-brand';
$brand_tag = '%' . $brand . '%';
// Check if taxonomy exists in the url
if (strpos($brand_tag, $url) < 0) {
return $url;
} else { $brand_terms = wp_get_post_terms($post_id, $brand); }
if (is_array($brand_terms) && sizeof($brand_terms) > 0) {
$brand_category = $brand_terms[0];
}
// replace brand tag with the term slug and return complete url » /products/%product-type%/%product-brand%/productname
return str_replace($brand_tag, $brand_category->slug, $url);
}
function products_add_rewrite_rules()
{
global $wp_rewrite;
global $wp_query;
/**
* Post Type <:> products
*/
// Product labels
$product_labels = array (
'name' => 'Products',
'singular_name' => 'product',
'menu_name' => 'Products',
'add_new' => 'Add product',
'add_new_item' => 'Add New product',
'edit' => 'Edit',
'edit_item' => 'Edit product',
'new_item' => 'New product',
'view' => 'View product',
'view_item' => 'View product',
'search_items' => 'Search Products',
'not_found' => 'No Products Found',
'not_found_in_trash' => 'No Products Found in Trash',
'parent' => 'Parent product'
);
// Register the post type
register_post_type('products', array(
'label' => 'Products',
'labels' => $product_labels,
'description' => '',
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'capability_type' => 'post',
'hierarchical' => true,
'rewrite' => array('slug' => 'products'),
'query_var' => true,
'has_archive' => true,
'menu_position' => 5,
'supports' => array(
'title',
'editor',
'excerpt',
'trackbacks',
'revisions',
'thumbnail',
'author'
)
)
);
/**
* Taxonomy <:> product-type
*/
register_taxonomy('product-type', 'products', array(
'hierarchical' => true,
'label' => 'Product Types',
'show_ui' => true,
'query_var' => true,
'rewrite' => array('slug' => 'products/types'),
'singular_label' => 'Product Types')
);
/**
* Taxonomy <:> product-type
*/
register_taxonomy('product-brand', 'products', array(
'hierarchical' => true,
'label' => 'Product Brands',
'show_ui' => true,
'query_var' => true,
'rewrite' => array('slug' => 'product/brands'),
'singular_label' => 'Product Brands')
);
$wp_rewrite->extra_permastructs['products'][0] = "/products/%product-type%/%product-brand%/%products%";
// flush the rules
flush_rewrite_rules();
}
// rewrite at init
add_action('init', 'products_add_rewrite_rules');