Ajouter une base de catégories à l'URL dans un type de message / taxonomie personnalisé

23

Je construis un système de type LMS dans WordPress, contrôlé par Custom Post types.
Le type de publication est appelé Lessons(avec un slug de courses) et il en a une custom taxonomy(catégorie) appelée courses.

La structure de l'url du domaine s'affiche actuellement comme suit:

domain.com/courses/lesson-name.

Je veux qu'il devienne:

domain.com/courses/[course-name{category}]/lesson-name

ou essentiellement:

/[cpt]/%category%/%postname%/

voici le plugin que j'ai écrit qui contrôle le CPTsmaintenant.

function rflms_post_type() {
    $labels = array(
        'name'                => _x( 'Lessons', 'Post Type General Name', 'text_domain' ),
        'singular_name'       => _x( 'Lesson', 'Post Type Singular Name', 'text_domain' ),
        'menu_name'           => __( 'Lessons', 'text_domain' ),
        'parent_item_colon'   => __( 'Parent Product:', 'text_domain' ),
        'all_items'           => __( 'All Lessons', 'text_domain' ),
        'view_item'           => __( 'View Lesson', 'text_domain' ),
        'add_new_item'        => __( 'Add New Lesson', 'text_domain' ),
        'add_new'             => __( 'New Lesson', 'text_domain' ),
        'edit_item'           => __( 'Edit Lesson', 'text_domain' ),
        'update_item'         => __( 'Update Lesson', 'text_domain' ),
        'search_items'        => __( 'Search Lessions', 'text_domain' ),
        'not_found'           => __( 'No Lessons Found', 'text_domain' ),
        'not_found_in_trash'  => __( 'No Lessons Found in Trash', 'text_domain' ),
    );

    $args = array(
        'label'               => __( 'Lessons', 'text_domain' ),
        'description'         => __( 'Referable Lessons', 'text_domain' ),
        'labels'              => $labels,
        'hierarchical'        => false,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'show_in_nav_menus'   => true,
        'show_in_admin_bar'   => true,
        'supports'        => array('premise-member-access', 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'),
        'menu_position'       => 5,
        'menu_icon'           => null,
        'can_export'          => true,
        'has_archive'         => true,
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'capability_type'     => 'post',
        'rewrite'                    => array('slug' => 'courses'),
    );

    register_post_type( 'lessons', $args );


// Hook into the 'init' action

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

// Register Custom Taxonomy
function custom_taxonomy()  {
    $labels = array(
        'name'                       => _x( 'Courses', 'Taxonomy General Name', 'text_domain' ),
        'singular_name'              => _x( 'Course', 'Taxonomy Singular Name', 'text_domain' ),
        'menu_name'                  => __( 'Courses', 'text_domain' ),
        'all_items'                  => __( 'All Courses', 'text_domain' ),
        'parent_item'                => __( 'Parent Course', 'text_domain' ),
        'parent_item_colon'          => __( 'Parent Course:', 'text_domain' ),
        'new_item_name'              => __( 'New Course Name', 'text_domain' ),
        'add_new_item'               => __( 'Add New Course', 'text_domain' ),
        'edit_item'                  => __( 'Edit Course', 'text_domain' ),
        'update_item'                => __( 'Update Course', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separate Courses with commas', 'text_domain' ),
        'search_items'               => __( 'Search Courses', 'text_domain' ),
        'add_or_remove_items'        => __( 'Add or Remove Courses', 'text_domain' ),
        'choose_from_most_used'      => __( 'Choose from Most Used courses', 'text_domain' ),
    );

    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => false,
        'rewrite'                    => array('slug' => 'courses'),
    );

    register_taxonomy( 'course', 'lessons', $args );
}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );
Zach Russell
la source
Récemment, je fais face à ce problème. Résolu! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare
SOLUTION! (Après une recherche sans fin) <br/> <br/> vous devez modifier le post_type_linkfiltre. plus sur: wordpress.stackexchange.com/a/167992/33667 )
T.Todua

Réponses:

36

Modifiez votre réécriture pour ajouter la var de requête de cours:

'rewrite' => array('slug' => 'courses/%course%')

