プラグインのカスタムウィジェット機能が機能しませんか?


15

作成したテーマの1つからコードを直接取り出しました。これは、サイドバーにドラッグアンドドロップできるウィジェットにパックされた、順序付けられていないリストの50の状態すべてのリストです。

問題は、PLUGINファイルでこのコードを使用しようとすると、次のエラーが発生することです。

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

テーマでは機能するが、プラグインでは機能しないのはなぜですか?ちなみに、アクティブなテーマは、私がコードを削除したテーマではありません。

ここに私のコードがあります:http : //pastebin.com/ZeRWW3yb

ありがとう。

回答:


15

交換してみてください:

register_widget('States_Widget');

で:

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

私は助けることができてうれしい
-Bainternet

2
ワンライナー:add_action( 'widgets_init'、create_function( ''、 'return register_widget( "States_Widget");'));
ザカリーシュースラー

3
これらのワンライナーには、ユーザーがremove_actionを発行したい場合、削除できるフック関数がないため、remove_actionを発行できないという重大な欠点があります。
エリオット14年

1

ウィジェット名を引数として渡すことにより、クラスメソッド内でウィジェットを初期化する必要があると仮定します。これを実現するには、次のようにします。

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

変数$widget_name名を使用するにはラムダ関数に渡す必要があることに注意してください。これを行う部分はuse (&$widget_name)です。既に述べたように、このように初期化されたフックはで削除できませんremove_action

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.