Thêm danh mục vào loại bài đăng tùy chỉnh trong permalink


22

Tôi biết mọi người đã hỏi điều này trước đây và đã đi xa hơn khi thêm loại bài đăng tùy chỉnh và viết lại cho permalink.

Vấn đề là tôi có 340 danh mục hiện có mà tôi muốn tiếp tục sử dụng. Tôi đã từng có thể nhìn thấy / thể loại / tiểu thể loại / tên bài

Bây giờ tôi có sên của mã xác nhận / postname. Chọn danh mục không còn hiển thị trong permalink ... Tôi đã không thay đổi cài đặt permalink trong quản trị viên thành bất kỳ điều gì khác.

Có điều gì tôi đang thiếu hoặc cần thêm vào mã này?

function jcj_club_post_types() {
    register_post_type( 'jcj_club', array(
        'labels' => array(
            'name' => __( 'Jazz Clubs' ),
            'singular_name' => __( 'Jazz Club' ),
            'add_new' => __( 'Add New' ),
            'add_new_item' => __( 'Add New Jazz Club' ),
            'edit' => __( 'Edit' ),
            'edit_item' => __( 'Edit Jazz Clubs' ),
            'new_item' => __( 'New Jazz Club' ),
            'view' => __( 'View Jazz Club' ),
            'view_item' => __( 'View Jazz Club' ),
            'search_items' => __( 'Search Jazz Clubs' ),
            'not_found' => __( 'No jazz clubs found' ),
            'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
            'parent' => __( 'Parent Jazz Club' ),
        ),
        'public' => true,
        'show_ui' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'menu_position' => 5,
        'query_var' => true,
        'supports' => array( 
            'title',
            'editor',
            'comments',
            'revisions',
            'trackbacks',
            'author',
            'excerpt',
            'thumbnail',
            'custom-fields',
        ),
        'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
        'taxonomies' => array( 'category','post_tag'),
        'can_export' => true,
    )
);

2
đây có thể là một câu hỏi ngớ ngẩn, nhưng bạn đã tuôn ra những bài viết của mình chưa?
trẻ em kristina

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

Câu trả lời:


16

Có 2 điểm tấn công để che khi bạn thêm quy tắc viết lại loại bài tùy chỉnh:

Viết lại quy tắc

Điều này xảy ra khi các quy tắc viết lại đang được tạo ra wp-includes/rewrite.phptrong WP_Rewrite::rewrite_rules(). WordPress cho phép bạn lọc các quy tắc viết lại cho các yếu tố cụ thể như bài đăng, trang và các loại lưu trữ khác nhau. Nơi bạn nhìn thấy posttype_rewrite_rulescác posttypephần nên là tên của bài tùy chỉnh kiểu của bạn. Ngoài ra, bạn có thể sử dụng post_rewrite_rulesbộ lọc miễn là bạn không xóa các quy tắc bài viết tiêu chuẩn.

Tiếp theo chúng ta cần hàm để thực sự tạo các quy tắc viết lại:

// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );

function add_permastruct( $rules ) {
    global $wp_rewrite;

    // set your desired permalink structure here
    $struct = '/%category%/%year%/%monthnum%/%postname%/';

    // use the WP rewrite rule generating function
    $rules = $wp_rewrite->generate_rewrite_rules(
        $struct,       // the permalink structure
        EP_PERMALINK,  // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
        false,         // Paged: add rewrite rules for paging eg. for archives (not needed here)
        true,          // Feed: add rewrite rules for feed endpoints
        true,          // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
        false,         // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
        true           // Add custom endpoints
    );

    return $rules;
}

Điều chính cần chú ý ở đây nếu bạn quyết định chơi xung quanh là boolean 'Thư mục đi bộ. Nó tạo ra các quy tắc viết lại cho mỗi phân đoạn của một phép hoán vị và có thể gây ra sự không phù hợp với quy tắc viết lại. Khi một URL WordPress được yêu cầu, mảng quy tắc viết lại được kiểm tra từ trên xuống dưới. Ngay sau khi một trận đấu được tìm thấy, nó sẽ tải bất cứ thứ gì nó đi qua, ví dụ như nếu phép của bạn có một trận đấu tham lam, vd. thư mục for /%category%/%postname%/và walk nằm trên nó sẽ xuất ra các quy tắc viết lại cho cả /%category%/%postname%/AND /%category%/sẽ khớp với bất cứ thứ gì. Nếu điều đó xảy ra quá sớm, bạn sẽ bị lừa.

Permalinks

Đây là chức năng phân tích permalinks loại bài đăng và chuyển đổi một hoán vị (ví dụ '/% năm% /% thángnum% /% postname% /') thành một URL thực tế.

Phần tiếp theo là một ví dụ đơn giản về những gì lý tưởng sẽ là một phiên bản của get_permalink()chức năng được tìm thấy wp-includes/link-template.php. Permalinks bài tùy chỉnh được tạo ra bởi get_post_permalink()đó là một phiên bản nhiều nước get_permalink(). get_post_permalink()được lọc bởi post_type_linkvì vậy chúng tôi sử dụng điều đó để tạo ra một cơ sở hạ tầng tùy chỉnh.

// parse the generated links
add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 );

