it-swarm.com.de

Hinzufügen einer Kategoriebasis zur URL in benutzerdefiniertem Beitragstyp/Taxonomie

Ich erstelle ein LMS-System in WordPress, das von Custom Post types gesteuert wird.
Der Beitragstyp heißt Lessons (mit einer Menge von courses) und hat einen custom taxonomy (Kategorie) namens courses.

Die Domain-URL-Struktur sieht momentan so aus:

domain.com/courses/lesson-name.

Ich möchte, dass es wird:

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

oder im Wesentlichen:

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

hier ist das Plugin, das ich geschrieben habe und das jetzt die CPTs steuert.

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

Ändern Sie Ihre Umschreibung, um die Kursabfrage var hinzuzufügen:

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

Filtern Sie dann post_type_link, um den ausgewählten Kurs in den Permalink einzufügen:

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 );

Es gibt auch Plugins wie Custom Post Type Permalinks , die dies für Sie tun können.

32
Milo

Sie müssen die folgende Zeile aktualisieren, in der Sie einen benutzerdefinierten Beitragstyp mithilfe der Funktion register_post_type registriert haben.

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

Um den Permalink des Post-Typs dynamisch zu ändern, müssen Sie den folgenden Code in die Datei functions.php einfügen:

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' );

Danach müssen Sie die Permalinks für das Neuschreiben leeren und zu wp-admin> Einstellungen> Permalinks gehen. Aktualisieren Sie einfach die Permalink-Einstellungen mit der Schaltfläche "Änderungen speichern".

es werden URLs wie folgt zurückgegeben:

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

Vielen Dank!

1
Chetan Vaghela

Die Lösung für mich hatte drei Teile. In meinem Fall heißt der Beitragstyp trainings.

  1. Fügen Sie der register_post_type -Funktion 'rewrite' => array('slug' => 'trainings/%cat%') hinzu.
  2. Ändern Sie den Slug, um eine dynamische Kategorie zu erhalten.
  3. Hören Sie sich die neue dynamische URL an und laden Sie die entsprechende Vorlage.

Hier erfahren Sie, wie Sie den Permalink für einen bestimmten Beitragstyp dynamisch ändern. Zu functions.php hinzufügen:

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 );

... und so laden Sie die entsprechende Vorlage auf die neue dynamische URL. Zu functions.php hinzufügen:

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' );

Das ist es! Denken Sie daran, die Permalinks zu aktualisieren, indem Sie sie im Backend erneut speichern. Oder verwenden Sie die Funktion flush_rewrite_rules().

1
Floris

Ja! Nach vielen Recherchen habe ich das Plugin ' Benutzerdefinierte Permalinks ' . Was meine Anforderungen erfüllt, betrifft - benutzerdefinierte URL, z.

  • für Kategorie
  • für die Post
  • für benutzerdefinierte Post
  • für benutzerdefinierte Taxonomie usw.

Gefällt mir Benutzerdefinierter Beitragstyp - Beitrag :

enter image description here

0
maheshwaghmare

Habe die Lösung!

Um hierarchische Permalinks für benutzerdefinierten Post-Typ zu erhalten, installieren Sie das Plugin für benutzerdefinierte Post-Typ-Permalinks ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Aktualisieren Sie den Typ des registrierten Beitrags. Ich habe den Namen des Beitragstyps als Hilfezentrum

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');

Und hier ist Taxonomie registriert

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');

Mit dieser Zeile funktioniert Ihr Permalink

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

sie können %post_id% entfernen und /%help_centre_category%/%postname%/" behalten

Vergiss nicht, die Permalinks aus dem Dashboard zu entfernen.

0
Varsha Dhadge

Das hat bei mir geklappt:

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