Каков идеальный способ регистрации / постановки в очередь скриптов и / или стилей для использования в плагинах?
Недавно я сделал плагин простым плагином для добавления пользователя аватар / граватар с коротким кодом. У меня есть разные варианты стилей для отображения аватара (квадрат, круг и т. Д.), И я решил поместить CSS непосредственно в сам шорткод.
Однако теперь я понимаю, что это не очень хороший подход, поскольку он будет повторять CSS каждый раз, когда шорткод используется на странице. Я видел несколько других подходов на этом сайте, и в кодексе wp даже есть два собственных примера, поэтому трудно понять, какой подход наиболее последовательный и быстрый.
Вот методы, которые я в настоящее время знаю:
Способ 1: включить непосредственно в шорткод - это то, что я сейчас делаю в плагине, но не очень хорошо, так как он повторяет код.
class My_Shortcode {
function handle_shortcode( $atts, $content="" ) {
/* simply enqueue or print the scripts/styles in the shortcode itself */
?>
<style type="text/css">
</style>
<?php
return "$content";
}
}
add_shortcode( 'myshortcode', array( 'My_Shortcode', 'handle_shortcode' ) );
Способ 2. Использование класса для постановки в очередь скриптов или стилей условно
class My_Shortcode {
static $add_script;
static function init() {
add_shortcode('myshortcode', array(__CLASS__, 'handle_shortcode'));
add_action('init', array(__CLASS__, 'register_script'));
add_action('wp_footer', array(__CLASS__, 'print_script'));
}
static function handle_shortcode($atts) {
self::$add_script = true;
// shortcode handling here
}
static function register_script() {
wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
}
static function print_script() {
if ( ! self::$add_script )
return;
wp_print_scripts('my-script');
}
}
My_Shortcode::init();
Способ 3: использование get_shortcode_regex();
function your_prefix_detect_shortcode() {
global $wp_query;
$posts = $wp_query->posts;
$pattern = get_shortcode_regex();
foreach ($posts as $post){
if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
&& array_key_exists( 2, $matches )
&& in_array( 'myshortcode', $matches[2] ) )
{
// css/js
break;
}
}
}
add_action( 'wp', 'your_prefix_detect_shortcode' );
Метод 4: Использование has_shortcode();
function custom_shortcode_scripts() {
global $post;
if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'myshortcode') ) {
wp_enqueue_script( 'my-script');
}
}
add_action( 'wp_enqueue_scripts', 'custom_shortcode_scripts');
Method 4: Using has_shortcode();
это лучше, потому что это гарантирует, что скрипты и стили будут загружаться один раз, если содержимое публикации имеет шорткод, независимо от многократного использования шорткода. Хотя это может не работать для использования шорткода в виджетах или на боковой панели, хотя не уверен. Если это для плагина, то я бы не рекомендовал вам связывать скрипты с шорткодом, потому что некоторые могут вызвать вашу функцию вместо шорткода, чтобы получить желаемый результат.Ответы:
Я нашел другой способ, который хорошо работает для меня:
При инициализации плагина не ставьте в очередь ваши скрипты и стили, а зарегистрируйте их с помощью
wp_register_style
иwp_register_script
.Далее вы можете загрузить скрипт / стиль по требованию. Например, когда вы отображаете шорткод с помощью
wp_enqueue_style("your_style")
иwp_enqueue_script("your_script")
.Вот пример плагина, использующего этот метод, который позволяет вам использовать get_avatar в качестве шорткода. Таблица стилей ставится в очередь только при наличии шорткода.
Использование (идентификатор по умолчанию для текущего пользователя):
[get_avatar id="" size="32" default="mystery" alt="Profile Photo" class="round"]
источник
wp_enqueue_scripts
перехват уже произошел. (Шорткоды анализируются, во времяthe_content
которых является частьюthe_post
хука, то есть постановка в очередь, когда он анализируется, слишком поздно, если вы уже не зарегистрировали скрипт)Прежде чем начать отвечать, я должен сказать, что в отношении этой темы css и js не совпадают.
Причина проста: хотя добавление js в тело страницы (в нижнем колонтитуле) является распространенным и правильным способом, CSS следует размещать в
<head>
разделе страницы: даже если большинство браузеров могут правильно отображать CSS на странице тело, это не правильный код HTML.Когда визуализируется шорткод,
<head>
секция уже была напечатана, это означает, что js может быть добавлен без проблем в нижний колонтитул, но css должен быть добавлен до визуализации шорткода.Сценарии
Если вашему шорткоду нужен только js, вам повезло, и вы можете просто использовать его
wp_enqueue_script
в теле обратного вызова шорткода:При этом ваш скрипт добавляется в нижний колонтитул и только один раз, даже если шорткод используется более одного раза на странице.
Стили
Если вашему коду нужны стили, вам нужно действовать до того, как шорткод будет действительно отображен.
Есть разные способы сделать это:
посмотрите на все сообщения в текущем запросе и добавьте стили шорткода, если это необходимо. Это то, что вы делаете в методе № 3 и № 4 в ОП. На самом деле, оба эти метода делают одно и то же, но
has_shortcode
были добавлены в WP 3.6, хотяget_shortcode_regex
доступны с версии 2.5, поэтому используйте их,get_shortcode_regex
только если вы хотите, чтобы ваш плагин был совместим со старыми версиями.всегда добавлять стиль шорткода на всех страницах
вопросы
Проблема с # 1 - производительность. Регулярные выражения довольно медленные операции, и запуск регулярных выражений в цикле всех сообщений может последовательно замедлять работу страницы. Кроме того, в темах довольно распространено задание показывать только выдержку из архива и показывать полный контент с короткими кодами только в единственном виде. Если это произойдет, когда будет показан архив, ваш плагин запустит сопоставление регулярных выражений в цикле с целью добавления стиля, который никогда не будет использоваться: ненужное двойное влияние на производительность: замедление генерации страниц + дополнительный ненужный HTTP-запрос
Проблема с # 2 - это опять же производительность. Добавление стиля ко всем страницам означает добавление дополнительного HTTP-запроса для всех страниц, даже если он не нужен. Даже если это не повлияет на время создания страницы на стороне сервера, общее время отображения страницы будет одинаковым для всех страниц сайта.
Итак, что должен делать разработчик плагинов?
Я думаю, что лучше всего добавить страницу параметров в плагин, где пользователи могут выбирать, должен ли шорткод обрабатываться только в единственном представлении или даже в архивах. В обоих случаях лучше предоставить другую опцию, чтобы выбрать, для каких типов сообщений включить шорткод.
Таким образом можно подключить,
"template_redirect"
чтобы проверить, удовлетворяет ли текущий запрос требованиям, и в этом случае добавить стиль.Если пользователь решает использовать шорткод только в отдельных записях, рекомендуется проверить, есть ли у шорткода пост или нет: если требуется только одно регулярное выражение, это не должно сильно замедлять страницу.
Если пользователь решит использовать шорткод даже в архивах, я бы не использовал regex для всех постов, если количество постов велико, и просто ставил бы в очередь стиль, если требования соответствовали требованиям.
Что следует считать «высоким» в этом отношении, можно получить с помощью некоторых тестов производительности или, в качестве альтернативы, добавить еще один вариант и дать выбор пользователям.
источник
<style>
теги в теле документа теперь действительны в соответствии со спецификацией W3C. w3.org/TR/html52/document-metadata.html#the-style-elementДля моего плагина я обнаружил, что иногда у пользователей есть конструктор тем, у которого есть шорткод, сохраненный в метаданных поста . Вот что я использую, чтобы определить, присутствует ли мой шорткод плагина в текущем посте или метаданных поста :
источник
Я делаю так:
и перехватить хук в других функциях (или других плагинах):
источник
Я выяснил для своего собственного плагина, присутствует ли шорткод в текстовом виджете.
источник
В WordPress есть встроенная функция, позволяющая делать что-то на основе определенного шорткода, представляющего статус. Имя функции есть
has_shortcode()
. Вы можете использовать следующий код, чтобы поставить в очередь свой стиль и сценарии.Здесь я использовал,
is_a( $post, 'WP_Post' )
чтобы проверить, принадлежит ли$post
объектWP_Post
классу, и я использовал,$post->post_content
чтобы проверить содержание сообщения.источник
Я сделал комбинацию кода примера со страницы Wordpress для has_shortcode () и ответа, который дал zndencka . Я заметил, что функция has_shortcode добавлена в Wordpress 3.6, поэтому я сначала проверяю, существует ли эта функция. Возможно, эта проверка немного устарела, так как не так много пользователей из WordPress ниже 3.6, согласно их собственной статистике.
источник
Мы действительно можем условно загружать файлы CSS и JS через шорткод, не используя чрезмерно сложные функции:
Во-первых, давайте предположим, что мы зарегистрировали все наши файлы CSS / JS ранее (возможно, при
wp_enqueue_scripts
запуске)Далее, давайте рассмотрим нашу функцию шорткода:
Просто. Готово. Ergo: мы можем «условно загружать» файлы css / js (только при запуске [shortcode]).
Давайте рассмотрим следующую идеологию:
prep_css_and_js()
работы я загружаю ВСЕ файлы .css / .js, которые находятся в определенных папках ...Теперь, когда WP видит их в качестве зарегистрированных сценариев, мы действительно можем назвать их, условно, исходя из множества ситуаций, включая, но не ограничиваясь
my_shortcode_func()
Преимущества: (без MySQL, без расширенных функций и без фильтров)
Рекомендации:
источник