Types de messages personnalisés, taxonomies et permaliens

62

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_listinget 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

Ce qui fonctionne réellement ! C'est juste que je veux voir ma taxonomie personnalisée là-bas et que je veux pouvoir accéder au taxonomy.phpmodèle 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 functions.phpfichier:

///// 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 scentsce que j'aimerais idéalement avoir une sorte d'URL conviviale, mais je suis plus ouvert à ce sujet. J'aimerais peut-être accéder à une liste de tous les parfums en allant sur mysite.com/products/scentsmais ils ne doivent pas nécessairement être spécifiques à une catégorie.

Quelqu'un peut-il m'aider?

RodeoRamsey
la source

Réponses:

63

Modifiez slugvos arguments post-type en products/%product_cat%, et slugvos arguments taxonomie en justes 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 poste commandé 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!

TheDeadMedic
la source
Oh WOW je suis impressionné! Cela a fonctionné! Finalement! Je n'ai jamais pensé que quoi que ce soit !!! merci beaucoup !!! ............ Maintenant, comment pourrais-je générer un lien (quelque chose comme the_permalink) pour saisir l'url de la taxonomie seul? / produits / mon-produit-chat /
RodeoRamsey
Je pense que ça a fonctionné ^^^ ............ mais maintenant je suis bloqué sur la pagination. Semble se briser lorsqu’on utilise une pagination (fonction personnalisée ou intégrée) en tant que / produits / mon-produit-cat / semble correct mais / products / mon-produit-cat / page / 2 / renvoie un 404 et laisse tomber le fichier taxonomy.php faveur du fichier index.php. J'ai essayé tout ce que je pouvais trouver et toujours rien.
RodeoRamsey
1
Envisageriez-vous de changer la réécriture de produit unique en product/cat-name/product-name? (remarquez la singularité) Le problème est que la règle de réécriture de la pagination de la taxonomie n'est pas déclenchée, car elle est bloquée par une règle antérieure pour un seul produit!
TheDeadMedic
Je suis ouvert à cela. Cela dit, les produits auraient-ils un chemin d'URL différent si vous affichez une page de produit unique par rapport à une page de "catégorie"? Donc, seul serait produit / nom de chat / nom de produit mais les chats seraient produits / nom de chat / ? Cela ne ferait-il pas disparaître le but des urls "conviviales pour l'homme"? J'ai du mal à aider mes clients à apprendre le tableau de bord wp, sans parler de cette différence ... Si je ne comprends pas bien, veuillez me le faire savoir! Je pourrais aussi être satisfait de NO répertoire avant, comme product-cat / product-nam et just product-cat / . Cela pourrait-il fonctionner?
RodeoRamsey
2
Vous l' avez - si je dirais que c'est « amical humain », car il y a une nette distinction entre les archives ( products/) et singuliers objets ( product/). Et non, je garderais le 'répertoire avant' - cela aide à garder une distinction claire entre les articles et les pages, sans quoi vous pourriez vous retrouver avec des problèmes de performances (par exemple des règles de réécriture verbeuses).
TheDeadMedic
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.-à-d.:) mysite.com/products/category1/child-category-1/grandchild-category-1/product-nameEt 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 voir une solution détaillée pour ma propre question. J'espère que cela aide les autres et merci pour les étapes initiales.

Jeff
la source
4

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.

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.

Chris
la source
Eh bien, n'est-ce pas intéressant? Oh mon Dieu, je pense que les règles de réécriture personnalisées me dépassent. J'ai essayé le code ci-dessus (et le reste de celui-ci de l'autre poste) et rien n'a changé. J'ai tout vidé et ensuite essayé à nouveau et toujours pas de changement, alors j'ai commenté toutes les règles de réécriture définies dans les types de poteaux personnalisés et les taxonomies, sans rien bouger.
RodeoRamsey
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. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP devrait l'ajouter comme caractéristique principale! Leo


la source
J'avais déjà vu celui-ci auparavant et je m'étais abstenu de l'utiliser car il était question de taxonomies "non hiérarchiques". J'en avais un qui était hiérarchisé et je ne pensais pas que cela fonctionnerait, mais jusqu'à présent, il semble avoir fait l'affaire! De plus, il semble fonctionner pour réaliser le / produits / nom de chat / nom de produit / structure que j'essayais de réaliser (voir le commentaire à une autre réponse). @TheDeadMedic, est-ce une option viable? Ou devrais-je m'en tenir aux réécritures dans le fichier functions.php?
RodeoRamsey
0

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

fonction create_product_taxonomies ()
{
// Ajouter une nouvelle taxonomie, la hiérarchiser (comme les catégories)
    $ labels = array (
        'name' => _x ('Categories', 'nom général de la taxonomie'),
        'singular_name' => _x ('Catégorie', 'nom singulier de 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' => __ ('Edit Category'),
        'update_item' => __ ('Catégorie de mise à jour'),
        'add_new_item' => __ ('Ajouter une nouvelle catégorie'),
        'new_item_name' => __ ('Nom de la nouvelle catégorie'),
        'nom_du_menu' => __ ('Catégorie'),
    )

    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, https://www.wpstarters.com

fonction reviews_category_taxonomy () {

    $ labels = array (
        'name' => _x ('Reviews Categories', 'Taxonomy General Name', 'reviews_category'),
        'singular_name' => _x ('Catégorie Avis', 'Nom singulier de taxonomie', 'reviews_category'),
        'menu_name' => __ ('Catégorie Avis', 'avis_catégorie'),
        'all_items' => __ ('Toutes les catégories de commentaires', 'reviews_category'),
        'parent_item' => __ ('Catégorie de commentaire du parent', 'reviews_category'),
        'parent_item_colon' => __ ('Catégorie de révision par les parents:', 'reviews_category'),
        'new_item_name' => __ ('Nom de la nouvelle catégorie de critiques', 'reviews_category'),
        'add_new_item' => __ ('Ajouter une nouvelle catégorie de critique', 'reviews_category'),
        'edit_item' => __ ('Modifier la catégorie de révision', 'reviews_category'),
        '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' => __ ('Articles de recherche', 'reviews_category'),
        'not_found' => __ ('Not Found', 'reviews_category'),
        'no_terms' => __ ('Aucune catégorie de commentaire', 'reviews_category'),
        'items_list' => __ ('Liste des catégories de critiques', 'reviews_category'),
        'items_list_navigation' => __ ('Navigation dans la liste des catégories de critiques', 'reviews_category'),
    )
    $ args = array (
        'labels' => $ labels,
        'hierarchical' => true,
        'public' => true,
        'show_ui' => true,
        'show_admin_column' => vrai,
        'show_in_nav_menus' => vrai,
        'show_tagcloud' => false,
        'show_in_rest' => vrai,
        'rewrite' => array ('hierarchical' => true),
    )
    register_taxonomy ('reviews_category', tableau ('wps_reviews'), $ args);

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

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

Leo Koo
la source