web-dev-qa-db-fra.com

Types de messages personnalisés, taxonomies et permaliens

Cela me rend fou et je suis sûr que c'est simple, mais rien de ce que je recherche ne propose une structure simple (tout est très complexe).

J'ai un type de message personnalisé product_listing et une taxonomie personnalisée de product_cat (qui est hiérarchique et devrait avoir des catégories similaires).

Je veux simplement que mes URL ressemblent à ceci:

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

Mais pour ma vie, peu importe ce que je fais, je reçois le problème redouté de 404. Les pages fonctionnent correctement et les messages fonctionnent correctement, mais mes messages personnalisés ne fonctionnent pas correctement. Ils apparaissent comme:

mysite.com/products/product-name1
mysite.com/products/product-name2

Qui fait fonctionne ! C'est juste que je veux voir ma taxonomie personnalisée ici et que je veux pouvoir accéder au modèle taxonomy.php que j'ai configuré en allant dans:

mysite.com/products/category1/
mysite.com/products/category2/

Aucune de mes limaces n'est la même, et je ne veux pas qu'elles soient. Voici la partie type et taxonomie de mon fichier functions.php:

///// CUSTOM POST TYPES /////

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        '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' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

J'ai aussi une autre taxonomie personnalisée de scents dans laquelle j'aimerais idéalement avoir une sorte d'URL conviviale, mais je suis plus ouverte à ce sujet. J'aimerais peut-être accéder à la liste de tous les parfums en allant à mysite.com/products/scents, mais ils ne doivent pas nécessairement être spécifiques à une catégorie.

Quelqu'un peut-il m'aider?

61
RodeoRamsey

Remplacez slug dans vos arguments de type d'article par products/%product_cat% et slug dans vos arguments de taxonomie par products, puis effacez vos règles de réécriture. WordPress devrait maintenant gérer /products/my-product-cat/post-name/!

Pour finir, nous devons aider un peu WordPress à générer des permaliens (par défaut, il ne reconnaîtra pas la balise permastruct %product_cat%):

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );

Une chose à noter, cela va juste saisir la première catégorie de produit pour le post ordonné par nom . Si vous attribuez plusieurs catégories à un même produit, je peux facilement changer la façon dont il détermine laquelle utiliser dans le permalien.

Je sais comment vous vous en sortez et nous pouvons nous attaquer aux autres problèmes!

63
TheDeadMedic

Merci @TheDeadMechanic, votre réponse m'a aidé, mais seulement partiellement. Je voulais faire la même chose que @RodeoRamsey avait demandé, mais avec des catégories imbriquées (par exemple: mysite.com/products/category1/child-category-1/grandchild-category-1/product-name) et votre solution n'a pas fonctionné pour cela.

J'ai finalement trouvé une solution étendue à ma question qui fonctionne. Ainsi, si quelqu'un d'autre a besoin de catégories/sous-catégories imbriquées, vous pouvez afficher une solution détaillée pour ma propre question. J'espère que cela aide les autres et merci pour les étapes initiales.

6
Jeff

Je ne suis pas sûr que wp prenne en charge cette structure, mais vous pouvez très facilement créer vos propres règles de réécriture pour le faire.

Découvrez une réponse précédente ici Auteur url rewrite .

Vous pouvez changer de ligne

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

à quelque chose comme

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

la partie product_cat ici peut être superflue - je ne suis pas sûr que ce soit nécessaire.

Vous pouvez ajouter toutes les règles de votre choix et elles auront la priorité sur celles qui sont intégrées.

4
Chris

Oui, cela me rendait folle avant de définir le lien permanent pour le type de message personnalisé. J'ai trouvé un plugin pour gérer le type de message personnalisé. C'est très facile à utiliser. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP devrait ajouter ceci comme caractéristique principale! Leo

2
user1975

