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


23

Ich baue ein LMS-System in WordPress, gesteuert von Custom Post types.
Der Post-Typ heißt Lessons(mit einer Prise courses) und einer custom taxonomy(Kategorie) heißt courses.

Die Domain-URL-Struktur sieht im Moment 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 das CPTsJetzt 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 );

Vor kurzem stehe ich vor diesem Problem. Gelöst! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare

LÖSUNG! (Nach endlosen Recherchen) <br/> <br/> sollten Sie den post_type_linkFilter modifizieren . Weitere
Informationen unter

Antworten:


36

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


Vielen Dank, ich schätze Ihre schnelle Antwort. Das macht durchaus Sinn. Ich bin aber gespannt, wo füge ich den Filter post_type_link an? Kann ich einfach am Ende des gesamten Dokuments gehen?
Zach Russell

Ich habe es unten hinzugefügt und es ist die Seite 404.
Zach Russell

1
Sie müssen die Schreibvorgänge leeren und die Seite mit den Einstellungen für Permalinks besuchen.
Milo

Beachten Sie auch, dass Sie wahrscheinlich einen Konflikt mit einer Taxonomie und einem Beitragstyp haben werden, die denselben Slug teilen.
Milo

Wo ich jetzt bin, ist es, die Permalinks richtig zu machen, aber es wird nicht richtig ausgeführt (es ist sanftes 404ing). Gibt es Empfehlungen, was ich tun kann, um dieses Problem zu lösen? Ich bin weg von den Permalink Flush Rewrites. Klicken Sie einfach auf "Speichern" und es aktualisiert die Datei (es ist Nginx, so dass es in der Datei nginx.conf gesteuert wird)
Zach Russell

1

Ja! Nach vielen Recherchen habe ich das Plugin ' Custom Permalinks ' bekommen . 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.

Wie dieser benutzerdefinierte Beitragstyp - Beitrag :

Bildbeschreibung hier eingeben


1

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 Hilfezentrale

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

Diese Zeile bewirkt, dass Ihr Permalink funktioniert

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

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

Vergessen Sie nicht, die Permalinks aus dem Dashboard zu entfernen.


1

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

  1. 'rewrite' => array('slug' => 'trainings/%cat%')Zur register_post_typeFunktion hinzufügen .
  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. Hinzufügen zu 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 );

... und so laden Sie die entsprechende Vorlage auf die neue dynamische URL. Hinzufügen zu 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' );

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


1

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. Gehen Sie zu wp-admin> Einstellungen> Permalinks . 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!


0

Das hat bei mir geklappt:

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

5
Dabei werden weder die Kategorien noch deren Pfad verwendet, sondern nur der benutzerdefinierte Beitragstyp wird hierarchisch dargestellt.
Joris Kroos

0

Jedem, der an der Lösung interessiert ist, ohne an rohem PHP-Code herumzubasteln, kann ich das Plugin Permalink Manager Lite von Maciej Bis nur empfehlen . Es ist ein Lebensretter.

Es verfügt über einen visuellen Mechanismus zum Entfernen oder Hinzufügen eines beliebigen Teils in der URL des benutzerdefinierten Beitragstyps basierend auf "Permastrukturen":

Screenshot von Permalink Manager Lite

(Mit all dem Aufwand, der mit der einfachen URL-Strukturierung mit benutzerdefinierten Beitragstypen verbunden ist, wollten wir auf WP verzichten und zu einem anderen CMS wechseln. Dieses Plugin in Verbindung mit ACF und CPTUI oder Pods macht Wordpress jedoch ziemlich professionell.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.