function custom_post_permalink( $permalink, $post, $leavename, $sample ) {

    // only do our stuff if we're using pretty permalinks
    // and if it's our target post type
    if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) {

        // remember our desired permalink structure here
        // we need to generate the equivalent with real data
        // to match the rewrite rules set up from before

        $struct = '/%category%/%year%/%monthnum%/%postname%/';

        $rewritecodes = array(
            '%category%',
            '%year%',
            '%monthnum%',
            '%postname%'
        );

        // setup data
        $terms = get_the_terms($post->ID, 'category');
        $unixtime = strtotime( $post->post_date );

        // this code is from get_permalink()
        $category = '';
        if ( strpos($permalink, '%category%') !== false ) {
            $cats = get_the_category($post->ID);
            if ( $cats ) {
                usort($cats, '_usort_terms_by_ID'); // order by ID
                $category = $cats[0]->slug;
                if ( $parent = $cats[0]->parent )
                    $category = get_category_parents($parent, false, '/', true) . $category;
            }
            // show default category in permalinks, without
            // having to assign it explicitly
            if ( empty($category) ) {
                $default_category = get_category( get_option( 'default_category' ) );
                $category = is_wp_error( $default_category ) ? '' : $default_category->slug;
            }
        }

        $replacements = array(
            $category,
            date( 'Y', $unixtime ),
            date( 'm', $unixtime ),
            $post->post_name
        );

        // finish off the permalink
        $permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) );
        $permalink = user_trailingslashit($permalink, 'single');
    }

    return $permalink;
}

Như đã đề cập, đây là một trường hợp rất đơn giản để tạo một quy tắc viết lại và permalinks tùy chỉnh, và không đặc biệt linh hoạt nhưng nó đủ để giúp bạn bắt đầu.

Gian lận

Tôi đã viết một plugin cho phép bạn xác định hoán vị cho bất kỳ loại bài đăng tùy chỉnh nào, nhưng giống như bạn có thể sử dụng %category%trong cấu trúc permalink cho các bài đăng mà plugin của tôi hỗ trợ %custom_taxonomy_name%cho bất kỳ phân loại tùy chỉnh nào bạn có, custom_taxonomy_nameví dụ như tên phân loại của bạn. %club%.

Nó sẽ hoạt động như bạn mong đợi với các phân loại phân cấp / không phân cấp.

http://wordpress.org/extend/plugins/wp-perm Hạ cơ /


1
Plugin rất tuyệt, nhưng bạn có thể giải thích cách khắc phục vấn đề trong câu hỏi mà không cần plugin không?
Eugene Manuilov

Tôi đồng ý rằng thật tuyệt vời khi có plugin để giải quyết vấn đề này (tôi đã đánh dấu nó và đây là lần đầu tiên tôi nghĩ đến Q này), nhưng câu trả lời sẽ có lợi từ tóm tắt ngắn gọn về vấn đề là gì và cách thức plugin chinh phục nó. :)
Rarst

@EugeneManuilov Được rồi, xin lỗi, đây là một câu trả lời dài dòng. Đó là với tôi tước nó xuống những điều cơ bản quá!
sanchothefat

