Chức năng Widget tùy chỉnh trong Plugin không hoạt động?


15

Tôi đã lấy mã ra khỏi một trong những chủ đề mà tôi đã tạo và đó là danh sách tất cả 50 trạng thái trong danh sách không có thứ tự được đóng gói vào một tiện ích mà bạn có thể chỉ cần kéo và thả trên thanh bên.

Vấn đề là, khi tôi thử sử dụng mã này trong tệp PLUGIN, tôi gặp lỗi sau:

Fatal error: Call to a member function register() on a non-object in C:\xampp\htdocs\wordpress\wp-includes\widgets.php on line 431

Tại sao nó hoạt động trong chủ đề, nhưng không phải trong plugin? Nhân tiện, chủ đề hoạt động KHÔNG phải là chủ đề tôi lấy mã ra.

Đây là mã của tôi: http://pastebin.com/ZeRWW3yb

Cảm ơn.

Câu trả lời:


15

thử thay thế:

register_widget('States_Widget');

với:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}

Vui mừng tôi có thể giúp đỡ
BaiNET

2
Một lớp lót: add_action ('widget_init', create_feft ('', 'return register_widget ("States_Widget");'));
Zachary Schuessler

3
Những lớp lót đó có nhược điểm nghiêm trọng là nếu người dùng muốn phát hành remove_action, họ không thể, bởi vì không có chức năng hook nào có thể được gỡ bỏ.
Elliot

1

Giả sử rằng bạn cần khởi tạo một widget bên trong một phương thức lớp bằng cách chuyển tên widget làm đối số. Để thực hiện điều này, bạn sẽ làm điều này:

class WidgetMonster {
    /**
     * Register widget via PHP lambda function as an argument to the add_action function
     * @var $widget_name string | WP_Widget.
     */
    public static function register_widget_helper( $widget_name ) {
        add_action('widgets_init',
            function() use ( &$widget_name ) {
                return register_widget( $widget_name );
            }
        );
    }
}

Lưu ý rằng chúng ta cần chuyển $widget_nametên biến cho hàm lambda để sử dụng nó. Phần làm việc này là use (&$widget_name). Như đã lưu ý móc khởi tạo như thế này không thể được gỡ bỏ bởi remove_action.

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.