私が作成したテーマの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
ありがとう。
交換してみてください。
register_widget('States_Widget');
と:
add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
register_widget('States_Widget');
}
引数としてウィジェット名を渡すことにより、クラスメソッド内でウィジェットを初期化する必要があると仮定します。これを実現するには、次のようにします。
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
nameをラムダ関数に渡して使用する必要があることに注意してください。これを行う部分はuse (&$widget_name)
です。既に述べたように、このように初期化されたフックはremove_action
で削除できません。