after_setup_theme luôn chạy


11

Tôi đang thiết lập một chủ đề con cho một số thành viên trong khoa của mình và là một phần của chủ đề, tôi muốn một số bổ trợ được kích hoạt tại thời điểm chủ đề được kích hoạt. Vì vậy, một cách tự nhiên, tôi đã sử dụng hành động after_setup_theme và gọi chức năng thiết lập của mình. Nó hoạt động rất tốt, ngoại trừ nó chạy trên MỌI yêu cầu (quản trị viên và những người khác). Tôi đã chứng minh điều này bằng cách thêm nó vào cuối chức năng thiết lập:

echo '<script type="text/javascript">alert("This action was run")</script>';

Và kết quả là nhận được cảnh báo javascript trên mọi yêu cầu quản trị viên và mọi yêu cầu giao diện người dùng (tôi có thiết lập mạng, vì vậy rõ ràng trên các trang web mà chủ đề này không hoạt động, nó không chạy chức năng)

Vì vậy, câu hỏi là, đây có phải là một lỗi? Có phải tôi đang làm gì đó sai? Đây là mã hoàn chỉnh mà tôi đang sử dụng:

add_action( 'after_setup_theme', 'fwp_setup' );
function fwp_setup(){
    // -- Unrelated code remove for the sake of brevity 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
    echo '<script type="text/javascript">alert("This action was run")</script>';
}

Bất kỳ cái nhìn sâu sắc sẽ được nhiều đánh giá cao!


GIẢI PHÁP: after_switch_themethực hiện chính xác những gì tôi dự định ở đây. Nó kích hoạt sau khi chủ đề được chuyển sang chủ đề của bạn. Một trong những giải pháp được đề cập dưới đây sử dụng switch_theme. Điều này không có kết quả mong muốn, vì nó chỉ xảy ra khi chuyển khỏi chủ đề của bạn. Tham khảo bình luận Trac này
Aaron Wagner

xin vui lòng gửi nó như là một câu trả lời , chứ không phải là một bình luận cho câu hỏi của bạn. :)
Chip Bennett

2
Lời xin lỗi. Nó sẽ không cho phép tôi làm điều đó. Tôi sẽ thêm nó như một câu trả lời trong một chút.
Aaron Wagner

Câu trả lời:


8

GIẢI PHÁP: after_switch_themethực hiện chính xác những gì tôi dự định ở đây. Nó kích hoạt sau khi chủ đề được chuyển sang chủ đề của bạn. Một trong những giải pháp được đề cập dưới đây sử dụng switch_theme. Điều này không có kết quả mong muốn, vì nó chỉ xảy ra khi chuyển khỏi chủ đề của bạn.

Đây là một bài viết mà tôi tìm thấy như tài liệu tham khảo: http://core.trac.wordpress.org/ticket/7795#comment:29

Đây là mã sửa đổi của tôi

add_action( 'after_switch_theme', 'fwp_theme_setup' );
function fwp_theme_setup(){ 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
}

5

Các after_setup_themehành động được dự định để lửa trên mỗi tải WordPress. Nó chỉ đơn giản là một phần của quá trình trong đó WordPress gọi hệ thống mẫu, xác định các tham số thiết lập khác nhau cho Chủ đề và sau đó tiếp tục xử lý tiếp theo, chẳng hạn như xác định mẫu chính xác để hiển thị, v.v.

Nói cách khác, after_setup_themeđại diện cho điểm mà WordPress thiết lập Chủ đề hiện tại, không phải là điểm mà quản trị viên kích hoạt và / hoặc định cấu hình Chủ đề hiện tại.

Thứ bạn đang tìm kiếm là một cái móc kích hoạt Theme , hiện không có sẵn, nhưng đang được xem xét / phát triển .


Các liên kết nhập Codex là sai lầm khủng khiếp sau đó. Nó nói "hook này được gọi trong quá trình khởi tạo chủ đề." Điều đó có nghĩa là, với tôi, cái móc nên được gọi khi nó được kích hoạt. Tôi hiểu những gì bạn đang nói mặc dù. Sai lầm khủng khiếp.
Aaron Wagner

5
init !== activation. Thông thường bạn gọi __construct()hàm trong php cũng là một inithàm. Điều đó có nghĩa là: Khởi tạo thể hiện.
kaiser

Vé trac đã 7 năm tuổi và dường như sẽ không được sửa!
numediaweb

4

Thật không may, không có móc kích hoạt chủ đề. Tuy nhiên, một câu hỏi này không cung cấp giải pháp cho vấn đề đó.

Chỉ cần sử dụng hook móc kích hoạt chủ đề 'để kích hoạt các trình cắm.

Một giải pháp tốt hơn, cùng một tĩnh mạch là cái này . Cả hai về cơ bản đều sử dụng switch_thememóc.


Theo nhận xét của OP và vé trac được liên kết - after_switch_themelà móc nối bắt buộc.

Điều này vượt qua tên của chủ đề cũ như là một đối số. Tuy nhiên, nếu điều này nằm trong functions.php(nên là ...) thì cuộc gọi lại sẽ chỉ kích hoạt khi chủ đề của bạn được kích hoạt .

add_action( 'after_switch_theme', 'wpse50298_setup' );
function wpse50298_setup($theme_switching_from){
    // Your theme is being activated
}

Tương tự, thêm một cuộc gọi lại switch_themesẽ chỉ được gọi khi chủ đề của bạn được hủy kích hoạt.

add_action( 'switch_theme', 'wpse50298_deactivate' );
function wpse50298_deactivate($theme_switching_to){
    // Your theme is being deactivated
}

Cả hai lựa chọn này đều không phù hợp với tôi. switch_themechỉ hoạt động sau khi tắt chủ đề. Tuy nhiên, after_switch_themeđã làm việc hoàn hảo.
Aaron Wagner

1
cập nhật câu trả lời :)
Stephen Harris

switch_theme dường như không hoạt động nữa. Tôi nghĩ rằng đó là do những thay đổi trong kích hoạt 3,4. Ít nhất là nó không làm việc cho tôi.
Jake

after_switch_theme hoạt động hoàn hảo. Đây phải là câu trả lời được chấp nhận. Tôi đang sử dụng WP 3.5
Ardee Aram

0

Một giải pháp tốt hơn có thể là sử dụng tập lệnh kích hoạt plugin Thomas Griffin . Điều này sẽ nhắc người dùng cài đặt các plugin bạn chọn khi chủ đề được sử dụng. Tôi nghĩ rằng đây là một cách tuyệt vời để tách plugin khỏi chủ đề và vẫn sử dụng được nó.

Trong chủ đề của bạn, hãy kiểm tra xem plugin có hoạt động hay không trước khi sử dụng các chức năng của nó. Điều này sẽ cho phép người dùng nhiều sự lựa chọn và kiểm soát hơn.

Bạn có thể thiết lập tập lệnh kích hoạt dễ dàng với Knapsack .



0

Cách khắc phục tốt nhất của bạn bây giờ là sử dụng switch_themehook và lọc đối số '$ theme' đã qua để xem đó có phải là hiện tại của chúng hay không nếu không trả về;

function nw_update_network($theme) {
   if ($theme !== 'my_theme_name') return;

   // Your code here
}

add_action('switch_theme', 'nw_update_network');
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.