Mẫu CPT không hiển thị - Nhận 404


8

Tôi đang phát triển một plugin Loại bài đăng tùy chỉnh, hoạt động tốt trong dev. Bây giờ tôi đã chuyển nó sang sản xuất, tôi nhận được 404 khi tôi cố gắng hiển thị mẫu cho CPT.

Vì vậy, hai câu hỏi:

1- Có cơ chế nào để xác định đường dẫn WP đã đi qua hệ thống phân cấp không?

2- Tại sao nó không chỉ cho tôi trang duy nhất hoặc trang chỉ mục?

Tôi đã bỏ $ wp_query và một stacktrace vào cuối 404. Đây là một phần của những gì tôi tìm thấy:

[query] => Array
    (
        [page] => 
        [pagename] => refletters/proximity
    )

[request] => SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND (wp_posts.ID = '0') AND wp_posts.post_type = 'page'  ORDER BY wp_posts.post_date DESC 
[posts] => Array
    (
    )

[queried_object] => 
[queried_object_id] => 0

Và dấu vết ngăn xếp:

2013-04-27 22:16:41 - 24.52.197.40 - TRACE - index.php - 404.php[39] - 
    wordpress/wp-content/themes/notoriousconsultant/404.php[39] - aaLog->logtrace
    wordpress/wp-includes/template-loader.php[50] - include
    wordpress/wp-blog-header.php[16] - require_once
    wordpress/index.php[17] - require

Cảm ơn bạn đã giúp đỡ.

Câu trả lời:


14

Luôn tuôn ra các quy tắc viết lại khi bạn đăng ký một loại bài đăng công khai hoặc phân loại mới. Mặt khác, các quy tắc viết lại nội bộ sẽ không tính đến điều đó khi một URL được ánh xạ tới một truy vấn.

Bạn có thể tự động hóa quá trình đó bằng cách nối vào registered_post_typeregistered_taxonomy.

Dưới đây là mã cập nhật, dựa trên phản hồi từ ý kiến ​​và những người khác.

Tải xuống dưới dạng plugin T5 Silent Flush trên GitHub.

add_action( 'registered_post_type', 't5_silent_flush_cpt', 10, 2 );
add_action( 'registered_taxonomy',  't5_silent_flush_tax', 10, 3 );

/**
 * Flush rules for custom post types.
 *
 * @wp-hook registered_post_type
 * @param   string $post_type
 * @param   stdClass $args
 * @return  void
 */
function t5_silent_flush_cpt( $post_type, $args )
{
    if ( $args->_builtin )
        return;

    if ( ! $args->public )
        return;

    if ( ! $args->publicly_queryable )
        return;

    if ( ! $args->rewrite )
        return;

    $slug = $post_type;

    if ( isset ( $args->rewrite['slug'] ) && is_string( $args->rewrite['slug'] ) )
        $slug = $args->rewrite['slug'];

    $rules = get_option( 'rewrite_rules' );

    if ( ! isset ( $rules[ $slug . '/?$'] ) )
        flush_rewrite_rules( FALSE );
}

/**
 * Flush rules for custom post taxonomies.
 *
 * @wp-hook registered_taxonomy
 * @param   string $taxonomy
 * @param   string $object_type
 * @param   array  $args
 * @return  void
 */
function t5_silent_flush_tax( $taxonomy, $object_type, $args )
{
    // No idea why we get an array here, but an object for post types.
    // Objects are easier to write, so ...
    $args = (object) $args;

    if ( $args->_builtin )
        return;

    if ( ! $args->public )
        return;

    if ( ! $args->rewrite )
        return;

    $slug = $taxonomy;

    if ( isset ( $args->rewrite['slug'] ) && is_string( $args->rewrite['slug'] ) )
        $slug = $args->rewrite['slug'];


    $rules = get_option( 'rewrite_rules' );

    if ( ! isset ( $rules[ $slug . '/(.+?)/?$'] ) )
        flush_rewrite_rules( FALSE );
}

Điều này sẽ tuôn ra các quy tắc mỗi khi bạn tạo một loại bài đăng mới hoặc phân loại. Không cần phải truy cập lại cài đặt permalink.


Tôi đang nghĩ đến việc thêm nó vào plugin CPT. Có vẻ không hợp lý khi yêu cầu người dùng phải có một plugin khác để plugin của tôi hoạt động.
NotoriousWebmaster

Phải, tất nhiên. Tôi chỉ muốn cung cấp một ví dụ có thể sử dụng lại cho những độc giả khác có cùng vấn đề.
fuxia

8
Âm thanh như thế này nên là cốt lõi
Scott Kingsley Clark

Có một vài câu hỏi về vấn đề này: điều này sẽ tốn nhiều tài nguyên như việc xóa các quy tắc viết lại và điều này có chạy mỗi khi WP tải không?
Manny Fleurmond

@MannyFleurmond Có, nó sẽ chạy mỗi khi loại bài đăng được đăng ký. Nhưng các quy tắc chỉ được xóa khi cần thiết và get_option()giá trị đến từ bộ đệm.
fuxia
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.