Các loại bài đăng tùy chỉnh và template_redirect


9

Tôi có hai loại bài đăng tùy chỉnh (ví dụ post_type_1 và post_type_2) mà tôi muốn chuyển hướng đến các mẫu độc lập (single-post_type_1.php và single-post_type_2.php) để xử lý hiển thị của chúng. Tôi không muốn đặt các mẫu hiển thị trong thư mục chủ đề vì tôi muốn chúng tự chứa trong các thư mục plugin tương ứng của chúng.

Làm thế nào tôi có thể yêu cầu mỗi người trong số họ đăng ký hook template_redirect mà không ảnh hưởng đến cái khác? Hay tôi nên sử dụng một kỹ thuật khác?

Hiện tại, tôi đang làm điều này trong Plugin 1:

add_action( 'template_redirect', 'template_redirect_1' );
function template_redirect_1() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_1' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_1 . '/views/single-post_type_1.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

Và điều này trong Plugin 2:

add_action( 'template_redirect', 'template_redirect_2' );
function template_redirect_2() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_2' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_2 . '/views/single-post_type_2.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

Khi tôi đăng ký hook template_redirect của plugin 2, plugin 1 không còn hoạt động nữa.

Tui bỏ lỡ điều gì vậy?

Cách tốt nhất để làm việc này là gì?

Câu trả lời:


13

Bạn nên sử dụng bộ lọc template_include cho việc này:

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Do your processing here and define $template as the full path to your alt template.
    return $template;
}

template_redirectlà hành động được gọi trực tiếp trước khi các tiêu đề được gửi cho đầu ra của mẫu được kết xuất. Đây là một móc nối thuận tiện để thực hiện chuyển hướng 404, v.v ... nhưng không nên được sử dụng để bao gồm các đường dẫn mẫu khác vì WordPress thực hiện điều này một cách vô tư với bộ lọc 'template_include'.

template_includesingle_templatehook chỉ xử lý đường dẫn của mẫu được sử dụng để hiển thị nội dung. Đây là nơi thích hợp để điều chỉnh một đường dẫn mẫu.

Cập nhật từ nhận xét của @ChipBennett:

single_templateđã được gỡ bỏ kể từ ngày 3,4. Sử dụng {posttype} _template thay thế.


Vì vậy, điều này hoạt động, nhưng hóa ra template_redirect và single_template cũng hoạt động. Vấn đề thực sự tôi xác định là tôi có chức năng sắp xếp cột quản trị viên tùy chỉnh nối vào bộ lọc 'request' và tôi không giới hạn việc sửa đổi biến $ vars chỉ khi loại bài đăng thuộc loại nhất định. Nhưng, tôi rất vui khi biết về hook template_include. Vẫn không chắc chắn sự khác biệt giữa template_redirect, template_include và single_template mặc dù.
trước đây là

@anderly tôi cập nhật câu trả lời của tôi. Hi vọng điêu nay co ich.
Brian Fegter

Vì vậy, những gì về single_template? Liên kết này ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) cho biết nó có thể được sử dụng để điều chỉnh mẫu cho bài đăng hoặc trang khi mẫu đơn được gọi. Đây là những gì tôi đang cố gắng làm. Trong mọi trường hợp, sử dụng bộ lọc template_include hoặc single_template đều hoạt động và xuất hiện để thực hiện điều tương tự.
trước đây là

1
single_template hoạt động theo cùng một cách trừ khi nó được gọi là có điều kiện. Điều này giúp cách ly các thay đổi đường dẫn thay vì sử dụng bộ lọc búa trên toàn bộ trang web.
Brian Fegter

1
rất tuyệt ... tôi không biết về template_include
helgatheviking
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.