Loại bài đăng 404 tùy chỉnh với việc viết lại ngay cả sau khi đặt lại permalinks


7

Tôi đã tạo một loại bài đăng tùy chỉnh, trong đó các đối số (đơn giản hóa) là:

register_post_type(
    'Event',
    'public' => true,
    'rewrite' => array( 'slug' => 'eventy'),
    'has_archive' => false,
    'hierarchical' => false
)

Nó hoạt động tốt nói chung. Tuy nhiên, nếu tôi cố gắng viết lại các URL functions.php, ví dụ:

function my_post_type_link_filter_function( $post_link, $id = 0, $leavename = FALSE ) {
   return str_replace('eventy', 'eventx', $post_link);
}
add_filter('post_type_link', 'my_post_type_link_filter_function', 1, 3);

Kết quả là các URL 'eventx' mới xuất hiện chính xác trong các liên kết, danh sách, v.v., được tạo bởi WordPress. Nhưng khi tôi truy cập các URL 'eventx' đó, tôi nhận được 404. Truy cập URL 'eventy' vẫn hoạt động.

Tôi đã thử thay đổi cài đặt permalinks thành mặc định và quay lại tên bài đăng nhiều lần. Điều này được cho là để thiết lập lại permalinks và khắc phục vấn đề này cho nhiều người tôi đã thấy trực tuyến. Không dành cho tôi.

Bất cứ ai biết nguyên nhân có thể là gì? Làm thế nào để tôi đi về khắc phục sự cố này? Tôi yếu về lý thuyết viết lại URL.

Nếu bạn quan tâm, mục đích của tôi không phải là sự kiện tầm thường → sự thay thế eventx đã đề cập ở trên. Tôi thực sự muốn trượt trong năm / tháng một sự kiện bắt đầu (không phải khi nó được xuất bản) vào URL của nó. Gỡ lỗi khiến tôi nhận ra tôi có một vấn đề cơ bản hơn vì ngay cả việc viết lại x → y tầm thường này vẫn ném 404s.

Cảm ơn vì đã đọc!

[làm rõ thêm]

Hiện tại tôi đã nói ba sự kiện (bài viết trong loại bài đăng tùy chỉnh của tôi) được gọi là "Chuyến đi câu cá". Chúng được gán permalinks theo mặc định như

  • mysite.com/events/fishing-trip
  • mysite.com/events/fishing-trip-2
  • mysite.com/events/fishing-trip-3

Đó là nhàm chán và không phù hợp.

Tôi muốn thay thế

  • mysite.com/events/2013/janftime/fishing-trip
  • mysite.com/events/2013/may/fishing-trip
  • mysite.com/events/2013/may/fishing-trip-2
  • mysite.com/events/2014/march/fishing-trip

Đẹp hơn và nhiều thông tin hơn.

Tôi không quan tâm đến việc có các trang theo thể loại như

  • mysite.com/events/2013

Năm và tháng chỉ là mỹ phẩm trong URL.


2
Lọc 'post_type_link'chỉ đơn giản là thay đổi URL mà WordPress tạo ra khi nó xuất ra một permalink cho loại bài đăng của bạn. Khi bạn truy cập một trong những URL đó, WordPress không biết phải làm gì với chúng hoặc chúng phải trỏ đến điều gì, vì bạn chưa làm gì để tạo quy tắc viết lại cho các yêu cầu đến. Không biết bạn muốn định dạng nào cho các liên kết của mình, bạn không thể đưa ra câu trả lời ngoài việc chỉ cho bạn add_rewrite_ruleadd_rewrite_tag.
Milo

cảm ơn @ milo bài đã được chỉnh sửa để thêm thông tin về những gì tôi muốn URL
Jonathan

Câu trả lời:


8

Bước 1, thêm các thẻ viết lại cho các vars truy vấn năm và tháng sự kiện tùy chỉnh, sau đó đăng ký loại bài đăng sự kiện với các thẻ đó trong đối số slug của đối số ghi lại:

function wpa83531_register_event_post_type(){

    add_rewrite_tag('%event_year%','(\d+)');
    add_rewrite_tag('%event_month%','(.+)');

    register_post_type( 'event',
        array(
            'public' => true,
            'rewrite' => array( 'slug' => 'events/%event_year%/%event_month%' ),
            'has_archive' => false,
            'hierarchical' => false,
            'supports' => array('custom-fields', 'title', 'editor')
        )
    );

}
add_action( 'init', 'wpa83531_register_event_post_type' );

Bước 2, lọc liên kết loại bài đăng để thay thế các thẻ đó bằng các giá trị từ các trường tùy chỉnh event_yearevent_month. Nếu các trường tùy chỉnh không tồn tại, một số giá trị mặc định được chèn để bạn ít nhất có thể xem trước một bài đăng mà không gặp lỗi:

function wpa83531_event_post_link( $permalink, $post, $leavename ) {
    if ( stripos( $permalink, '%event_year%' ) == false )
        return $permalink;

    if ( is_object( $post ) && 'event' == $post->post_type ) {

        $default_year = '1970';
        $default_month = 'january';

        if( $event_year = get_post_meta( $post->ID, 'event_year', true ) ){
            $permalink = str_replace( '%event_year%', $event_year, $permalink );
        } else {
            $permalink = str_replace( '%event_year%', $default_year, $permalink );
        }

        if( $event_month = get_post_meta( $post->ID, 'event_month', true ) ){
            $permalink = str_replace( '%event_month%', $event_month, $permalink );
        } else {
            $permalink = str_replace( '%event_month%', $default_month, $permalink );
        }

    }

    return $permalink;
}

add_filter( 'post_type_link', 'wpa83531_event_post_link', 10, 3 );

0

Bạn phải đặt 'viết lại' => false trong register_post_type (); và thêm sau khi đóng register_post_type ():

// 404 CPT WP bug...

global $wp_rewrite;
$projet_structure = '/projets/%projet%';
$wp_rewrite->add_rewrite_tag("%projet%", '([^/]+)', "projet=");
$wp_rewrite->add_permastruct('projet', $projet_structure, false);

Trường hợp projet là CPT của tôi.

Bạn có thể kiểm tra ở đây để biết thêm.

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.