Я выпустил плагин, который создает шорткод и требует файл JavaScript и файл CSS для загрузки на любую страницу, которая содержит этот шорткод. Я мог бы просто загрузить скрипт / стиль на все страницы, но это не лучшая практика. Я только хочу загрузить файлы на страницах, которые вызывают шорткод. Я нашел два способа сделать это, но у обоих есть проблемы.
Метод 1 устанавливает значение true в функцию-обработчик шорткода, а затем проверяет это значение в wp_footer
обратном вызове. Если это правда, он использует wp_print_scripts()
для загрузки JavaScript. Проблема в том, что он работает только для JavaScript, а не CSS, потому что CSS должен быть объявлен внутри <head>
, что вы можете сделать только во время раннего хука, например init
или wp_head
.
Метод 2 запускается рано и «заглядывает вперед», чтобы увидеть, существует ли шорткод в содержимом текущей страницы. Мне нравится этот метод намного лучше, чем первый, но проблема в том, что он не обнаружит, вызывает ли шаблон do_shortcode()
.
Итак, я склоняюсь к использованию второго метода, а затем пытаюсь определить, назначен ли шаблон, и если да, проанализировать его для шорткода. Прежде чем я сделаю это, я хотел проверить, знает ли кто-нибудь о лучшем методе.
Обновление: я интегрировал решение в свой плагин. Если кому-то интересно увидеть его в живом окружении, вы можете скачать его или просмотреть .
Обновление 2: Начиная с WordPress 3.3, теперь можно вызывать wp_enqueue_script()
непосредственно внутри обратного вызова с коротким кодом , и файл JavaScript будет вызываться в нижнем колонтитуле документа. Это технически возможно и для файлов CSS, но это следует считать плохой практикой, поскольку вывод CSS за пределы <head>
тега нарушает спецификации W3C, может привести к FOUC и может заставить браузер повторно выполнить рендеринг страницы.
Ответы:
Основываясь на своем собственном опыте, я использовал комбинацию методов 1 и 2 - архитектуру и сценарии нижнего колонтитула 1 и технику прогнозирования 2.
Для прогнозирования я использую регулярное выражение вместо
stripos
; личные предпочтения, быстрее, и может проверить «неправильный» шорткод;Если вы обеспокоены тем, что авторы используют
do_shortcode
вручную, я бы рекомендовал имиспользовать вызов действия, чтобы поставить вочередь ваш предварительно зарегистрированный стиль вручную.ОБНОВЛЕНИЕ : Для ленивого автора, который никогда не RTFM, выведите сообщение, чтобы выдвинуть на первый план ошибку их путей;)
источник
do_shortcode()
, не разумно ли предположить, что они также обладают хорошими навыками следования инструкциям для постановки в очередь стиля шорткода?init
, просто где-то раньшеwp_head
. Для ленивого разработчика, проверьтеwp_style_is( 'my_style_handle', 'done' )
внутри своего шорткода. Если значение равно false, распечатайте видимую ошибку, которая указывает им, что делать.do_shortcode()
в шаблон уже «делает что-то лишнее» - и пользователи, которые будут делать что-то дополнительное, либо уже знают о необходимости поставить в очередь стиль, либо будут более охотно / вероятно следовать специальным инструкциям.Я опаздываю с ответом на этот вопрос, но с тех пор, как Ян начал эту тему в списке wp-хакеров, я подумал, что стоит ответить, особенно учитывая, что я планировал добавить такую функцию в некоторые плагины, над которыми я работал.
Подход, который необходимо рассмотреть, заключается в проверке загрузки первой страницы, чтобы увидеть, действительно ли используется шорткод, и затем сохранении статуса использования шорткода в мета-ключе поста. Вот как:
Пошаговая инструкция
$shortcode_used
флаг в'no'
.$shortcode_used
флаг в'yes'
.'the_content'
приоритет перехвата,12
который происходит после того, как WordPress обработал шорткоды, и проверьте метаданные публикации на предмет''
использования ключа"_has_{$shortcode_name}_shortcode"
. (Значение''
возвращается, когда мета-ключ сообщения не существует для идентификатора сообщения.)'save_post'
ловушку для удаления мета-сообщения, удаляя постоянный флаг для этого сообщения в случае, если пользователь меняет использование шорткода.'save_post'
ловушке используетсяwp_remote_request()
для отправки неблокирующего HTTP GET на собственную постоянную ссылку поста для запуска загрузки первой страницы и установки постоянного флага.'wp_print_styles'
и проверьте мета сообщения для значения'yes'
,'no'
или''
используя ключ"_has_{$shortcode_name}_shortcode"
. Если значение'no'
не служит внешнему. Если значение'yes'
или''
идти вперед и служить внешним.И это должно сделать это. Я написал и протестировал пример плагина, чтобы показать, как все это работает.
Пример кода плагина
Плагин
[trigger-css]
активирует шорткод, который устанавливает<h2>
элементы на странице белым по красному, чтобы вы могли легко увидеть, как он работает. Предполагается, чтоcss
подкаталог содержитstyle.css
файл с этим CSS:И ниже код в рабочем плагине:
Примеры скриншотов
Вот серия скриншотов
Основной редактор сообщений, без содержимого
Опубликовать дисплей, нет контента
Базовый редактор сообщений с
[trigger-css]
шорткодомОпубликовать дисплей с
[trigger-css]
шорткодомНе уверен, что это 100%
Я считаю, что вышеупомянутое должно работать почти во всех случаях, но поскольку я только что написал этот код, я не могу быть уверен на 100%. Если вы можете найти ситуации, когда это не работает, мне бы очень хотелось знать, чтобы я мог исправить код в некоторых плагинах, к которым я только что добавил это. Заранее спасибо.
источник
post_content
. А как насчет шорткодов в виджетах?'pre_http_request'
ловушку и отключить несколько вызовов на один и тот же URL, пока'save_post'
ловушка активна, но я бы хотел подождать, пока мы действительно увидим необходимость в этом, нет? Что касается виджетов, они могут быть улучшены для обработки, но это не тот вариант использования, на который я смотрел.<style>
).Поиск в Google нашел мне потенциальный ответ . Я говорю «потенциал», так как он выглядит хорошо, должен работать, но я не уверен на 100%, что это лучший способ сделать это:
Это должно быть в состоянии проверить, использует ли текущее сообщение шорткод, и соответствующим образом добавить таблицу стилей в
<head>
элемент. Но я не думаю, что это будет работать для индексной (то есть, нескольких записей в цикле) страницы ... Это также из 2-летней записи в блоге, поэтому я даже не уверен, что она будет работать с WP 3.1.X ,источник
get_shortcode_regex()
для поиска.do_shortcode()
вручную в шаблоне, то вы уже знаете, что вы будете использоватьИспользуя комбинацию ответа TheDeadMedic и документации get_shortcode_regex () (которая фактически не нашла мои шорткоды), я создал простую функцию, используемую для постановки сценариев в очередь для нескольких шорткодов. Поскольку wp_enqueue_script () в шорткодах только добавляет в нижний колонтитул, это может быть полезно, поскольку оно может обрабатывать как сценарии верхнего, так и нижнего колонтитула.
источник
Наконец, я также нашел решение для условной загрузки CSS, которое работает для моего плагина www.mapsmarker.com, и я хотел бы поделиться с вами. Он проверяет, используется ли мой шорткод в текущем файле шаблона и header / footer.php, и, если да, помещает в таблицу необходимую таблицу стилей в заголовке:
источник
Для моего плагина я обнаружил, что иногда у пользователей есть конструктор тем, у которого есть шорткод, сохраненный в метаданных поста . Вот что я использую, чтобы определить, присутствует ли мой шорткод плагина в текущем посте или метаданных поста :
источник
Для файлов CSS вы можете загрузить их в свой вывод шорткода:
Установите константу или что-то после этого, например
MY_CSS_LOADED
(включайте CSS, только если константа не установлена).Оба ваших метода медленнее, чем идти по этому пути.
Для файлов JS вы можете сделать то же самое, если загружаемый скрипт уникален и не имеет внешних зависимостей. Если это не так, загрузите его в нижний колонтитул, но используйте константу, чтобы определить, нужно ли загружать или нет ...
источник
<head>
элемента не является правильной разметкой. Правда, валидация - это всего лишь руководство, но если мы пытаемся придерживаться этого правила, это делает загрузку таблицы стилей в выводе шорткода плохой идеей.<style type="text/css"> The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head"
. Таким образом, встроенные стили (<element style="..."></element>
) допустимы, а встроенные<style>
элементы - нет.Script Logic - это плагин WordPress, который дает вам полный контроль над всеми файлами JavaScript и CSS. Используя этот плагин, вы можете условно загружать файлы CSS и JS только на те страницы, где это необходимо.
http://wordpress.org/plugins/script-logic/
источник