Fungsi Widget khusus di Plugin tidak berfungsi?

15

Saya mengambil kode langsung dari salah satu tema saya yang saya buat, dan itu adalah daftar semua 50 negara bagian dalam daftar tidak berurutan yang dikemas ke dalam widget yang bisa Anda seret dan jatuhkan di bilah sisi.

Masalahnya adalah, ketika saya mencoba menggunakan kode ini dalam file PLUGIN, saya mendapatkan kesalahan berikut:

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

Mengapa ini bekerja di tema, tetapi tidak di plugin? Omong-omong, tema aktif BUKAN tema yang saya ambil kodenya.

Ini kode saya: http://pastebin.com/ZeRWW3yb

Terima kasih.

Jared
sumber

Jawaban:

15

coba ganti:

register_widget('States_Widget');

dengan:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}
Bainternet
sumber
Senang saya bisa membantu
Bainternet
2
One-liner: add_action ('widgets_init', create_function ('', 'return register_widget ("States_Widget");'));
Zachary Schuessler
3
One-liner itu memiliki kelemahan parah yaitu jika pengguna ingin mengeluarkan remove_action, mereka tidak bisa, karena tidak ada fungsi terkait yang bisa dihapus.
Elliot
1

Mari kita asumsikan bahwa Anda perlu menginisialisasi widget di dalam metode kelas dengan memberikan nama widget sebagai argumen. Untuk mencapai ini, Anda akan melakukan ini:

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 );
            }
        );
    }
}

Perhatikan bahwa kita perlu meneruskan $widget_namenama variabel ke fungsi lambda kita untuk menggunakannya. Bagian yang melakukan ini adalah use (&$widget_name). Seperti yang sudah dicatat, kait yang diinisialisasi seperti ini tidak dapat dihapus oleh remove_action.

toni_lehtimaki
sumber