3

プラグイン用に動的にウィジェットを作成するより良い方法を探しています。この記事を読んで、カスタム ウィジェットの基本的な作成方法を理解できたと思います。

今私の質問は、定義済みのオプションに基づいて複数のウィジェットを動的に作成する方法です。私が考えることができる 1 つの方法は、eval()各拡張クラスを宣言するために を使用することですが、クラスが大きくなるにつれて複雑になりすぎます。関数パラメーターとして渡された php コードを処理できるとは思いません。文字をエスケープするのは大変です。また、eval() の使用は安全ではなく、できれば避けるべきであるとも言われています。

以下のコードは、プラグインとして実行する準備ができています。ヘッダー コメントを追加して有効にするだけで、2 つのウィジェットが追加されていることがわかります。

add_action( 'widgets_init', 'load_mywidgets');
function load_mywidgets() {

    // prepare widgets
    $arrWidgets = array(
        array('id' => 'Bar', 'description' => 'This is a description for Bar', 'title' => 'This is Bar'),
        array('id' => 'Foo', 'description' => 'This is a description for Foo', 'title' => 'This is Foo')
    );

    // define widget class(es) 
    foreach ($arrWidgets as $arrWidget) {
        eval('
            class ' . $arrWidget["id"] . ' extends WP_Widget {

                function ' . $arrWidget["id"] . '() {
                    $widget_ops = array("classname" => "' . $arrWidget["id"] . '"
                                        , "description" => "' . $arrWidget["description"] . '" );
                    $this->WP_Widget("' . $arrWidget["id"] . '", "' . $arrWidget["title"] . '", $widget_ops);           
                }

                function form($instance) {
                    $instance = wp_parse_args( (array) $instance, array( "title" => "" ) );
                    $title = $instance["title"];
                    echo "<p><label for=\"" . $this->get_field_id("title") . "\">Title: <input class=\"widefat\" id=\"";
                    echo $this->get_field_id("title") . "\" name=\"" . $this->get_field_name("title") . "\" type=\"text\" value=\"" . attribute_escape($title) . "\" /></label></p>";
                }

                function update($new_instance, $old_instance) {
                    $instance = $old_instance;
                    $instance["title"] = $new_instance["title"];
                    return $instance;
                }

                function widget($args, $instance) {
                    extract($args, EXTR_SKIP);

                    echo $before_widget;
                    $title = empty($instance["title"]) ? " " : apply_filters("widget_title", $instance["title"]);

                    if (!empty($title))
                        echo $before_title . $title . $after_title;

                    // WIDGET CODE GOES HERE
                    echo "<h1>This is my new widget!</h1>";

                    echo $after_widget;
                }           
            }
        ');
        register_widget($arrWidget["id"]);
    }
}

これを行う簡単な方法はありますか?クラスをインスタンス化するときにオプションをコンストラクターのパラメーターに渡す方がはるかに理にかなっていると思います。しかし、コアを見ると、コンストラクターは既に定義されており、どうすればそれを上書きできるのか疑問に思っています。WP_Widget はインスタンス化するように設計されていないようです。

情報をありがとう。

[編集] ここで同様の問題が見つかりました: wordpress プラグインでウィジェットが動的に作成されます が、提案された解決策も使用されeval()、基本的には上記と同じ方法です。register_widget()コアを読み続けると、パラメーターのクラス名のみを受け入れるように見えますWP_Widget_Factory::register()。したがってeval()、これを行う唯一の方法かもしれません。しかし、それは直感的ではありません。私はまだこれを行うより簡単な方法を探しています。

4

0 に答える 0