Tạo mẫu trang tùy chỉnh với plugin?


Câu trả lời:


73

get_page_template()có thể được ghi đè thông qua page_templatebộ lọc. Nếu plugin của bạn là một thư mục chứa các mẫu dưới dạng tệp trong đó, thì đó chỉ là vấn đề chuyển tên của các tệp này. Nếu bạn muốn tạo chúng "nhanh chóng" (chỉnh sửa chúng trong khu vực quản trị và lưu chúng trong cơ sở dữ liệu?), Bạn có thể muốn ghi chúng vào một thư mục bộ đệm và tham khảo chúng, hoặc nối vào template_redirectvà làm một số eval()thứ điên rồ .

Một ví dụ đơn giản cho một plugin "chuyển hướng" đến một tệp trong cùng thư mục plugin nếu một tiêu chí nhất định là đúng:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'my-custom-page-slug' ) ) {
        $page_template = dirname( __FILE__ ) . '/custom-page-template.php';
    }
    return $page_template;
}

Chào Jan, bạn có một số mã ví dụ về cách vượt qua tệp plugin trong một mẫu trang tùy chỉnh không?
jnthnclrk

@trnsfrmr: Thật sự rất dễ, tôi đã thêm một ví dụ đơn giản vào câu trả lời của mình.
Jan Fabry

10
Lưu ý rằng điều này đã được thay thế ít nhiều bằng bộ lọc "template_include" trong các phiên bản sau (3.1+).
Inigoesdr

Hoàn hảo !!!, bạn đã tiết kiệm thời gian của tôi @JanFabry
Kishan Chauhan

Như tuyên bố của @fireydude, đây không phải là một giải pháp chung chung. Đó là một cách giải quyết mà mã hóa cứng sên trang.
Mauro Colella

22

Ghi đè get_page_template()chỉ là một hack nhanh chóng. Nó không cho phép mẫu được chọn từ màn hình Quản trị viên và sên trang được mã hóa cứng vào plugin để người dùng không có cách nào để biết mẫu đến từ đâu.

Giải pháp ưa thích sẽ là làm theo hướng dẫn này cho phép bạn đăng ký một mẫu trang ở phần sau từ trình cắm. Sau đó, nó hoạt động như bất kỳ mẫu nào khác.

 /*
 * Initializes the plugin by setting filters and administration functions.
 */
private function __construct() {
        $this->templates = array();

        // Add a filter to the attributes metabox to inject template into the cache.
        add_filter('page_attributes_dropdown_pages_args',
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the save post to inject out template into the page cache
        add_filter('wp_insert_post_data', 
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the template include to determine if the page has our 
        // template assigned and return it's path
        add_filter('template_include', 
            array( $this, 'view_project_template') 
        );

        // Add your templates to this array.
        $this->templates = array(
                'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
        );
}

Sẽ tốt hơn ( và được ưa thích ) nếu bạn có thể đăng mã có liên quan từ liên kết trong câu trả lời của mình, nếu không, đây không gì khác hơn là một bình luận cồng kềnh :-)
Pieter Goosen

Hướng dẫn thực sự ghi nhận ví dụ của Tom McFarlin là người khởi xướng phương pháp này.
fireydude

7

Vâng, nó là có thể. Tôi thấy plugin ví dụ này rất hữu ích.

Một cách tiếp cận khác xuất hiện trong đầu tôi là sử dụng API WP Filesystem để tạo tệp mẫu theo chủ đề. Tôi không chắc chắn rằng đó là cách tiếp cận tốt nhất để thực hiện, nhưng tôi chắc chắn rằng nó hoạt động!


Các plugin ví dụ được liên kết thậm chí là tài liệu khá tốt. Tôi thích điều đó. :)
Arvid

0

Không có câu trả lời trước là làm việc cho tôi. Đây là nơi bạn có thể chọn mẫu của mình trong quản trị viên Wordpress. Chỉ cần đặt nó trong tệp plugin php chính của bạn và thay đổi template-configurator.phptheo tên mẫu của bạn

//Load template from specific page
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){

    if ( get_page_template_slug() == 'template-configurator.php' ) {
        $page_template = dirname( __FILE__ ) . '/template-configurator.php';
    }
    return $page_template;
}

/**
 * Add "Custom" template to page attirbute template section.
 */
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-configurator.php'] = __('Configurator');

    return $post_templates;
}
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.