¿La función de widget personalizado en el complemento no funciona?

15

Tomé un código directamente de uno de mis temas que creé, y es una lista de los 50 estados en una lista desordenada empaquetada en un widget que puede arrastrar y soltar en la barra lateral.

El problema es que cuando intento usar este código en un archivo PLUGIN, aparece el siguiente error:

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 qué funcionaría en el tema, pero no en el complemento? Por cierto, el tema activo NO es el tema del que saqué el código.

Aquí está mi código: http://pastebin.com/ZeRWW3yb

Gracias.

Jared
fuente

Respuestas:

15

intente reemplazar:

register_widget('States_Widget');

con:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}
Bainternet
fuente
Me alegro de poder ayudar
Bainternet
2
One-liner: add_action ('widgets_init', create_function ('', 'return register_widget ("States_Widget");'));
Zachary Schuessler
3
Esas frases tienen la grave desventaja de que si los usuarios desean emitir remove_action, no pueden hacerlo, porque no hay una función enganchada que se pueda eliminar.
Elliot
1

Supongamos que necesita inicializar un widget dentro de un método de clase pasando el nombre del widget como argumento. Para lograr esto, harías esto:

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

Tenga en cuenta que necesitamos pasar el $widget_namenombre de la variable a nuestra función lambda para poder usarla. La parte que hace esto es use (&$widget_name). Como ya se señaló, los ganchos inicializados de esta manera no pueden eliminarse remove_action.

toni_lehtimaki
fuente