Создание динамического создания WordPress

Я ищу лучший способ динамического создания виджета для моего плагина. Я прочитал эту статью, и я считаю, что понял основные возможности создания пользовательского виджета.

Теперь мой вопрос заключается в том, как я могу создавать несколько виджетов динамически на основе предопределенных опций. Один из способов, которым я могу думать, – использовать eval() для объявления каждого расширенного класса, но по мере того, как класс становится больше, это будет слишком сложно. Я не думаю, что могу обработать PHP-код, переданный как параметр функции; это слишком много работы, чтобы убегать от персонажей. Также говорится, что использование eval () небезопасно и, по возможности, следует избегать.

Код ниже готов к запуску в качестве плагина. Просто добавьте комментарий к заголовку и активируйте его, и вы увидите, что два виджета добавлены.

 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 не предназначен для создания экземпляра.

Спасибо за вашу информацию.

[Edit] Обнаружена аналогичная проблема: виджет создает динамически в плагине WordPress. Но в предлагаемом решении также используется eval() и в основном это так же, как я представил выше. Когда я продолжаю читать ядро, появляется register_widget() только принимает имя класса для параметра, вызывая WP_Widget_Factory::register() . Таким образом, eval() может быть единственным способом сделать это. Но это не интуитивно. Я все еще ищу более простой способ сделать это.