Filtrez ensuite post_type_linkpour insérer le cours sélectionné dans le permalien:

function wpa_course_post_link( $post_link, $id = 0 ){
    $post = get_post($id);  
    if ( is_object( $post ) ){
        $terms = wp_get_object_terms( $post->ID, 'course' );
        if( $terms ){
            return str_replace( '%course%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;  
}
add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );

Il existe également des plugins tels que les permaliens de type de publication personnalisés qui peuvent le faire pour vous.

Milo
la source
Merci, j'apprécie votre réponse rapide. Cela est parfaitement logique. Je suis curieux cependant, où dois-je insérer le filtre post_type_link? puis-je simplement aller au bas de tout le document?
Zach Russell
Je l'ai ajouté en bas et c'est la page 404.
Zach Russell
1
vous devez vider les réécritures, visitez la page des paramètres de permaliens.
Milo
notez également que vous aurez probablement un conflit avec une taxonomie et un type de message partageant tous les deux le même slug.
Milo
Là où j'en suis maintenant, c'est en train de faire les bons permaliens, mais ça ne s'exécute pas correctement (c'est du 404ing doux). Avez-vous des recommandations sur ce que je peux faire pour que cela fonctionne correctement? Je suis loin des réécritures de permalien. Cliquez simplement sur 'enregistrer' et il met à jour le fichier (c'est nginx donc il est contrôlé dans le fichier nginx.conf)
Zach Russell
1

Oui! Après beaucoup de recherches, j'ai obtenu le plugin ' Custom Permalinks ' . Qui répond à mes exigences concernant - URL personnalisée par exemple

  • pour la catégorie
  • pour la poste
  • pour poste personnalisé
  • pour la taxonomie personnalisée, etc.

Comme ce type de message personnalisé - Message :

entrez la description de l'image ici

maheshwaghmare
la source
1

Vous avez la solution!

Pour disposer de permaliens hiérarchiques pour le type de publication personnalisé, installez le plug-in de permaliens de type de publication personnalisé ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Mettre à jour le type de message enregistré. J'ai le nom du type de message comme centre d'aide

function help_centre_post_type(){
    register_post_type('helpcentre', array( 
        'labels'            =>  array(
            'name'          =>      __('Help Center'),
            'singular_name' =>      __('Help Center'),
            'all_items'     =>      __('View Posts'),
            'add_new'       =>      __('New Post'),
            'add_new_item'  =>      __('New Help Center'),
            'edit_item'     =>      __('Edit Help Center'),
            'view_item'     =>      __('View Help Center'),
            'search_items'  =>      __('Search Help Center'),
            'no_found'      =>      __('No Help Center Post Found'),
            'not_found_in_trash' => __('No Help Center Post in Trash')
                                ),
        'public'            =>  true,
        'publicly_queryable'=>  true,
        'show_ui'           =>  true, 
        'query_var'         =>  true,
        'show_in_nav_menus' =>  false,
        'capability_type'   =>  'page',
        'hierarchical'      =>  true,
        'rewrite'=> [
            'slug' => 'help-center',
            "with_front" => false
        ],
        "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
        'menu_position'     =>  21,
        'supports'          =>  array('title','editor', 'thumbnail'),
        'has_archive'       =>  true
    ));
    flush_rewrite_rules();
}
add_action('init', 'help_centre_post_type');

Et voici la taxonomie enregistrée

function themes_taxonomy() {  
    register_taxonomy(  
        'help_centre_category',  
        'helpcentre',        
        array(
            'label' => __( 'Categories' ),
            'rewrite'=> [
                'slug' => 'help-center',
                "with_front" => false
            ],
            "cptp_permalink_structure" => "/%help_centre_category%/",
            'hierarchical'               => true,
            'public'                     => true,
            'show_ui'                    => true,
            'show_admin_column'          => true,
            'show_in_nav_menus'          => true,
            'query_var' => true
        ) 
    );  
}  
add_action( 'init', 'themes_taxonomy');

Cette ligne fait fonctionner votre permalien

"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",

vous pouvez supprimer %post_id% et conserver/%help_centre_category%/%postname%/"

N'oubliez pas de vider les permaliens du tableau de bord.

Varsha Dhadge
la source
1

La solution pour moi comportait trois parties. Dans mon cas, le type de message est appelé trainings.

  1. Ajoutez 'rewrite' => array('slug' => 'trainings/%cat%')à la register_post_typefonction.
  2. Modifiez le slug pour avoir une catégorie dynamique.
  3. "Écoutez" la nouvelle URL dynamique et chargez le modèle approprié.

Voici donc comment modifier dynamiquement le permalien pour un type de publication donné. Ajouter à functions.php:

function vx_soon_training_post_link( $post_link, $id = 0 ) {
    $post = get_post( $id );
    if ( is_object( $post ) ) {
        $terms = wp_get_object_terms( $post->ID, 'training_cat' );
        if ( $terms ) {
            return str_replace( '%cat%', $terms[0]->slug, $post_link );
        }
    }

    return $post_link;
}

add_filter( 'post_type_link', 'vx_soon_training_post_link', 1, 3 );

... et voici comment charger le modèle approprié sur la nouvelle URL dynamique. Ajouter à functions.php:

function archive_rewrite_rules() {
    add_rewrite_rule(
        '^training/(.*)/(.*)/?$',
        'index.php?post_type=trainings&name=$matches[2]',
        'top'
    );
    //flush_rewrite_rules(); // use only once
}

add_action( 'init', 'archive_rewrite_rules' );

C'est ça! N'oubliez pas de rafraîchir les permaliens en les enregistrant à nouveau dans de backend. Ou utilisez la flush_rewrite_rules()fonction.

Floris
la source
1

Vous devez mettre à jour la ligne ci-dessous à l'endroit où vous avez enregistré un type de publication personnalisé à l'aide de la fonction register_post_type.

'rewrite' => array ('slug' => 'courses /% cat%')

Pour changer le permalien dynamiquement du type de publication, vous devez ajouter le code ci-dessous dans le fichier functions.php:

function change_link( $post_link, $id = 0 ) {
    $post = get_post( $id );
    if( $post->post_type == 'courses' ) 
    {
       if ( is_object( $post ) ) {
          $terms = wp_get_object_terms( $post->ID, array('course') );
          if ( $terms ) {
             return str_replace( '%cat%', $terms[0]->slug, $post_link );
         }
      }
    }
    return   $post_link ;
}
add_filter( 'post_type_link', 'change_link', 1, 3 );

//load the template on the new generated URL otherwise you will get 404's the page

function generated_rewrite_rules() {
   add_rewrite_rule(
       '^courses/(.*)/(.*)/?$',
       'index.php?post_type=courses&name=$matches[2]',
       'top'
   );
}
add_action( 'init', 'generated_rewrite_rules' );

Après cela, vous devez vider les permaliens de réécriture, aller sur wp-admin> Paramètres> permaliens . il suffit de mettre à jour le paramètre de permalien à l'aide du bouton "Enregistrer les modifications".

il renverra les URL comme ci-dessous:

  • domain.com/courses/[course-name{category}}/lesson-name

Merci!

Chetan Vaghela
la source
0

Cela fonctionne pour moi:

'rewrite' => array(
        'slug' => 'portfolio',
        'with_front' => false,
        'hierarchical' => true // to display category/subcategroy
    ),
Malki Mohamed
la source
5
Cela n'utilise pas les catégories ou leur chemin d'accès, cela rend seulement le type de publication personnalisé hiérarchique.
Joris Kroos
0

Pour toute personne intéressée par la solution, sans avoir à bricoler du code PHP brut, je recommande fortement le plugin Permalink Manager Lite de Maciej Bis. C'est un épargnant de vie.

Il dispose d'un mécanisme visuel pour supprimer ou ajouter la partie que vous souhaitez dans l'URL du type de publication personnalisé en fonction des `` infrastructures '':

Capture d'écran de Permalink Manager Lite

(Avec toutes les difficultés liées à la simple structuration d'URL avec des types de publication personnalisés, nous étions sur le point d'abandonner WP et de passer à un autre CMS. Mais ce plugin en conjonction avec ACF et CPTUI ou Pods rend Wordpress assez professionnel.)

Khom Nazid
la source