Thêm cơ sở danh mục vào url trong loại bài đăng / phân loại tùy chỉnh


23

Tôi đang xây dựng một hệ thống loại LMS trong WordPress, được kiểm soát bởi Custom Post types.
Loại bài được gọi Lessons(với một slug courses) và nó có một custom taxonomy(loại) được gọi courses.

Cấu trúc url miền hiển thị ngay bây giờ dưới dạng:

domain.com/courses/lesson-name.

Tôi muốn nó trở thành:

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

hoặc về cơ bản:

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

Đây là plugin tôi đã viết hiện đang kiểm soát CPTs.

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

Gần đây, tôi phải đối mặt với vấn đề này. Đã giải quyết! [# 188834] [1] [1]: wordpress.stackexchange.com/questions/94817/
mẹo

DUNG DỊCH! (Sau khi nghiên cứu vô tận) <br/> <br/> bạn nên sửa đổi post_type_linkbộ lọc. thêm tại: wordpress.stackexchange.com/a/167992/33667 )
T.Todua

Câu trả lời:


36

Thay đổi viết lại của bạn để thêm truy vấn khóa học var:

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

Sau đó, lọc post_type_linkđể chèn khóa học đã chọn vào 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 );

Ngoài ra còn có các plugin như Permalinks Loại bài tùy chỉnh có thể làm điều này cho bạn.


Cảm ơn bạn, tôi đánh giá cao câu trả lời nhanh chóng của bạn. Điều này làm cho ý nghĩa hoàn chỉnh. Mặc dù vậy, tôi tò mò, tôi nên chèn bộ lọc post_type_link ở đâu? tôi chỉ có thể đi ở dưới cùng của toàn bộ tài liệu?
Zach Russell

Tôi đã thêm nó vào dưới cùng và nó 404 trang.
Zach Russell

1
bạn phải viết lại, truy cập trang cài đặt permalinks.
Milo

cũng lưu ý rằng bạn có thể sẽ có một cuộc đụng độ với phân loại và loại bài đăng chia sẻ cùng một con sên.
Milo

Hiện tại tôi đang làm cho permalinks đúng, nhưng nó không thực thi chính xác (đó là 404 mềm). Bất kỳ khuyến nghị về những gì tôi có thể làm để làm cho điều này làm việc đúng? Tôi đi xa các bài viết lại permalink tuôn ra. Chỉ cần nhấp vào 'lưu' và nó cập nhật tệp (đó là nginx để nó được kiểm soát trong tệp nginx.conf)
Zach Russell

1

Vâng! Sau rất nhiều nghiên cứu, tôi đã nhận được plugin ' Permalinks tùy chỉnh ' . Điều này đáp ứng yêu cầu của tôi liên quan - URL tùy chỉnh, vd

  • cho danh mục
  • cho bài viết
  • cho bài viết tùy chỉnh
  • cho phân loại tùy chỉnh, vv

Thích Loại bài đăng tùy chỉnh này - Bài đăng :

nhập mô tả hình ảnh ở đây


1

Có giải pháp!

Để có permalinks phân cấp cho cài đặt loại bài đăng tùy chỉnh Permalinks Loại bài đăng tùy chỉnh ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Cập nhật loại bài đăng ký. Tôi có tên loại bài đăng là trung tâm trợ giúp

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

Và đây là phân loại đăng ký

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

Đây là dòng làm cho permalink của bạn làm việc

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

bạn có thể loại bỏ %post_id%và có thể giữ/%help_centre_category%/%postname%/"

Đừng quên xả permalinks từ bảng điều khiển.


1

Giải pháp cho tôi có ba phần. Trong trường hợp của tôi loại bài được gọi trainings.

  1. Thêm 'rewrite' => array('slug' => 'trainings/%cat%')vào register_post_typechức năng.
  2. Thay đổi sên để có một thể loại năng động.
  3. "Nghe" URL động mới và tải mẫu thích hợp.

Vì vậy, đây là cách thay đổi permalink động cho một loại bài đăng nhất định. Thêm vào 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 );

... Và đây là cách tải mẫu thích hợp trên URL động mới. Thêm vào 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' );

Đó là nó! Hãy nhớ làm mới các permalinks bằng cách lưu lại permalinks trong de backend. Hoặc sử dụng flush_rewrite_rules()chức năng.


1

Bạn cần cập nhật dòng dưới đây tại nơi bạn đã đăng ký loại bài đăng tùy chỉnh bằng cách sử dụng chức năng register_post_type.

'viết lại' => mảng ('slug' => 'khóa học /% cat%')

Để thay đổi động permalink của loại bài đăng, bạn phải thêm mã bên dưới vào tệp tin.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' );

Sau đó, bạn cần phải viết lại permalinks, goto wp-admin> Cài đặt> permalinks . chỉ cần cập nhật cài đặt permalink bằng nút "Lưu thay đổi".

nó sẽ trả về các url như dưới đây:

  • domain.com/cifts/[cference-name nbc Category Bolog[ /lesson-name

Cảm ơn bạn!


0

Điều này làm việc cho tôi:

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

5
Điều này không sử dụng các danh mục hoặc đường dẫn của chúng, nó chỉ làm cho loại bài đăng tùy chỉnh phân cấp.
Joris Kroos

0

Đối với bất kỳ ai quan tâm đến giải pháp, mà không cần phải sửa mã PHP thô, tôi khuyên bạn nên sử dụng plugin Permalink Manager Lite của Maciej Bis. Đó là một sự cứu rỗi.

Nó có một cơ chế trực quan để xóa hoặc thêm bất kỳ phần nào bạn muốn trong URL của loại bài đăng tùy chỉnh dựa trên 'permastructs':

Ảnh chụp màn hình của Permalink Manager Lite

(Với tất cả nỗi đau liên quan đến cấu trúc URL đơn giản với các loại bài đăng tùy chỉnh, chúng tôi đã từ bỏ WP và chuyển sang một CMS khác. Nhưng plugin này kết hợp với ACF và CPTUI hoặc Pods làm cho Wordpress khá chuyên nghiệp.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.