La fonction Widget personnalisé dans le plugin ne fonctionne pas?

15

J'ai pris un code directement dans l'un de mes thèmes que j'ai créés, et c'est une liste des 50 états dans une liste non ordonnée emballée dans un widget que vous pouvez simplement faire glisser et déposer sur la barre latérale.

Le problème est que lorsque j'essaie d'utiliser ce code dans un fichier PLUGIN, j'obtiens l'erreur suivante:

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

Pourquoi cela fonctionnerait-il dans le thème, mais pas dans le plugin? Soit dit en passant, le thème actif n'est PAS le thème dont j'ai retiré le code.

Voici mon code: http://pastebin.com/ZeRWW3yb

Merci.

Jared
la source

Réponses:

15

essayez de remplacer:

register_widget('States_Widget');

avec:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}
Bainternet
la source
Heureux d'avoir pu aider
Bainternet
2
One-liner: add_action ('widgets_init', create_function ('', 'return register_widget ("States_Widget");'));
Zachary Schuessler
3
Ces lignes simples ont le grave inconvénient que si les utilisateurs veulent émettre remove_action, ils ne le peuvent pas, car il n'y a pas de fonction accrochée qui peut être supprimée.
Elliot
1

Supposons que vous devez initialiser un widget à l'intérieur d'une méthode de classe en passant le nom du widget en argument. Pour ce faire, vous devez procéder comme suit:

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

Notez que nous devons transmettre le $widget_namenom de la variable à notre fonction lambda afin de l'utiliser. La partie qui fait cela est use (&$widget_name). Comme déjà noté, les crochets initialisés comme celui-ci ne peuvent pas être supprimés par remove_action.

toni_lehtimaki
la source