La funzione Widget personalizzato nel plug-in non funziona?


15

Ho preso un codice direttamente da uno dei miei temi che ho creato, ed è un elenco di tutti i 50 stati in un elenco non ordinato racchiuso in un widget che puoi semplicemente trascinare sulla barra laterale.

Il problema è che quando provo ad usare questo codice in un file PLUGIN, ottengo il seguente errore:

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

Perché dovrebbe funzionare nel tema, ma non nel plugin? A proposito, il tema attivo NON è il tema da cui ho preso il codice.

Ecco il mio codice: http://pastebin.com/ZeRWW3yb

Grazie.

Risposte:


15

prova a sostituire:

register_widget('States_Widget');

con:

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

Sono contento di
poterti

2
One-liner: add_action ('widgets_init', create_function ('', 'return register_widget ("States_Widget");'));
Zachary Schuessler,

3
Quei one-liner hanno il grave svantaggio che se gli utenti vogliono emettere remove_action, non possono, perché non esiste alcuna funzione hook che può essere rimossa.
Elliot,

1

Supponiamo che sia necessario inizializzare un widget all'interno di un metodo di classe passando il nome del widget come argomento. Per fare ciò, dovresti farlo:

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

Nota che $widget_nameper usarlo dobbiamo passare il nome della variabile alla nostra funzione lambda. La parte che lo fa è use (&$widget_name). Come già notato, gli hook inizializzati in questo modo non possono essere rimossi da remove_action.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.