Порада: як використовувати шорткоди у віджетах у WordPress

1

Від автора: шорткоди дозволяють виконувати безліч завдань в WordPress. Однак за замовчуванням в WP шорткоди можна використовувати тільки в постах і сторінках. Використовувати шорткоди у віджетах за замовчуванням неможливо. У цій невеликій статті я розповім вам, як включити дану функцію.

Як включити шорткоди в текстових віджетах

В WP за замовчуванням доступно кілька віджетів. Один з них – текстовий віджет. Як зрозуміло з його назви, віджет призначений для якого-небудь тексту. Також у такий віджет можна додавати HTML код.

У текстовий віджет можна додати код JS, досить потужна річ. Тим не менше, якщо вам необхідний, наприклад, PHP для отримання будь-яких даних з сервера, за замовчуванням такий віджет робити це не вміє.

Те ж саме з постами. Саме тому нам хотілося б використовувати шорткоди. В цьому нам допоможе фільтр widget_text. Цей фільтр дозволяє редагувати вміст текстових віджетах. Нижче ми з його допомогою будемо змушувати WP парсити шорткоди в цьому віджеті.

Парсингом шорткодов в WP займається функція do_shortcode(). Функція приймає один обов’язковий параметр, текст для парсингу, і повертає готовий результат. Тобто цю функцію можна безпосередньо використовувати у вигляді колбек опції у фільтрі widget_text. Код нижче можна використовувати у файлі плагіна або у файлі теми functions.php.

І все. Тепер текстовий віджет буде парсити будь-який існуючий шорткод.

Як створити новий віджет шорткодов

Можна піти іншим шляхом і створити свій власний віджет. Текстовий віджет відмінно працює, тому ми просто можемо адаптувати його код (знайти можна тут /wp-includes/default-widgets.php). Нам необхідно створити свій власний плагін. Ніколи не змінюйте ядро WP.

‘widget_text’, ‘description’ => __(‘Arbitrary text or HTML.’));
$control_ops = array(‘width’ => 400, ‘height’ => 350);
parent::__construct(‘text’, __(‘Text’), $widget_ops, $control_ops);
}
/**
* @param array $args
* @param array $instance
*/
public function widget( $args, $instance ) {
/** This filter is in documented wp-includes/default-widgets.php */
$title = apply_filters( ‘widget_title’, empty( $instance[‘title’] ) ? «: $instance[‘title’], $instance, $this->id_base );
/**
* Filter the content of the Text widget.
*
* @since 2.3.0
*
* @param string $The widget widget_text content.
* @param WP_Widget $instance WP_Widget instance.
*/
$text = apply_filters( ‘widget_text’, empty( $instance[‘text’] ) ? «: $instance[‘text’], $instance );
echo $args[‘before_widget’];
if ( ! empty( $title ) ) {
echo $args[‘before_title’] . $title . $args[‘after_title’];
} ?>

«, ‘text’ => » ) );
$title = strip_tags($instance[‘title’]);
$text = esc_textarea($instance[‘text’]);
?>