Сышышь ты, выходи сюда,
поговорим !

Вывод css только астраницах с шорткодом в wordpress

Опубликовано: 01.09.2018

Шорткоды WordPress прекрасны ими удобно расширять функционал страниц и постов, но есть как минимум один сомнительный момент, заключается он в том что для некоторых шорткодов хотелось бы подключить js и css файлы. Здесь и начинаются вопросы, например как подключить эти файлы только на страницах где это необходимо.

Мне не хотелось бы видеть эти файлы на тех страницах контент которых не содержит шорткода, но о том как это сделать правильно информации толком найти не удалось поэтому будем экспериментировать.

В ядре WordPress есть функция

has_shortcode();

которая может проверить содержится ли указанный шорткод в переданном тексте.

Внутри эта магия магия работает по средствам регулярок, а как иначе.

План действий таков:

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

Класс плагина я сопроводил комментариями дабы было понятней

<?php /* Plugin Name: My good shortcode Plugin URI: https://alkoweb.ru/primenyaem-js-css-tolko-na-teh-stranitsah-gde-prisutstvuet-shortkod-wordpress Author: Petrozavodsky Author URI: https://alkoweb.ru Version: 1.0.0 */ class My_Good_shortcode { /* Конструкор классса */ function __construct() { /* Подключаем домен перевода*/ add_action('plugins_loaded', array($this, 'load_textdomain')); /* Регистрируем шерткод*/ add_shortcode('my_good_shortcode', array($this, 'add_shortcode')); /* Добавляем вызом метода add_js_css событию wp т.к. к этому момент переменная $post точно существует */ add_action('wp' , array( &$this , 'add_js_css') ); } function add_js_css() { /* Получаем глобальную переменную $post */ global $post; /* Регистрируем таблицу стилей */ wp_register_style('my_good_shortcode_css', plugin_dir_url(__FILE__) . 'public/css/my_good_shortcode.css', array(), '1.0.0'); /* Проверяем нет присутствует ли в записи шорткод, если да то выводит css */ if ( has_shortcode($post->post_content, 'my_good_shortcode') ) { wp_enqueue_style('my_good_shortcode_css'); } } /* Метод выводящий шорткод */ function add_shortcode($res) { $res = ''; $res .= '<div class="block__shortcode">'; $res .= __('Hello world','my_good_shortcode') ; $res .= '</div>'; return apply_filters('my_good_shortcode', $res); } /* Загружаем текстовый домен */ function load_textdomain() { $mo_file_path = dirname(__FILE__) . '/languages/' . get_locale() . '.mo'; load_textdomain('my_good_shortcode', $mo_file_path); } } $my_good_shortcode = new My_Good_shortcode();

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

Использовать ли описанное в своих проектах выше дело каждого, но я слышал где то что одним их критериев оценки качества кода в репозитории wordpress.org ну то есть Ривьеры смотрят не подключенный ли ресурсы на страницах которые они не используются.

rss