it-swarm-eu.dev

Permalinks pro kategorie WooCommerce a podkategorie

Založit

Požadovaná permalinková struktura (pro produkty existují pouze tyto struktury)

Product 1: /shop/category/subcategory/product1/
Product 2: /shop/category/product2/

Nastavení zobrazení produktu Woocommerce

View for shopbase:     Show categories
View for categories:   Show products

Produkty

Products are only checked for one category OR subcategory

Nastavení Permalink

Normal settings:       /%category%/%postname%/
Base for categories:   shop
For products:          /shop/%product_cat%/

Archivy

Since there are over 100 subcategories, I want to use an archive to list all 
the products.

Pokusy o vyřešení

S níže uvedenými pokusy jsem byl schopen vytvořit pracovní Product-page, ale zároveň tak učinil i 404:ing stránku podkategorie. Nemohu si vzpomenout, která možnost dává výsledek.

  1. Vyzkoušel jsem různá nastavení permalinků pro produktovou kategorii, včetně %category%/%product_cat%, %category%/%product_cat%/%postname%, %product_cat%/%product_cat%, shop/%product_cat%, shop/%product_cat%/%postname% a všech výše uvedených kombinací s koncem jako /..
  2. Snažil jsem se vyměnit výše se základním obchodem permalink nastavení.
  3. Pokusil jsem se změnit nastavení zobrazení produktu, aby se zobrazily podkategorie namísto produktů.
  4. Snažil jsem se vytvářet stránky pro podkategorie a zároveň mít funkční produktovou stránku, ale stránka podkategorie stále vrací 404.
  5. Snažil jsem se to SO pokus bez štěstí.

Co dělám špatně nebo jakou část mohu převést na tuto práci? Tak velký pro všechny rady nebo vede nebo odpovědi. Děkujeme, že jste si to přečetli!

1
Anton Flärd

Byl jsem schopen tento problém vyřešit následujícím kódem, který generuje rewrite_rules pro každou podkategorii, která je upřednostňována při porovnávání, protože je konkrétnější:

function wpse_291143_generate_taxonomy_rewrite_rules( $wp_rewrite ) {

    global $wp_rewrite;
    $base = "shop";

    $rules = array();
    $terms = get_terms( array( 'taxonomy' => 'product_cat', 'hide_empty' => false ));

    foreach($terms as $term) {
        $term_children = get_terms( array(
            'taxonomy' => 'product_cat',
            'parent' => intval($term->term_id),
            'hide_empty' => false
            )
        );
        if($term_children) {
            foreach ( $term_children as $term_child ) {
                $rules[$base . '/' . $term->slug . '/' . $term_child->slug . '/?$'] = 'index.php?product_cat=' . $term_child->slug;
            }
        }
    }

    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
    return $wp_rewrite->rules;
}

add_action('generate_rewrite_rules', 'wpse_291143_generate_taxonomy_rewrite_rules');
2
Anton Flärd