Статьи

Совет: как использовать шорткоды в виджетах в WordPress

Мы можем делать много разных вещей с помощью шорткодов в WordPress, как мы исследовали в нашей статье, описывающей WordPress Shortcode API . Однако по умолчанию WordPress позволяет использовать шорткоды только в сообщениях (и страницах), а не где-либо еще.

Если вы хотите использовать шорткоды в виджетах, по умолчанию это невозможно. Однако в этом кратком совете я расскажу, как вы можете включить эту функцию.

нет шорткода в виджете

Разрешение использования шорткодов в текстовом виджете

WordPress предоставляет несколько виджетов по умолчанию. Одним из них является виджет «Текст», который, как следует из его названия, позволяет добавлять любой текст в виджет. Вы также можете использовать его для добавления любого кода HTML.

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

Это похоже на пост. Вот почему, как и в сообщении, мы хотели бы иметь возможность использовать шорткоды, чтобы делать все, что мы хотим. Для этого мы можем использовать фильтр widget_text Этот фильтр вызывается для внесения изменений в содержимое виджета «Текст». Мы будем использовать его здесь, чтобы попросить WordPress проанализировать шорткоды в этом виджете.

Разбор коротких кодов в WordPress достигается благодаря функции do_shortcode() Он принимает один обязательный параметр — текст для анализа и возвращает проанализированный текст. Это означает, что мы можем напрямую использовать эту функцию в качестве функции обратного вызова в фильтре widget_text

Код ниже можно использовать в файле плагина или в файле functions.php

 <?php
add_filter('widget_text', 'do_shortcode');
?>

И мы сделали. Теперь любой существующий шорткод, который вы вводите в виджете «Текст», будет проанализирован.

короткий код

Создание нового виджета шорткодов

Кроме того, мы также можем создать наш собственный виджет. Так как стандартный виджет «Текст» работает отлично, мы можем просто адаптировать его код из следующего (он находится в файле /wp-includes/default-widgets.php Стоит отметить, что мы должны создать наш собственный плагин, а не изменять основные файлы WordPress.

 <?php
class WP_Widget_Text extends WP_Widget {

    public function __construct() {
        $widget_ops = array('classname' => '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 documented in 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    $widget_text The widget 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'];
        } ?>
            <div class="textwidget"><?php echo !empty( $instance['filter'] ) ? wpautop( $text ) : $text; ?></div>
        <?php
        echo $args['after_widget'];
    }

    /**
     * @param array $new_instance
     * @param array $old_instance
     * @return array
     */
    public function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        if ( current_user_can('unfiltered_html') )
            $instance['text'] =  $new_instance['text'];
        else
            $instance['text'] = stripslashes( wp_filter_post_kses( addslashes($new_instance['text']) ) ); // wp_filter_post_kses() expects slashed
        $instance['filter'] = ! empty( $new_instance['filter'] );
        return $instance;
    }

    /**
     * @param array $instance
     */
    public function form( $instance ) {
        $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'text' => '' ) );
        $title = strip_tags($instance['title']);
        $text = esc_textarea($instance['text']);
?>
        <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>

        <p><label for="<?php echo $this->get_field_id( 'text' ); ?>"><?php _e( 'Content:' ); ?></label>
        <textarea class="widefat" rows="16" cols="20" id="<?php echo $this->get_field_id('text'); ?>" name="<?php echo $this->get_field_name('text'); ?>"><?php echo $text; ?></textarea></p>

        <p><input id="<?php echo $this->get_field_id('filter'); ?>" name="<?php echo $this->get_field_name('filter'); ?>" type="checkbox" <?php checked(isset($instance['filter']) ? $instance['filter'] : 0); ?> />&nbsp;<label for="<?php echo $this->get_field_id('filter'); ?>"><?php _e('Automatically add paragraphs'); ?></label></p>
<?php
    }
}
?>

У нас нет много деталей, чтобы изменить здесь. Первое, что нужно изменить, — это название класса. Я решил назвать его WP_Widget_Shortcodes Поскольку конструктор этого класса устанавливает некоторую информацию о самом виджете, мы также должны изменить его.

 <?php
public function __construct() {
    $widget_ops = array('classname' => 'widget_shortcodes', 'description' => __('Arbitrary text or HTML with shortcodes.'));
    $control_ops = array('width' => 400, 'height' => 350);
    parent::__construct('shortcodes', __('Shortcodes'), $widget_ops, $control_ops);
}
?>

Другая вещь, которую нужно изменить, — это метод widget() Мы изменяем содержимое переменной $text Мы удаляем вызов к фильтру widget_textdo_shortcode()

 <?php
$text = empty( $instance['text'] ) ? '' : do_shortcode($instance['text']);
?>

Затем нам нужно зарегистрировать наш виджет, чтобы иметь возможность добавить его, как любой другой виджет. Это может быть достигнуто благодаря действию widgets_init

 <?php
add_action('widgets_init', function() {
    register_widget('WP_Widget_Shortcodes');
});
?>

Теперь вы можете найти наш виджет в списке доступных виджетов. Вы можете добавить его в любую совместимую зону, и он будет интерпретировать любой используемый вами шорткод.

виджет шорткодов

Заключительные слова

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

Обратите внимание, что изменения, которые мы использовали в виджете «Текст» по умолчанию, минимальны. Вы можете изменить что-либо еще, если хотите настроить свой виджет. Вы можете получить фильтр, который мы использовали, и виджет, который мы создали, в примере плагина, доступного для загрузки здесь, если вы хотите продолжить эксперимент.