Có thể làm chủ đề cháu?


15

Nếu tôi sử dụng một trong những khung phổ biến như Genesis, có thể tạo chủ đề cho cháu không?

Ví dụ, tôi muốn sử dụng Genesis làm xương sống cho tất cả các trang web của mình. Genesis được gọi là một khung nhưng thực sự là một chủ đề chính.

Sau đó, tôi chọn một trong những chủ đề con Genesis được bán tại StudioPress và muốn tiếp tục tùy chỉnh nó cho từng trang web của mình. Tôi có thể tạo một chủ đề cháu cho tất cả các trang web của mình không, và tôi sẽ làm thế nào về nó?

Câu trả lời:


17

Có và không.

Bạn có thể tạo một chủ đề con chỉ định một chủ đề con khác là cha mẹ và WordPress sẽ cố gắng sử dụng nó.

Tuy nhiên

Bạn sẽ gặp vấn đề, chưa kể rằng các nhà phát triển cốt lõi đã tuyên bố rõ ràng rằng đây không phải là hành vi mong muốn và họ sẽ không nỗ lực để hỗ trợ các chủ đề cháu.

Ví dụ: API của WP tạo sự khác biệt giữa biểu định kiểu và URL / thư mục mẫu, trong đó biểu định kiểu luôn đề cập đến chủ đề đang hoạt động và mẫu đề cập đến chủ đề gốc, nhưng nếu bao gồm một chủ đề ông bà, thì có get_template_directory_uritham chiếu đến cha mẹ hay ông bà không? Rất nhiều lệnh gọi API hiện không rõ ràng và những người khác nhau sẽ mong đợi các hành vi khác nhau, bao gồm cả mã đó là cốt lõi. Bạn cũng cần tải functions.phpcha mẹ hoặc ông bà và đảm bảo rằng nó được thực hiện theo đúng thứ tự.

Nó cũng được coi là thực hành rất xấu. Nếu bạn có nhu cầu về các chủ đề cháu thì cách tiếp cận của bạn đã rẽ sai, và bạn cần lùi lại và đánh giá lại mọi thứ.

Tôi sẽ khuyên bạn tránh khái niệm chủ đề cháu, nó sẽ dẫn đến nhiều vấn đề hơn. Thay vào đó, nhiều hook lọc các hành động và mô đun hóa trong chủ đề con của bạn sẽ cho phép bạn giữ các chủ đề con được chia sẻ các thành phần giống nhau và cho phép bạn phân nhánh / rẽ nhánh với một chút khó khăn. Hãy thử di chuyển các phần tử phổ biến vào một mô hình con svn bên ngoài / git.

Ngoài ra còn có mô hình _s nơi bạn có chủ đề con làm cơ sở và phân tách nó, thay vì lấy nó làm cha mẹ với ý định bạn làm việc trên bản sao, thay vì con / ghi đè.


Vì vậy, trong trường hợp của tôi, nếu tôi đi với Genesis, tôi sẽ phải sửa đổi chủ đề con trực tiếp phải không? Không quen thuộc lắm với Git, nhưng sẽ thích thú với cách tiếp cận giúp tôi giữ nguyên chủ đề con ban đầu.
urok93

Vâng, bạn không có nhiều lựa chọn ở đây.
Tom J Nowell

Tôi tự hỏi điều gì sẽ xảy ra nếu bạn cố gắng tạo ra một chủ đề cháu tuyệt vời.
Chris_O

1
Bạn đề cập rằng phương pháp đã rẽ sai nếu bạn cần điều này. Lý do tôi tò mò về điều này là do một kịch bản như sử dụng chủ đề WooC Commerce Storefront. Họ bán các chủ đề con cho Cửa hàng chúng được tùy chỉnh cho nhiều thứ khác nhau. Vì vậy, nếu tôi đang sử dụng một trong những chủ đề con của họ, nhưng sau đó tôi muốn thực hiện các thay đổi của riêng mình theo cách không bị ghi đè khi họ cập nhật chủ đề con của họ ... tôi sẽ làm thế nào?
vẽ Angell

1
Tôi không biết, đó là một hạn chế về cách xây dựng chủ đề cửa hàng, tại thời điểm đó, bạn buộc phải rẽ nhánh chủ đề trẻ em
Tom J Nowell

3

Tôi đã không kiểm tra đầy đủ phương pháp được mô tả bên dưới, cũng không phải là một chủ đề "cháu" bình thường, nhưng đưa ra chức năng của bộ lọc template_include :

    /*
    Plugin Name: Grandchild Themes
    Plugin URI: http://www.who-cares.com/
    Description: A concept for Grandchild themes Plugin
    Author: See Plugin URI
    Version: 0.0.0.0.1-Alpha
    */

    add_action('wp_head', 'grnd_chld_add_headers', 0);
    add_action('init', 'grnd_chld_add_css');

    // Load template if exists. 
function grandchild_template_include( $template ) {

    if ( file_exists( untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template ) ) )
        $template = untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template );

    return $template;
}

// This is the actual filter that we want .
add_filter( 'template_include', 'grandchild_template_include', 11 );

    function grnd_chld_add_headers () {
        wp_enqueue_style('my_grandchild_style');
    }

    function grnd_chld_add_css() {
        $stamp = @filemtime(plugin_dir_path(__FILE__).'/style.css'); // easy versioning
        wp_register_style ('my_grandchild_style', plugins_url('style.css', __FILE__).'', array(), $stamp);
    }

    // From here , what you got is like a normal functions.php.

Theo cách tương tự, bạn cũng có thể thử các bộ lọc cụ thể hơn như ví dụ archive_template

add_filter ('archive_template', create_function ('', 'return plugin_dir_path(__FILE__)."archive.php";'));

Tất cả những gì đã nói và làm, tôi không chắc đó là cách tốt nhất để làm mọi việc.

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.