Có vẻ như lần đầu tiên $permalink = home_url(...bị ghi đè $permalink = user_trailingslashit(...và không bao giờ được sử dụng. Hay tôi đang thiếu một cái gì đó? $post_linkthậm chí không được xác định. Có phải nó đã được $permalink = user_trailingslashit( $permalink, 'single' );?
Ian Dunn

Tốt bắt, nó phải là $permalinkkhông $post_link. Chúc mừng :)
sanchothefat

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 đơn giản nhất là chỉ sử dụng plugin này: wordpress.org/plugins/custom-post-type-permalinks hoạt động hoàn hảo
Jules

Có, nhưng đó là nếu bạn có loại bài đăng tùy chỉnh duy nhất nhưng nếu bạn có nhiều loại bài đăng tùy chỉnh trong một chủ đề thì ở trên là giải pháp. Ngoài ra, nó cũng thay đổi sên danh mục của bạn giống như sên loại bài của bạn.
Varsha Dhadge

1

Tôi đã tìm thấy GIẢI PHÁP !!!

(Sau khi nghiên cứu vô tận .. Tôi có thể có các permalinks POST tùy chỉnh như:
example.com/category/sub_category/my-post-name

ở đây mã (trong hàm.php hoặc plugin):

//===STEP 1 (affect only these CUSTOM POST TYPES)
$GLOBALS['my_post_typesss__MLSS'] = array('my_product1','....');

//===STEP 2  (create desired PERMALINKS)
add_filter('post_type_link', 'my_func88888', 6, 4 );

function my_func88888( $post_link, $post, $sdsd){
    if (!empty($post->post_type) && in_array($post->post_type, $GLOBALS['my_post_typesss']) ) {  
        $SLUGG = $post->post_name;
        $post_cats = get_the_category($id);     
        if (!empty($post_cats[0])){ $target_CAT= $post_cats[0];
            while(!empty($target_CAT->slug)){
                $SLUGG =  $target_CAT->slug .'/'.$SLUGG; 
                if  (!empty($target_CAT->parent)) {$target_CAT = get_term( $target_CAT->parent, 'category');}   else {break;}
            }
            $post_link= get_option('home').'/'. urldecode($SLUGG);
        }
    }
    return  $post_link;
}

// STEP 3  (by default, while accessing:  "EXAMPLE.COM/category/postname"
// WP thinks, that a standard post is requested. So, we are adding CUSTOM POST
// TYPE into that query.
add_action('pre_get_posts', 'my_func4444',  12); 

function my_func4444($q){     
    if ($q->is_main_query() && !is_admin() && $q->is_single){
        $q->set( 'post_type',  array_merge(array('post'), $GLOBALS['my_post_typesss'] )   );
    }
    return $q;
}

-2

Bạn có một số lỗi với mã của bạn. Tôi đã dọn sạch mã hiện có của bạn:

<?php
function jcj_club_post_types() {
  $labels = array(
    'name' => __( 'Jazz Clubs' ),
    'singular_name' => __( 'Jazz Club' ),
    'add_new' => __( 'Add New' ),
    'add_new_item' => __( 'Add New Jazz Club' ),
    'edit' => __( 'Edit' ),
    'edit_item' => __( 'Edit Jazz Clubs' ),
    'new_item' => __( 'New Jazz Club' ),
    'view' => __( 'View Jazz Club' ),
    'view_item' => __( 'View Jazz Club' ),
    'search_items' => __( 'Search Jazz Clubs' ),
    'not_found' => __( 'No jazz clubs found' ),
    'not_found_in_trash' => __( 'No jazz clubs found in Trash' ),
    'parent' => __( 'Parent Jazz Club' ),
    );
  $args = array(
    'public' => true,
    'show_ui' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'menu_position' => 5,
    'query_var' => true,
    'supports' => array( 'title','editor','comments','revisions','trackbacks','author','excerpt','thumbnail','custom-fields' ),
    'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ),
    'has_archive' => true
    );
  register_post_type( 'jcj_club', $args );
  }
add_action( 'init','jcj_club_post_types' );
?>

Thay thế mã của bạn bằng mã ở trên và xem nếu nó hoạt động. Trả lời lại nếu bạn có thêm câu hỏi và tôi sẽ cố gắng giúp đỡ.

CHỈNH SỬA:

Tôi nhận thấy tôi rời khỏi 'has_archive' => true.

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.