web-dev-qa-db-fra.com

Permaliens pour les catégories et sous-catégories WooCommerce

Installer

Structure permalien souhaitée (seules ces structures existent pour les produits)

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

Paramètres d'affichage du produit Woocommerce

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

Produits

Products are only checked for one category OR subcategory

Paramètres de lien permanent

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

Archives

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

Tentatives de résoudre

Avec les tentatives ci-dessous, j'ai été en mesure de produire un Product-page de travail, mais aussi 404:ing la page de sous-catégorie. Je ne sais plus quelle option produit quel résultat.

  1. J'ai essayé différents paramètres de liaison permanente pour le produit categorybase, y compris %category%/%product_cat%, %category%/%product_cat%/%postname%, %product_cat%/%product_cat%, shop/%product_cat%, shop/%product_cat%/%postname% et toutes les combinaisons ci-dessus avec une terminaison /. également
  2. J'ai essayé d'échanger ci-dessus avec le paramètre permalink boutique de base.
  3. J'ai essayé de modifier les paramètres de vue des produits pour afficher des sous-catégories plutôt que des produits.
  4. J'ai essayé de créer des pages pour les sous-catégories tout en ayant une page de produit opérationnelle, mais la page de sous-catégorie renvoie toujours un 404.
  5. J'ai essayé cette SO tentative sans succès.

Qu'est-ce que je fais de mal ou quelle partie puis-je recâbler pour que cela fonctionne? Tellement reconnaissant pour des conseils, des pistes ou des réponses. Merci d'avoir lu ceci!

1
Anton Flärd

J'ai pu résoudre ce problème avec le code suivant qui génère rewrite_rules pour chaque sous-catégorie, ce qui est préférable lors de la mise en correspondance, car il est plus spécifique:

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