Làm cách nào để tải hàm Parent_theme.php trước child_theme?


12

Tôi gặp vấn đề là tôi phải tải functions.phptệp của chủ đề gốc trước khi functions.phptải tệp của chủ đề con . Điều này là cần thiết cho thủ tục thiết lập & init. Tôi đã xem xét các hook bên trong /wp_core_root/wp-sinstall.php (có tên do_action('setup_theme');:).

Vấn đề là tôi không biết cách nối vào đó, vì tập tin đầu tiên tôi nhận được là chủ đề con functions.php, nên add_action( 'setup_theme', 'my_init_function' );sẽ không hoạt động.

Chỉnh sửa:
a) Tôi biết rằng các plugin tải sớm hơn chủ đề và do đó có thể truy cập ngay cả Truy vấn ban đầu, nhưng tôi không muốn dựa vào Plugin.
b) Đây là mã (rút ngắn) từ tệp wp-settings.php

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

Tôi muốn tránh hai điều: Đầu tiên rất nhiều lời giải thích cho người dùng. Thứ hai cơ hội ai đó phá vỡ bất cứ điều gì nếu cắt dây với vô tình xóa thủ tục init cha mẹ. Mọi người sẽ chỉ chơi bên trong các hàm.php mà không có nguy cơ phá vỡ bất cứ điều gì mà không biết.

Nói cách khác: Làm cách nào để giữ cho tệp chủ đề con.php của tôi sạch, nhưng các chủ đề phụ đã được khởi động xong?

Có ý kiến ​​gì không? Cảm ơn rất nhiều!


Bạn có thể chỉ bao gồm nó?
wyrfel

Câu hỏi của tôi là: từ đâu? Tệp đầu tiên được tải trong ngữ cảnh chủ đề là chủ đề con functions.php. Hãy xem wp-settings.phptệp "molto loko" trong lõi (dòng: 275-279 @wp 3.1 rc) ... trông như thế này: if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );vì vậy tôi không thể thấy cơ hội ... Và tôi không muốn sử dụng một plugin để bootstrap chủ đề của tôi.
kaiser

Tôi có thể hoàn toàn thiếu một cái gì đó ở đây, nhưng nếu bạn chèn include(/path/to/parent/themes/functions.php)vào đầu các chủ đề con của bạn hàm.php, thì mọi thứ trong đó sẽ được tải trước đó. Không phải?
wyrfel

@wyrfel: tôi đã cập nhật Q để làm cho nó rõ ràng hơn
kaiser

Tôi hiểu rồi, cảm ơn, giờ thì rõ ràng hơn nhiều. Thêm vào đó tôi giả sử bạn chỉ làm điều này cho một lần cài đặt.
wyrfel

Câu trả lời:


11

Justin Tadlock gần đây đã viết một bài đăng tuyệt vời về việc tạo một tệp tin.php tốt hơn
trong đó (nếu tôi nhớ chính xác) anh ấy giải quyết vấn đề chính xác này.

Thật không may, trang web của anh ấy đã ngừng hoạt động nên tôi phải dựa vào trí nhớ của mình bây giờ.

Bạn đang đi đúng hướng với after_setup_themecái móc.

  1. Theo như tôi nhớ thì mẹo là bọc các bộ lọc và hành động của bạn vào chức năng của nó.
    Xem ví dụ dưới đây.
  2. Bạn làm điều đó trong cảfunctions.php tập tin cha mẹ và con .
  3. Sau đó, bạn có thể chơi với sự ưu tiên của hai móc.

Một chút mã đáng giá ngàn từ - chủ đề gốc của bạn function.phpsẽ giống như thế này:

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}

Ơ, cảm ơn vì đã viết lên (+1). Bạn có một bộ não ấn tượng;). Vấn đề là after_setup_themequá muộn, vì các tệp tin.php đã được tải.
kaiser

EDIT: Sau khi xem xét lại mã của bạn và đọc "làm điều đó trong cả hai hàm cha và con.php" & "chơi với mức độ ưu tiên", nó bắt đầu có ý nghĩa. Vẫn đang tìm kiếm một giải pháp tốt hơn mà người dùng không thể phá vỡ dễ dàng, nhưng nó có ý nghĩa! Cảm ơn!
kaiser

Không có giải pháp thực sự nào ở đây, vì vậy tôi đánh dấu vào đây, vì bạn là người đầu tiên đề xuất điều này.
kaiser

9

Đầu tiên, bạn không thể. Hàm.php của chủ đề con luôn tải trước, dấu chấm.

Thứ hai, các chủ đề không thể kết nối với setup_theme. Các plugin có thể, nhưng điều đầu tiên mà một chủ đề có thể nối vào là after_setup_theme.

Nếu cha mẹ của bạn được thiết kế chính xác, thì đứa trẻ có khả năng ghi đè các chức năng và công cụ trong cha mẹ, nhưng chỉ khi nó tải trước.

Nói rộng ra, nếu bạn nghĩ rằng bạn cần tải tập tin chức năng của cha mẹ trước, thì có lẽ bạn đã làm sai, bằng cách nào đó. Bạn cần giải thích vấn đề lớn hơn.


Cảm ơn câu trả lời của bạn. Tôi hiểu sự cần thiết phải tải plugin trước các chủ đề và đã nhận ra thực tế (đọc ở trên: "Và tôi không muốn sử dụng plugin để khởi động chủ đề của mình."). Để giải thích trường hợp của tôi: Tôi đã nhận được một tệp ini quan tâm đến việc tải tất cả các phần khung của tôi, bắt đầu trong các chủ đề cha mẹ có chức năng php với yêu cầu tệp và tải lớp init. InitClass quan tâm đến việc tải a) và mảng dữ liệu từ các chủ đề con .ini-files và sau đó đẩy nó vào các lớp khác nhau để xử lý thêm. hộp meta, loại bài đăng tùy chỉnh, v.v.
kaiser

