Có thể xác định mẫu cho loại bài đăng tùy chỉnh trong plugin độc lập với chủ đề đang hoạt động không?


8

Tôi đang viết một plugin để quản lý dữ liệu về các dự án nguồn mở. Tôi đã phát triển một mô hình đối tượng và đã tạo thành công tất cả các loại bài đăng và phân loại tùy chỉnh, cũng như thực hiện các khả năng / vai trò chính xác bằng cách sử dụng Membersplugin. Người dùng thích hợp có thể tạo, sửa đổi và xóa bài đăng của riêng họ và quản trị viên có thể phê duyệt chúng, cũng như sửa đổi và xóa bài đăng của bất kỳ ai.

Vấn đề của tôi là, tôi muốn xác định mẫu cho một Dự án và cho một danh sách Dự án (đơn và lưu trữ, tôi tin rằng - Tôi chưa bao giờ làm việc với Wordpress ở cấp độ này), nhưng tôi không muốn The Loop dựa vào trên chủ đề hiện tại để hiển thị trang cho một Dự án hoặc danh sách Dự án. Nếu tôi đang sử dụng chủ đề TwentyTen, tôi muốn nó sử dụng mẫu plugin của tôi cho các loại bài đăng tùy chỉnh đó. Nếu tôi đang sử dụng chủ đề TwentyEleven, tôi vẫn muốn nó sử dụng mẫu plugin của tôi cho các loại bài đăng tùy chỉnh đó.

Tôi muốn điều này tuân theo mô hình "nó chỉ hoạt động", nhưng ngay bây giờ người dùng không thể bỏ thư mục vào thư mục plugin - họ phải thêm các tệp thích hợp vào thư mục chủ đề mỗi khi họ chuyển chủ đề. Tôi đã kiểm tra hệ thống phân cấp mẫu và tôi có tên tệp chính xác, nhưng chúng không được Wordpress sử dụng nếu chúng nằm trong thư mục plugin hoặc trong thư mục plugin / mẫu.

Cảm ơn!


Tất nhiên, dường như tôi luôn tìm thấy câu trả lời ngay sau khi tôi đăng câu hỏi ... Có vẻ như tôi cần thêm vào single_templatebộ lọc để thực hiện việc này. Nguồn: codex.wordpress.org/Plugin_API/Filter_Reference/single_template (1 danh tiếng, vì vậy nó sẽ không để tôi trả lời câu hỏi của riêng tôi!)
ZachM

single_templatechạy cho các bài viết và trang cá nhân. Bạn đang mô tả bằng cách sử dụng nó cho danh sách các dự án nên bạn cần một bộ lọc khác - trả lời bên dưới
sanchothefat

Câu trả lời:


7

Bạn cần sử dụng template_includebộ lọc là bộ lọc chung cho tất cả các vùi của mẫu.

add_filter( 'template_include', 'my_plugin_templates' );
function my_plugin_templates( $template ) {
    $post_types = array( 'project' );

    if ( is_post_type_archive( $post_types ) && ! file_exists( get_stylesheet_directory() . '/archive-project.php' ) )
        $template = 'path/to/list/template/in/plugin/folder.php';
    if ( is_singular( $post_types ) && ! file_exists( get_stylesheet_directory() . '/single-project.php' ) )
        $template = 'path/to/singular/template/in/plugin/folder.php';

    return $template;
}

Tôi đã không kiểm tra đầy đủ bit lưu trữ loại bài đăng, bạn có thể cần bao gồm một kiểm tra sử dụng is_tax( $taxonomies )để làm cho nó hoạt động trên kho lưu trữ phân loại tùy chỉnh liên quan.


Cảm ơn! Điều này có ích. Mặc dù các dòng $theme = wp_get_theme();if ( $theme-> stylesheet...không phải là những gì tôi cần ở đây (tôi cần nó hoàn toàn độc lập với các chủ đề - có thể tôi đã nói nó trước đây một cách khó hiểu). Phần còn lại của mã có vẻ tốt!
ZachM

Hoạt động tuyệt vời! Cần một dấu chấm phẩy sau hai $template=...dòng mặc dù ... không bắt được điều đó lần đầu tiên và đang tự hỏi điều gì đã xảy ra. Cảm ơn!
ZachM

@ZachM d'oh! xin lỗi - tôi sẽ sửa nó trong câu trả lời Tôi nghĩ bạn chỉ muốn ghi đè 2 chủ đề đó nhưng điều bạn thực sự cần làm là kiểm tra chủ đề hiện tại về sự tồn tại của các tệp mẫu đó. Bạn có muốn giúp đỡ với bit đó không?
sanchothefat

Đây có phải là chủ đề thực sự độc lập? tôi nghĩ single.php vv có chứa get_header () / get_footer () và rất nhiều mẫu html cụ thể?
Steve

1
@Eherman nó vừa được truyền vào hàm bao gồm của PHP. Hoạt động tốt cho tôi. Là con đường tuyệt đối của bạn chắc chắn đúng? ví dụ. bạn có thể cần phải sử dụngplugins_dir_path( __FILE__ ) . 'template.php'
sanchothefat 17/03/2016
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.