Недавно я понял, что я недостаточно использую виджеты в WordPress при разработке боковых панелей в темах, поэтому последние пару дней я провел исследование, как правильно их разрабатывать. Просмотрев много руководств, я обнаружил, что некоторые из них на виджетах настраиваемого здания устарели. Я видел, где я должен использовать конструкцию:
function __construct() { parent::__construct( // Base ID of your widget 'foobar_widget', // Widget name will appear in UI __('Give them foo Widget', 'foobar_widget_domain'), // Widget description array( 'description' => __( 'Development widget for testing', 'foobar_widget_domain' ), ) ); }
Кодекс очень минимален, когда речь идет о пользовательских виджетах. После просмотра тегов SO Word wordpress-widget и виджета я не видел решения при вызове обновления для виджета, если текстовая область нуждается в тегах. Большое количество людей вызывают вызов экземпляра title как:
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
В моей form()
функции form()
мне нужна текстовая область, которая будет принимать код ввода пользователя, например, скопированное объявление Google Adsense. Следующие работы, но я не уверен, если есть лучший подход к принятию ввода из формы:
// Updating widget replacing old instances with new public function update( $new_instance, $old_instance ) { $instance = array(); $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : ''; $instance['foo1'] = $new_instance['foo1']; return $instance; } }
Есть ли лучший способ вернуть $instance
когда вам нужны теги, не используя strip_tags()
PHP?
Я использую следующий замечательный фрагмент кода для регистрации пользовательского виджета, который принимает любой HTML-код
add_action('widgets_init', create_function('', 'register_widget("clean_markup_widget");')); class Clean_Markup_Widget extends WP_Widget { function __construct() { parent::WP_Widget('clean_markup_widget', 'ASR Custom Text Widget', array('description'=>'Simple widget for well-formatted markup & text')); } function widget($args, $instance) { extract($args); $markup = $instance['markup']; //echo $before_widget; if ($markup) echo $markup; //echo $after_widget; } function update($new_instance, $old_instance) { $instance = $old_instance; $instance['markup'] = $new_instance['markup']; return $instance; } function form($instance) { if ($instance) $markup = esc_attr($instance['markup']); else $markup = __('<p>Clean, well-formatted markup.</p>', 'markup_widget'); ?> <p> <label for="<?php echo $this->get_field_id('markup'); ?>"><?php _e('Markup/text'); ?></label><br /> <textarea class="widefat" id="<?php echo $this->get_field_id('markup'); ?>" name="<?php echo $this->get_field_name('markup'); ?>" type="text" rows="16" cols="20" value="<?php echo $markup; ?>"><?php echo $markup; ?></textarea> </p> <?php } }
Есть ли лучший способ вернуть
$instance
когда вам нужны теги, не используяstrip_tags()
PHP?
Да! WordPress имеет множество способов проверки и дезинфекции пользовательских данных.
Для вашего случая wp_kses_post()
должен работать очень хорошо.
Это описание: Sanitize content для разрешенных тегов HTML для сообщения.
Он использует список разрешенных тегов по умолчанию, который вы можете найти в wp-includes/kses.php
.
Если вы хотите разрешить только определенные теги, самый безопасный способ сделать это – использовать wp_kses()
вместо wp_kses_post()
.
Разница заключается в том, что wp_kses()
требует второго параметра для $allowed_html
вместо использования глобальной переменной $allowedposttags
.
Есть способы фильтровать или переопределять глобальную переменную $allowedposttags
но, вероятно, это не самая лучшая идея в этом случае, так как они будут влиять на другой HTML, например, содержимое сообщения, в дополнение к вашему виджету.
Функция обновления с помощью wp_kses_post()
будет выглядеть так:
// Updating widget replacing old instances with new public function update( $new_instance, $old_instance ) { $instance = array(); $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : ''; $instance['foo1'] = wp_kses_post( $new_instance['foo1'] ); return $instance; }