Função de widget personalizado no plug-in não está funcionando?

15

Peguei um código diretamente de um dos meus temas que criei e é uma lista de todos os 50 estados em uma lista não ordenada compactada em um widget que você pode simplesmente arrastar e soltar na barra lateral.

O problema é que, quando tento usar esse código em um arquivo PLUGIN, recebo o seguinte erro:

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

Por que funcionaria no tema, mas não no plugin? A propósito, o tema ativo NÃO é o tema do qual tirei o código.

Aqui está o meu código: http://pastebin.com/ZeRWW3yb

Obrigado.

Jared
fonte

Respostas:

15

tente substituir:

register_widget('States_Widget');

com:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}
Bainternet
fonte
I contente poderia ajudar
Bainternet
2
Uma linha: add_action ('widgets_init', create_function ('', 'return register_widget ("States_Widget");'));
Zachary Schuessler
3
Essas one-liners têm a séria desvantagem de que, se os usuários desejam emitir remove_action, eles não podem, porque não há função conectada que possa ser removida.
Elliot
1

Vamos supor que você precise inicializar um widget dentro de um método de classe passando o nome do widget como argumento. Para fazer isso, você faria o seguinte:

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

Observe que precisamos passar o $widget_namenome da variável para nossa função lambda para usá-la. A parte que faz isso é use (&$widget_name). Como já observado, os ganchos inicializados como este não podem ser removidos por remove_action.

toni_lehtimaki
fonte