Древовидные метки продуктов в woocommerce
Задача изменить теги товаров в woocommerce, чтобы они отображались как иерархические.
Heirarchical_WC_Tag::init();
/**
* Makes woocommerce product tags tree-like.
*
* Also, allows you to specify the same prefix for cat
* and tags taxonomies of product.
*
* @author Kama (wp-kama.com)
* @version 0.1
*/
class Heirarchical_WC_Tag {
public static function init(): void{
//add_action( 'wp', [ __CLASS__, 'debug' ] );
add_action( 'init', [ __CLASS__, 'modify_product_tag_taxonomy' ], 20 );
}
public static function debug( $wp ){
print_r( get_queried_object() );
print_r( $wp );
print_r( $GLOBALS['wp_rewrite'] );
exit;
}
public static function modify_product_tag_taxonomy(): void{
global $wp_taxonomies;
$cat = &$wp_taxonomies['product_cat'];
$tag = &$wp_taxonomies['product_tag'];
$tag->rewrite['hierarchical'] = true; // for term_link
$tag->hierarchical = true;
$tag->meta_box_cb = 'post_categories_meta_box';
// Fix query vars, if friendly-URL prefix of cats and tags idential.
if( $tag->rewrite['slug'] === $cat->rewrite['slug'] ){
add_filter( 'request', [ __CLASS__, 'fix_product_tag_request_var' ] );
}
}
public static function fix_product_tag_request_var( $vars ){
if( ! empty( $vars['product_cat'] ) ){
$_cat_patrs = explode( '/', $vars['product_cat'] );
$_patrs_end = end( $_cat_patrs );
$tag_exists = get_term_by( 'slug', $_patrs_end, 'product_tag' );
if( $tag_exists ){
$vars['product_tag'] = $vars['product_cat'];
unset( $vars['product_cat'] );
}
}
return $vars;
}
}