Vấn đề của tôi là tôi phải khởi tạo tất cả điều này từ tệp tin.php của cha mẹ tôi, vì vậy một người dùng bình thường không thể phá vỡ nó, khi chơi xung quanh bên trong chủ đề con. Vấn đề thứ hai của tôi là tất cả các lớp đó không có sẵn trong tệp tin.php của chủ đề con, vì vậy chúng không có tác dụng ... nhưng có lẽ tôi đã gặp phải một lỗi suy nghĩ lớn ngay tại đây. Bất kỳ ý tưởng hoặc đề xuất về làm thế nào để làm cho nó tốt hơn?
kaiser

3
.... Tôi nghĩ rằng bạn sẽ phải chấp nhận thực tế rằng nếu người dùng phá vỡ mọi thứ, thì đó thực sự là vấn đề của họ. Dòng dưới cùng: Không cách nào để tải chức năng của chủ đề gốc trước tiên và để chủ đề con "sạch". Nếu bạn cần một cái gì đó trong chủ đề con để chạy sau khi tệp tin.php của chủ đề gốc đã được tải, thì bạn đặt nó vào trong một hàm được nối với after_setup_theme. Điều đó chạy sau khi tải cả hai tệp tin.php.
Otto

Đồng ý. Đó không phải là vấn đề lớn. Tôi chỉ xen vào nếu có khả năng. Câu hỏi: Điều gì để một "khung đáng giá muối" sau đó có một hook sau thủ tục init và không chỉ đơn giản là sử dụng after_setup_themehook? Chỉ để không "spam" hook, hay bởi vì nó "enterprisy" hay "kool" er hơn? Ý tôi là: Có phải ý tưởng "thực hành tốt nhất" đằng sau các móc song song cụ thể của chủ đề "để lại các móc lõi cho plugin" không? (Đó là cách tôi xử lý nó hiện tại.)
kaiser

"Nếu bạn đang làm điều đó, đừng bận tâm với một hành động bổ sung. Chỉ cần móc vào after_setup_theme." Đồng ý. Cảm ơn. +1
kaiser

4

Vì vậy, bạn đang cố thực thi mã từ các hàm.php của trẻ, nhưng sau khi chủ đề gốc đã được tải. Đơn giản, chỉ cần sử dụng một hành động tùy chỉnh:

Vào cuối parent/functions.php:

do_action('parent_loaded');

Trong child/functions.php:

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

Tất cả các chủ đề cha mẹ đáng muối của họ làm theo cách này. Hơn nữa, họ có một số hành động và bộ lọc khác được rắc xung quanh cho chủ đề con để sử dụng.


Tôi cố gắng tránh càng nhiều hướng dẫn càng tốt. Đó là một trong những lý do tôi chuyển từ tệp config.php trong thư mục chủ đề con và bây giờ sử dụng tệp ini thay thế. Trong một câu: Tôi cố gắng tránh xa giải pháp cũ / của bạn và càng gần lõi và codex càng tốt. Vấn đề của tôi là tôi không thể cung cấp một chức năng duy nhất từ ​​chủ đề con, bởi vì không có lớp nào khác từ bootstrap của tôi có sẵn trong tệp tin.php của chủ đề con (không nói về thẻ mẫu tùy chỉnh / khung).
kaiser

Xem câu trả lời cập nhật.
scribu

Tôi cũng cập nhật Q. Sau khi đọc 2/3 câu trả lời đó cho tôi biết cùng một nguồn (theo chủ đề, trước khi chỉnh sửa của bạn) tôi có cảm giác rằng chỉ có phương pháp "justin tadlock" bao gồm, nhưng tôi muốn chắc chắn.
kaiser

2
Nếu bạn đang đi đến đó, đừng bận tâm với một hành động bổ sung. Chỉ cần móc vào after_setup_theme.
Otto

0

Tại sao bạn không bao gồm functions.phptệp của chủ đề gốc trong tệp của chủ đề con functions.php, như thế này:

Trong functions.phptập tin chủ đề con :

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

Bằng cách này, functions.phptệp của chủ đề gốc không bị thay đổi (đôi khi điều này rất quan trọng).


như đã đề cập trong Q: "Nói cách khác: Làm cách nào để giữ cho tệp chủ đề con.php của tôi sạch sẽ, nhưng các chủ đề phụ bootstrap đã được thực hiện chưa?" Thậm chí tốt hơn: Làm thế nào để tôi tránh một cuộc gọi từ bên trong bất kỳ tệp tin.php. Tại sao: Mọi người thường chỉ đập vỡ mọi thứ nhảm nhí mà họ không muốn có trong các tệp mẫu trong đó. Vì vậy, có khả năng cao là ai đó vô tình xóa một số dòng. Kinh nghiệm của tôi: Không ai thực sự đọc bình luận, readme hoặc tài liệu.
kaiser

0

Tôi đã gặp một vấn đề tương tự trước đây và tôi đã khắc phục nó bằng cách tạo thêm một "child-Hàm.php" trống trong cha mẹ và bao gồm cả "hàm.php" (cha mẹ cũng vậy) ngay sau các tệp / hàm tôi muốn sử dụng ở con, sau đó trong chủ đề con tôi tạo một tệp "child-tests.php" và ở đó tôi có thể bắt đầu mô phỏng các hàm con.php chạy sau khi cha mẹ không phải là một giải pháp tao nhã nhưng đã thực hiện đượ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.