Thêm phần mở rộng .html (dot HTML) cho các loại bài đăng tùy chỉnh


10

Có cách nào để thêm .htmlphần mở rộng cho các loại bài đăng tùy chỉnh mà không cần plugin không?

Đối với bài viết tôi có thể sử dụng /%postname.htmltrên cài đặt permalink

Đối với các trang tôi có thể sử dụng:

add_action('init', 'change_page_permalink', -1);
function change_page_permalink() {
    global $wp_rewrite;
    if ( strstr($wp_rewrite->get_page_permastruct(), '.html') != '.html' ) 
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
}

Đối với các loại bài tùy chỉnh ???

Có đoạn mã nào tương tự như đoạn mã trên để tôi thay đổi hoặc thêm .htmlurl vào loại bài đăng tùy chỉnh không?


5
Chỉ cần tự hỏi vì lý do gì bạn muốn thêm .html?
Vince Pettit

Vâng, function post-type_permalinksẽ ném một lỗi. Nếu bạn không nhận được lỗi này, thì bạn đã gặp phải lỗi gì đó với cài đặt gỡ lỗi của mình. Ngoài ra xin vui lòng làm lại câu hỏi của bạn với ý định chính xác trên các dòng. Cảm ơn.
kaiser

@kaiser, Chỉ để biết làm thế nào tôi có thể sử dụng các cài đặt permalink tương tự trên các loại bài đăng tùy chỉnh. Nếu tôi đặt /$postname.htmlcho các bài đăng, làm thế nào tôi có thể sử dụng tương tự cho các loại bài đăng tùy chỉnh.
dùng983248

Bạn đã không đọc một dòng tôi viết trong bình luận của tôi, phải không? Vui lòng sửa mã của bạn. Cũng -không hoạt động trong tên chức năng ...
kaiser

@kaiser Có, tôi đã làm, nhưng tôi không phải là Flash và tôi gặp vấn đề về tay, vì vậy tôi không thể gõ như tôi nghĩ hoặc nói
user983248

Câu trả lời:


8

Điều này dường như làm việc:

Tạo quy tắc viết lại như thế nào post-type/post-name.html. Bạn có thể sử dụng mảng để tạo quy tắc cho chỉ một số loại bài đăng thay vì thực hiện nó cho tất cả chúng.

add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    foreach ( get_post_types() as $t )
        $new_rules[ $t . '/([^/]+)\.html$' ] = 'index.php?post_type=' . $t . '&name=$matches[1]';
    return $new_rules + $rules;
}

Định dạng cấu trúc permalink mới cho các loại bài đăng này.

add_filter( 'post_type_link', 'custom_post_permalink' ); // for cpt post_type_link (rather than post_link)
function custom_post_permalink ( $post_link ) {
    global $post;
    $type = get_post_type( $post->ID );
    return home_url( $type . '/' . $post->post_name . '.html' );
}

Và sau đó dừng chuyển hướng các URL chuẩn để xóa dấu gạch chéo. Điều này có thể cần thêm một số công việc, vì có lẽ bạn sẽ muốn giữ chuyển hướng cho hầu hết các trường hợp.

add_filter( 'redirect_canonical', '__return_false' );

Như những người khác đã nói ở đây, sau khi thực hiện những điều trên, bạn sẽ cần phải xóa các quy tắc và điều đó có thể bằng cách truy cập options-permalink.phptrang quản trị Dashboard -> Settings -> Permalinks.


6
Oi Vinicius, một thực hành trả lời tốt là đặt tiền tố tất cả các tên hàm với wpse_59024_ (ID câu hỏi) để tránh xung đột của bản sao / mì ống;). . . Và có thêm lợi ích khi biết Câu trả lời nào mã đó thuộc về thư viện đoạn trích của chúng tôi. . . . . +1 Điểm trên!
brasofilo

Mã này sẽ ghi đè lên bất kỳ bộ lọc nào khác sử dụng post_type_linkbộ lọc
Tom J Nowell

4

Bạn có thể thêm quy tắc viết lại cho quy tắc này thay thế cho permalinks tích hợp, ví dụ: đối với loại "sản phẩm" tùy chỉnh ...

add_action('init', 'add_html_ext_to_custom_post_types');
function add_html_ext_to_custom_post_types() {
    add_rewrite_rule('^product/([^/]+)\.html', 'index.php?product=$matches[1]', 'top');
}

(Đừng quên xóa quy tắc của bạn bằng cách lưu lại permalinks của bạn hoặc sử dụng flush_rulestheo cách ghi chú @toscho ở trên).

Hãy cẩn thận

  • Tôi không nghĩ các chức năng như the_permalink()sẽ sử dụng điều này, vì vậy bạn có thể phải thêm bộ lọc post_linkđể bắt các liên kết đó. Bạn cũng có thể thêm vào redirect_canonicalbộ lọc để chuyển hướng các permalinks mặc định, sao cho / sản phẩm / foo và / sản phẩm / foo / chuyển hướng đến /product/foo.html.
  • Bạn sẽ cần thêm ghi lại bổ sung cho các URL khác mà trang web của bạn đã sử dụng, như URL nguồn cấp dữ liệu, trang tiếp theo, theo dõi, v.v. Mã ở trên sẽ chỉ hoạt động cho trang Loại bài đăng tùy chỉnh chính.

2

Nếu bạn muốn một plugin WordPress để xử lý công việc cho bạn, hãy xem Permalinks Loại tùy chỉnh trong kho lưu trữ plugin WordPress. Đã thử nghiệm trên WordPress 3.4.1 và nó hoạt động hoàn hảo.

Sau khi kích hoạt plugin, chỉ cần điều hướng đến Bảng điều khiển -> Cài đặt -> Permalinks. Bạn có thể thêm các bản viết lại cụ thể cho từng loại bài đăng tùy chỉnh đã đăng ký.


3
Không tuôn ra các quy tắc viết lại trên mỗi lần tải trang.
fuxia

mã đó không hoạt động, nếu bạn chỉ sao chép và dán mã từ xplus3.net/2010/05/20/wp3-custom-post-type-permalinks, hãy đảm bảo rằng nó hoạt động như mong đợi -1 vì không kiểm tra
user983248

@toscho làm thế nào để bạn giả sử làm điều đó hoặc để ngăn chặn điều đó?
dùng983248

1
flush_rules()chỉ nên gọi tắt / kích hoạt vì nó rất chậm. Bạn có thể kiểm tra $GLOBALS['wp_rewrite']->rulesxem các quy tắc đã được biết chưa.
fuxia

@Michael Ecklund Nó cung cấp 404 Tôi không hoạt động. Bạn đã kiểm tra mã đó?
dùng983248
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.