Tambahkan basis kategori ke url dalam jenis pos kustom / taksonomi

23

Saya sedang membangun sistem tipe LMS di WordPress, dikendalikan oleh Custom Post types.
Jenis posting disebut Lessons(dengan siput courses) dan memiliki satu custom taxonomy(kategori) yang disebut courses.

Struktur url domain ditampilkan sekarang sebagai:

domain.com/courses/lesson-name.

Saya ingin menjadi:

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

atau pada dasarnya:

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

di sini adalah plugin yang saya tulis yang mengendalikan CPTssekarang.

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
sumber
Baru-baru ini, saya menghadapi masalah ini. Terpecahkan! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/…
maheshwaghmare
LARUTAN! (Setelah penelitian tanpa akhir) <br/> <br/> Anda harus memodifikasi post_type_linkfilter. lebih lanjut di: wordpress.stackexchange.com/a/167992/33667 )
T.Todua

Jawaban:

36

Ubah penulisan ulang Anda untuk menambahkan kueri kursus var:

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

Kemudian filter post_type_linkuntuk menyisipkan kursus yang dipilih ke permalink:

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

Ada juga plugin seperti Permalink Jenis Posting Kustom yang dapat melakukan ini untuk Anda.

Milo
sumber
Terima kasih, saya menghargai jawaban cepat Anda. Ini masuk akal sepenuhnya. Saya ingin tahu, di mana saya harus memasukkan filter post_type_link di? dapatkah saya pergi di bagian bawah seluruh dokumen?
Zach Russell
Saya menambahkannya ke bawah dan halaman 404.
Zach Russell
1
Anda harus menyiram penulisan ulang, kunjungi halaman pengaturan permalinks.
Milo
juga perhatikan Anda mungkin akan memiliki bentrokan dengan taksonomi dan tipe tulisan yang berbagi siput yang sama.
Milo
Di mana saya sekarang adalah membuat permalinks benar, tapi itu tidak mengeksekusi dengan benar (ini 404ing lembut). Adakah rekomendasi tentang apa yang dapat saya lakukan untuk memperbaikinya? Aku jauh dari permalink flush penulisan ulang. Cukup klik 'simpan' dan itu memperbarui file (itu nginx sehingga dikendalikan di file nginx.conf)
Zach Russell
1

Ya! Setelah banyak penelitian saya mendapat plugin ' Custom Permalinks ' . Yang memenuhi persyaratan saya, misalnya URL khusus

  • untuk Kategori
  • untuk Posting
  • untuk Custom Post
  • untuk Taksonomi Kustom, dll.

Suka Jenis Posting Kustom ini - Posting :

masukkan deskripsi gambar di sini

maheshwaghmare
sumber
1

Dapatkan solusinya!

Untuk memiliki permalink hierarkis untuk jenis posting kustom, pasang Permalink Jenis Posting Kustom ( https://wordpress.org/plugins/custom-post-type-permalinks/ ) plugin.

Perbarui jenis posting terdaftar. Saya memiliki nama jenis posting sebagai pusat bantuan

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

Dan di sini adalah taksonomi terdaftar

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

Baris ini membuat permalink Anda berfungsi

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

Anda dapat menghapus %post_id%dan menyimpannya/%help_centre_category%/%postname%/"

Jangan lupa untuk membersihkan permalink dari dasbor.

Varsha Dhadge
sumber
1

Solusi bagi saya memiliki tiga bagian. Dalam kasus saya, jenis posting disebut trainings.

  1. Tambahkan 'rewrite' => array('slug' => 'trainings/%cat%')ke register_post_typefungsi.
  2. Ubah siput untuk memiliki kategori dinamis.
  3. "Dengarkan" ke URL dinamis baru dan muat templat yang sesuai.

Jadi di sini adalah cara mengubah permalink secara dinamis untuk jenis posting yang diberikan. Tambahkan ke 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 );

... dan ini adalah cara memuat templat yang sesuai pada URL dinamis baru. Tambahkan ke 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' );

Itu dia! Ingatlah untuk menyegarkan permalink dengan menyimpan permalink lagi di de backend. Atau gunakan flush_rewrite_rules()fungsinya.

Floris
sumber
1

Anda perlu memperbarui baris di bawah ini di mana Anda telah mendaftarkan jenis posting khusus menggunakan fungsi register_post_type.

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

Untuk mengubah permalink secara dinamis dari jenis posting Anda harus menambahkan kode di bawah ini dalam file 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' );

Setelah itu, Anda perlu membilas ulang permalink, buka wp-admin> Pengaturan> permalink . perbarui pengaturan permalink menggunakan tombol "Simpan Perubahan".

itu akan mengembalikan url seperti di bawah ini:

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

Terima kasih!

Chetan Vaghela
sumber
0

Ini bekerja untuk saya:

'rewrite' => array(
        'slug' => 'portfolio',
        'with_front' => false,
        'hierarchical' => true // to display category/subcategroy
    ),
Malki Mohamed
sumber
5
Ini tidak menggunakan kategori atau jalur mereka, itu hanya membuat tipe posting kustom hirarkis.
Joris Kroos
0

Bagi siapa pun yang tertarik dengan solusinya, tanpa harus mengutak-atik kode PHP mentah, saya sangat merekomendasikan plugin Permalink Manager Lite oleh Maciej Bis. Itu adalah penyelamat hidup.

Ini memiliki mekanisme visual untuk menghapus atau menambahkan bagian apa pun yang Anda inginkan di URL jenis pos khusus berdasarkan 'permastructs':

Cuplikan layar Permalink Manager Lite

(Dengan semua rasa sakit yang terlibat dalam penataan URL sederhana dengan jenis posting khusus, kami hampir menyerah pada WP dan pindah ke CMS lain. Tetapi plugin ini bersama dengan ACF dan CPTUI atau Pods membuat Wordpress menjadi cukup profesional.)

Khom Nazid
sumber