Quy tắc viết lại WordPress cho loại bài đăng tùy chỉnh và phân loại


9

Tôi đã tìm thấy nơi này là một nguồn thông tin tốt trong quá khứ thông qua rất nhiều Google cho các vấn đề tôi gặp phải. Câu hỏi của tôi liên quan đến các quy tắc viết lại dài dòng mà WordPress sử dụng.

Tôi đã thiết lập một loại bài đăng tùy chỉnh được gọi là dự án và tôi đã đăng ký một phân loại tùy chỉnh được gọi là dự án . Tất cả mọi thứ hoạt động tuyệt vời ngoại trừ các tùy chọn sên viết lại khi chúng kết thúc xung đột - rất có thể là do các quy tắc viết lại.

Về cơ bản đây là cấu trúc tôi đang muốn đạt được:

  • example.com/work/%taxonomy%/%post_name%/ (cho bài viết)
  • example.com/work/%taxonomy%/ (danh sách bài viết thuộc một thuật ngữ phân loại cụ thể)
  • example.com/work/ (đi đến page-work.php bao gồm taxonomy.php để liệt kê tất cả các bài đăng liên quan đến phân loại đó)

Đây là mã tôi có cho đến nay, nhưng tôi cần trợ giúp để viết các quy tắc WP_Rewrite vì đây là bit tôi hơi bối rối.

$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => ''
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'hierarchical' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
    'query_var' => "project", // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type('project' , $args);

// Showcase Taxonomy
register_taxonomy('projects', array('project'), array(
    'public' => true,
    'hierarchical' => true,
    'label' => 'Project Categories', 
    'singular_label' => 'Project Category',
    'query_var' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
    )
);

Rất cảm ơn vì sự giúp đỡ của bạn! :-)



@ChristopherDavis Cảm ơn, tôi sẽ xem xét thêm một chút nữa và xem cách tôi tiếp tục.
matt_d_rat

1
Tôi nghĩ rằng câu hỏi này có thể được trả lời bằng cách nhìn vào Trộn các loại bài viết tùy chỉnh và cấu trúc viết lại phân loại? Nếu câu hỏi đó không giúp bạn, vui lòng chỉnh sửa câu hỏi này để cho biết nó khác nhau như thế nào.
Jan Fabry

Câu trả lời:


1

Hy vọng điều này có thể giải quyết vấn đề của bạn

function my_custom_post_type() {
$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => '',
    'menu_name' => 'Projects' 
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
        'hierarchical' => false,
        'has_archive' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
        'query_var' => true, // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type( 'work' , $args );

}
function my_custom_taxonomies() {

    $labels = array(
        'name' => __( 'Taxonomy', 'taxonomy general name' ),
        'singular_name' => __( 'Taxonomy', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Taxonomy' ),
        'all_items' => __( 'All Taxonomy' ),
        'parent_item' => __( 'Parent Taxonomy' ),
        'parent_item_colon' => __( 'Parent Taxonomy:' ),
        'edit_item' => __( 'Edit Taxonomy' ), 
        'update_item' => __( 'Update Taxonomy' ),
        'add_new_item' => __( 'Add New Taxonomy' ),
        'new_item_name' => __( 'New Taxonomy Name' ),
        'menu_name' => __( 'Taxonomy' ),
    );  

    register_taxonomy( 'taxonomy', array('work'), array (
                    'labels' => $labels,
                    'hierarchical' =>false,
                    'show_ui' => true,
                    'rewrite' => array( 'slug' => 'work/taxonomy'),
                    'query_var' => true,
                    'show_in_nav_menus' => true,
                    'public' => true,
            ));
}

add_action('init', 'my_custom_post_type', 0);
add_action('init', 'my_custom_taxonomies', 10);

những gì bạn cần tạo là archive-work.php (kho lưu trữ loại bài đăng của bạn) và taxonomy.php sẽ sử dụng để hiển thị kho lưu trữ phân loại tùy chỉnh của bạn.


đừng quên thay đổi "phân loại" cho tên phân loại của riêng bạn. Đừng sử dụng cùng giá trị với post_type của bạn. cố gắng sử dụng thể loại cho lần thử đầu tiên. công việc / category, register_taxonomy ( 'thể loại, array (' công việc '), array (......
nonsensecreativity

1

Tôi đã có cùng một vấn đề và sau rất nhiều khó khăn, tôi đã kết thúc với giải pháp này.
Chỉ cần thêm mã này vào mã của bạn

global $wp_rewrite;
$wp_rewrite->flush_rules(); 

function my_custom_post_type() {
    $labels = array(
        'name' => _x('Projects', 'post type general name'),
        'singular_name' => _x('Project', 'post type singular name'),
        'add_new' => _x('Add New', 'project item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => '',
        'menu_name' => 'Projects' 
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
            'hierarchical' => false,
            'has_archive' => true,
        'rewrite' => array('slug'=>'work', 'with_front'=>false),
        'show_ui' => true,
        '_builtin' => false, // It's a custom post type, not built in!
        'capability_type' => 'post',
            'query_var' => true, // This goes to the WP_Query schema
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
    );

    register_post_type( 'work' , $args );

    global $wp_rewrite;   
    $wp_rewrite->flush_rules();    // this should help 
}

5
$ wp_rewrite-> flush_rules () không nên chạy thường xuyên, nó chỉ nên được chạy trên các móc kích hoạt hoặc hủy kích hoạt hoặc càng ít càng tốt. Nó nói như vậy ở đây: codex.wordpress.org/Rewrite_API/flush_rules ALSO có khá nhiều chức năng tương tự như cái này: codex.wordpress.org/Feft_Reference/flush_rewrite_rules
Jared

Một lưu ý khác, đây là cách tôi hoàn thành nó: pastebin.com/k7QvxKLi
Jared

@Jared Cảm ơn bạn đã chỉ ra, nhưng tôi không thể tìm ra cách để đồng bộ điều này khi điều này được tích hợp trong chủ đề của chúng tôi (tức là không thông qua plugin). Xin đề nghị.
Dipesh KC

Mã sẽ đi trong functions.phptrường hợp đó. Mã cho một plugin và một chủ đề hoàn toàn giống nhau, sự khác biệt duy nhất là trong các chủ đề mà nó luôn đi vào functions.phphoặc một tệp có trongfunctions.php
Jared

2
Tôi sẽ đề nghị sử dụng after_switch_themehook, nó mới đến 3.3 (IIRC).
Cristian

0

Một lời giải thích chi tiết hơn là trên một bài đăng khác , nhưng đây là những phần cơ bản bạn cần thêm:

  1. Đăng ký phân loại của bạn và cpt là như bạn làm. Đảm bảo sên viết lại của bạn cho taxo là "tên cơ sở" và sên viết lại cho cpt là "basename /% tax_name%".

  2. Nói cho wordpress biết phải làm gì với "% tax_name%" như thế này:

    function filter_post_type_link($link, $post)
    {
    if ($post->post_type != 'custom_post_type_name')
        return $link;
    
    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, link); // see custom function defined below
    }
    return $link;
    }
    add_filter('post_type_link', 'filter_post_type_link', 10, 2);
    
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.