Types de publication, taxonomies et permaliens personnalisés

60

Cela me rend fou et je suis sûr que c’est simple, mais je ne cherche rien avec 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 404 redouté. 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 fonctionne réellement ! 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 le 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 ouvert à 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 correspondre à une catégorie.

Quelqu'un peut-il m'aider?

    
posée RodeoRamsey 14.12.2010 - 00:56

5 réponses

62

Remplacez slug dans vos arguments de type d'article par products/%product_cat% et slug dans vos arguments de taxonomie par products , puis purgez 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 (immédiatement, 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 récupérer la première catégorie de produit pour le post trié 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!

    
réponse donnée TheDeadMedic 14.12.2010 - 02:50
6

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 (c'est-à-dire: 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. Par conséquent, si quelqu'un d'autre a besoin de catégories / sous-catégories imbriquées, vous pouvez afficher un solution détaillée sur ma propre question. J'espère que cela aidera les autres et merci pour les étapes initiales.

    
réponse donnée Jeff 23.01.2012 - 19:39
4

Je ne suis pas sûr que wp prenne en charge cette structure immédiatement - 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 réécrire l'URL .

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. Elles auront la priorité sur celles qui sont intégrées.

    
réponse donnée Chris 14.12.2010 - 01:07
2

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. enlace WP devrait ajouter ceci comme caractéristique principale! Leo

    
réponse donnée user1975 14.12.2010 - 11:13
0

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

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' => array('hierarchical' => true),
    ));

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

function reviews_category_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Reviews Categories', 'Taxonomy General Name', 'reviews_category' ),
        'singular_name'              => _x( 'Reviews Category', 'Taxonomy Singular Name', 'reviews_category' ),
        'menu_name'                  => __( 'Reviews Category', 'reviews_category' ),
        'all_items'                  => __( 'All Review Categories', 'reviews_category' ),
        'parent_item'                => __( 'Parent Review Category', 'reviews_category' ),
        'parent_item_colon'          => __( 'Parent Review Category:', 'reviews_category' ),
        'new_item_name'              => __( 'New Review Category Name', 'reviews_category' ),
        'add_new_item'               => __( 'Add New Review Category', 'reviews_category' ),
        'edit_item'                  => __( 'Edit Review Category', 'reviews_category' ),
        'update_item'                => __( 'Update Review Category', 'reviews_category' ),
        'view_item'                  => __( 'View Review Category', 'reviews_category' ),
        'separate_items_with_commas' => __( 'Separate items with commas', 'reviews_category' ),
        'add_or_remove_items'        => __( 'Add or remove items', 'reviews_category' ),
        'choose_from_most_used'      => __( 'Choose from the most used', 'reviews_category' ),
        'popular_items'              => __( 'Popular Review Categories', 'reviews_category' ),
        'search_items'               => __( 'Search Items', 'reviews_category' ),
        'not_found'                  => __( 'Not Found', 'reviews_category' ),
        'no_terms'                   => __( 'No Review Categories', 'reviews_category' ),
        'items_list'                 => __( 'Review Categories list', 'reviews_category' ),
        'items_list_navigation'      => __( 'Review Categories list navigation', 'reviews_category' ),
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => false,
        'show_in_rest'               => true,
        'rewrite' => array( 'hierarchical' => true ),
    );
    register_taxonomy( 'reviews_category', array( 'wps_reviews' ), $args );

}
add_action( 'init', 'reviews_category_taxonomy', 0 );

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

    
réponse donnée Leo Koo 06.12.2017 - 20:15

Lire d'autres questions sur les étiquettes