web-dev-qa-db-fra.com

Ajouter la catégorie de base à l'URL dans le type de message personnalisé/taxonomie

Je construis un système de type LMS dans WordPress, contrôlé par Custom Post types.
Le type de message s'appelle Lessons (avec un slug de courses) et comporte un custom taxonomy (catégorie) appelé courses.

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

domain.com/courses/lesson-name.

Je veux que ça devienne:

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

ou essentiellement:

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

voici le plugin que j'ai écrit qui contrôle la CPTs maintenant.

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 );
21
Zach Russell

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

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

Puis filtrez post_type_link pour 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 Custom Post Type Permalinks qui peuvent le faire pour vous.

32
Milo

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

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

Pour changer le permalien dynamiquement du type d'article, 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, puis aller dans wp-admin> Paramètres> permaliens . Il suffit de mettre à jour le paramètre de permalien à l’aide du bouton "Enregistrer les modifications".

ça va retourner les urls comme ci-dessous:

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

Je vous remercie!

1
Chetan Vaghela

La solution pour moi avait trois parties. Dans mon cas, le type de message s'appelle trainings.

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

Alors, voici comment changer le permalien dynamiquement pour un type de message 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 tout! N'oubliez pas d'actualiser les permaliens en les sauvegardant à nouveau dans le backend. Ou utilisez la fonction flush_rewrite_rules().

1
Floris

Oui! Après de nombreuses recherches, j'ai eu le plugin ' Permaliens personnalisés ' . Ce qui répond à mes exigences concerne: l'URL personnalisée, par exemple.

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

Comme ceci Type de message personnalisé - Message :

enter image description here

0
maheshwaghmare

Vous avez la solution!

Pour avoir des liens permanents hiérarchiques pour le type de message personnalisé, installez le plug-in Custom Permalinks ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Mettre à jour le type de message enregistré. J'ai le nom du type de poste 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');

Ceci est la ligne rend votre travail permanent

"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.

0
Varsha Dhadge

Ceci a fonctionné pour moi:

'rewrite' => array(
        'slug' => 'portfolio',
        'with_front' => false,
        'hierarchical' => true // to display category/subcategroy
    ),
0
Malki Mohamed