Обновление экземпляров виджетов WordPress для элементов, для которых нужны теги

Недавно я понял, что недостаточно использую виджеты в 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 а также Я не видел решения при вызове обновления для виджета, если текстовой области нужны теги. Большое количество людей показывает вызов экземпляра заголовка как:

$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';

В моей функции 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 когда вам нужны теги без использования PHP strip_tags() ?

6

Решение

Я использую следующий потрясающий фрагмент кода, чтобы зарегистрировать пользовательский виджет, который принимает любой 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 }
}
0

Другие решения

Есть ли лучший способ вернуть $instance когда вам нужны теги без использования PHP strip_tags() ?

Да! В WordPress есть много способов проверки и очистки пользовательских данных.

Для вашего случая wp_kses_post() должно работать очень хорошо.

Это описание: Обеззараживать содержимое для разрешенных тегов 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;
}
0

По вопросам рекламы [email protected]