Giải quyết tên loại bài đăng tùy chỉnh so với xung đột permalink trang (cùng sên)


18

Tôi có một loại bài đăng tùy chỉnh được gọi là "visningshus", và cũng là một Trang với con sên đó. Đây là như nó phải (phải).

Hiện tại, " http://my-site.com/visningshus " liệt kê tất cả các bài đăng thuộc loại đó. Tôi muốn hiển thị trang có sên permalink thay thế.

Làm cách nào tôi có thể làm cho Wordpress không làm cho tên loại bài đăng được ưu tiên, mà thay vào đó là permalink và hiển thị Trang?

Câu trả lời:


32

Đơn giản nhất là chỉ cần vô hiệu hóa trang lưu trữ cho CPT này:

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => false,
        [...]
    )
);

Đừng quên làm mới bạn permalinks sau đó tại "Cài đặt> Permalinks"


1
Hoạt động hoàn hảo - nhưng bây giờ tất cả các permalinks bắt đầu bằng tên của loại bài đăng tùy chỉnh cung cấp 404, mặc dù chúng chính xác trong wp-admin và dường như không có việc viết lại. Điều đó có nghĩa là, tất cả các permalinks đều đúng trên trang web, nhưng tất cả các bài đăng tùy chỉnh đều cung cấp 404. Bạn có thể giúp với điều đó không? :)
Henrik Erlandsson

@HenrikErlandsson Có thể loại bài đăng của bạn có cùng tên của trang. Trong trường hợp này tôi khuyên bạn nên thay đổi tên loại bài đăng của bạn. Ví dụ: Tên loại bài đăng tùy chỉnh - Trước: sản phẩm Sau: cpt_products.
Bruno Monteiro

Rất thông minh. Giải quyết một loạt các vấn đề
bysanchy

8

Tôi không đủ uy tín để bình luận về bài đăng của @ Carl, nhưng anh ấy là câu trả lời đúng (ít nhất là trong tình huống giữ sên trangloại bài đăng tùy chỉnh giống nhau và không sử dụng tệp archive.php)

Nhưng câu trả lời của anh ta sẽ đưa ra lỗi với phân trang. Để tránh lỗi phân trang:

add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');

Cái này nhìn vào phân trang, lấy số trang và sau đó ở mặt bên buộc nó phải sử dụng trang có sên phù hợp, sau đó chèn biến trang.

Điều này ngoài việc 'has_archive' => false,đăng ở trên nên đạt được các chức năng mong muốn.

Như những người khác đã nêu, hãy chắc chắn xóa các quy tắc viết lại bằng cách truy cập Cài đặt> Permalinks sau khi thực hiện thay đổi này.

Hy vọng điều này sẽ giúp được ai đó, bởi vì tôi biết điều này đã làm tôi bối rối trong một thời gian dài.


4

Tjena Henrik!

Tôi nghĩ rằng tất cả những gì bạn cần làm là thêm quy tắc viết lại vào quy tắc Viết lại Wordpress đã được tạo. Thêm đoạn mã này vào hàm.php của chủ đề của bạn hoặc đưa nó vào dưới dạng một pugin riêng biệt ...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);

4
Nếu bất cứ ai sử dụng điều này, hãy xóa flush_rewrite_rules();Bạn không nên thay đổi quy tắc viết lại initmỗi lần. Tải lại một lần rồi xóa nó hoặc xóa thủ công permalinks bằng cách đi tới cài đặt permalink trong bảng điều khiển quản trị và nhấp vào "Lưu thay đổi"
tehlivi

0

Tôi đã giải quyết nó mà không giải quyết được xung đột. Tạo một trang với sên nhìn thấy và viết bất cứ điều gì bạn muốn trong đó. Hãy lưu ý về ID của trang này.

Tạo và tùy chỉnh mẫu lưu trữ-tùy chỉnh-post-type.php theo bất kỳ cách nào bạn thích (rất có thể bạn sẽ chỉ sử dụng một mẫu trang) nhưng thay thế phần vòng lặp bằng

$recent = new WP_Query("page_id=your-page-id");  
while($recent->have_posts()) : $recent->the_post();
    the_content();
endwhile;

Sau đó, khi bạn truy cập http://my-site.com/visningshus, bạn sẽ thấy nội dung được quản lý bởi trang theo đúng url.

Hãy cho tôi biết nó hoạt động.


Ý tưởng tốt đẹp, nhưng điều này là quá phức tạp. Bạn đã thử giải pháp của tôi?
kraftner

@kraftner không, tôi thì không. Lần sau tôi sẽ thử. Cảm ơn!
molokom

Điều này cũng có một số tác dụng phụ như tiêu đề và mọi thứ vẫn được tạo ra như thể nó là một trang lưu trữ chứ không phải là một trang. Tôi sẽ không tư vấn sử dụng giải pháp đó.
kraftner

Nếu ID trang thay đổi thì sao? Điều này không an toàn.
Joel James

0

Không được phép bỏ phiếu, nhưng + cho giải pháp Carls, register_post_type nên có

'has_archive' => false

Đơn giản. Tuy nhiên, khi bạn đối mặt với vấn đề phân trang, hãy xem

add_rewrite_rule

0

Điều đã sửa nó cho tôi là cài đặt lưu trữ là sai nhưng cũng đặt Cài đặt phân cấp thành sai khi thiết lập loại bài đăng tùy chỉnh của tôi!


0

Dưới đây là một giải pháp chung để ưu tiên phân trang cho nội dung loại bài đăng tùy chỉnh cho BẤT K sl loại bài đăng tùy chỉnh.

// prioritize pagination over displaying custom post type content
add_action('init', function() {
  add_rewrite_rule(
    '(.?.+?)/page/?([0-9]{1,})/?$',
    'index.php?pagename=$matches[1]&paged=$matches[2]',
    'top'
  );
});

Bên cạnh việc thêm đoạn mã này, bạn cũng nên đảm bảo rằng loại bài đăng tùy chỉnh của bạn có archive = false

và cuối cùng nhưng không kém phần quan trọng, hãy truy cập trang cài đặt Permalinks Cài đặt> Permalinks (/wp/wp-admin/options-permalink.php) và lưu cài đặt hiện tại để làm mới cấu trúc liên kết trên trang.

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.