En fait, c'est assez facile. Vous avez juste besoin d'une ligne. Voici mon code

 function create_product_taxonomies () 
 {
 // Ajouter une nouvelle taxonomie, la hiérarchiser (comme les catégories) 
 $ labels = array (
 'name '=> _x (' Catégories ',' nom général de la taxonomie '), 
' nom_s singulier '=> _x (' Catégorie ',' nom singulier de la taxonomie '), 
' search_items '=> __ ('Catégories de recherche'), 
 'All_items' => __ ('Toutes catégories'), 
 'Parent_item' => __ ('Catégories de parents'), 
 'Parent_item_colon '=> __ (' Catégories de parents: '), 
' Edit_item '=> __ (' Modifier catégorie '), 
' Update_item '=> __ (' Mettre à jour une catégorie '), 
 'add_new_item' => __ ('Ajouter nouvelle catégorie'), 
 'new_item_name' => __ ('Nouveau nom de catégorie'), 
 'menu_name' => __ ('Catégorie '), 
); 
 
 register_taxonomy (' product_cat ', array (' product_listing '), array (
' hierarchical '=> true, 
 'labels' => $ labels, 
 'show_ui' => true, 
 'query_var' => vrai, 
 'rewrite' => tableau ('hierarchique' => vrai), 
)); 

Et appliqué à la taxonomie générée pour mes avis CPT de GenerateWP.com. J'utilise ceci sur mon propre site WordPress, https://www.wpstarters.com

 function reviews_category_taxonomy () {
 
 $ labels = array (
 'name' => _x ('Reviews Categories', 'Nom général de la taxonomie', 'reviews_category '), 
' singular_name '=> _x (' Catégorie d'avis ',' Nom singulier de taxonomie ',' reviews_category '), 
' menu_name '=> __ (' Catégorie d'avis ',' reviews_category '), 
' all_items '=> __ (' Toutes les catégories de commentaires ',' reviews_category '), 
' parent_item '=> __ (' Catégorie de commentaires parents ',' reviews_category '), 
 'parent_item_colon' => __ ('Catégorie de révision par le parent:', 'reviews_category'), 
 'new_item_name' => __ ('Nom de la nouvelle catégorie de révision', 'reviews_category'), 
 'add_new_item' => __ ('Ajouter une nouvelle catégorie de critique', 'reviews_category'), 
 'edit_item' => __ ('Modifier une catégorie de critique', 'reviews_cat egory '), 
' update_item '=> __ (' Mettre à jour la catégorie de commentaires ',' reviews_category '), 
' view_item '=> __ (' Voir la catégorie de commentaires ',' reviews_category '), 
 'separ_items_with_commas' => __ ('Séparer les éléments par des virgules', 'reviews_category'), 
 'add_or_remove_items' => __ ('Ajouter ou supprimer des éléments', 'reviews_category'), 
 'choose_from_most_used' => __ ('Choisissez parmi les plus utilisés', 'reviews_category'), 
 'popular_items' => __ ('Catégories de commentaires populaires', 'reviews_category'), 
 'search_items' => __ ('Éléments de recherche', 'reviews_category'), 
 'not_found' => __ ('Not Found', 'reviews_category'), 
 'no_terms' => __ ('Pas de catégories de commentaires', 'reviews_category'), 
 'Items_list' => __ ('Liste de catégories de commentaires', 'reviews_category'), 
 'Item s_list_navigation '=> __ (' Navigation dans la liste des catégories de critiques ',' reviews_category '), 
); 
 $ args = array (
' labels '=> $ labels, 
 'hierarchical' => vrai, 
 'public' => vrai, 
 'show_ui' => vrai, 
 'show_admin_column' => vrai, 
 'show_in_nav_menus' => vrai, 
 'show_tagcloud' => faux, 
 'show_in_rest' => vrai, 
 'rewrite' => tableau ('hiérarchique' => vrai ), 
); 
 register_taxonomy ('reviews_category', array ('wps_reviews'), $ args); 
 
} 
 add_action (' init ',' reviews_category_taxonomy ', 0); 

Tout ce dont vous avez besoin alors mettez le 'rewrite' => tableau ('hierarchical' => true),

0
Leo Koo