Допустим, вам нужно сгенерировать JavaScript или код CSS, который зависит от текущего контекста.
Например, у вас есть форма на главной странице, которая запускает ajax-запрос при отправке, и другая форма на одной странице. Или, в случае с CSS, вы хотите создать тему, которая позволит пользователям создавать собственные макеты, менять цвета и т. Д.
Решения, которые я вижу до сих пор:
Включите код в раздел заголовка документа (или в конце в случае JS)
Сделайте специальный запрос, который выводит код, например site.com?get_assets . Это медленно, потому что WP загружается дважды.
Сохраните его во временных файлах в течение определенного времени и загрузите оттуда. Не очень надежно для публичных тем или плагинов.
Только для Javascript - сделайте его статичным, поместив его в обычный файл, который загружается каждый раз. В этом случае вам придется заставить свой код обрабатывать любую ситуацию
Ты знаешь других? По какому пути вы пойдете?
источник
Ответы:
Одна дополнительная опция, в зависимости от типа параметров, которые вам нужно передать. Давайте назовем это (2a). Вы также можете создавать PHP-скрипты, которые выводят динамически сгенерированные
text/css
илиtext/javascript
вместо нихtext/html
, и предоставлять им необходимые данные, используя параметры GET, а не загружая WordPress. Конечно, это работает, только если вам нужно передать относительно небольшое количество относительно компактных параметров. Так, например, скажем, вам нужно передать только URL-адрес поста или директории файла или чего-то подобного, вы можете сделать что-то вроде этого:В header.php:
В fancy-js.php:
и т.п.
Но это только позволяет вам получить доступ к данным, непосредственно переданным в параметрах GET; и это будет работать только в том случае, если количество вещей, которые вам нужно передать, относительно мало, а представление этих вещей относительно компактно. (В основном горстка строковых или числовых значений - имя пользователя, скажем, или каталог; не список всех последних сообщений пользователя или что-то в этом роде.)
Что касается того, какой из этих вариантов является лучшим - я не знаю; это зависит от вашего варианта использования. Вариант (1) имеет преимущество простоты и однозначного предоставления вам доступа к любым данным WordPress, которые вам могут понадобиться, без снижения производительности при двойной загрузке WordPress. Это почти наверняка то, что вы должны делать, если у вас нет веских причин не делать этого (например, из-за размера таблицы стилей или сценария, которые вам нужно использовать).
Если размер становится достаточно большим, чтобы вызвать проблемы с точки зрения веса одной страницы, то вы можете попробовать (2) или (2a).
Или - возможно, это лучшая идея - вы можете попытаться отделить части скрипта или таблицы стилей, которые фактически используют динамические данные, от частей, которые могут быть определены статически. Скажем, у вас есть таблица стилей, которой нужно передать каталог из WordPress, чтобы установить параметр фона для элемента # my-fancy. Вы можете поместить все это в элемент head:
Но зачем вам это делать? Здесь есть только одна строка, которая зависит от данных из WordPress. Лучше выделить только те строки, которые зависят от WordPress:
Поместите все остальное в статическую таблицу стилей, в которую вы загружаете стандартный элемент ссылки (style.css или любой другой):
И пусть каскад сделает всю работу.
То же самое касается JavaScript: вместо того, чтобы делать это:
Вместо этого поместите что-то вроде этого в элемент head:
А затем поместите остальные в статический файл JavaScript, переписав my_huge_function () и my_other_function (), чтобы использовать глобальные переменные WordPressPostData.url и WordPressPostData.author.
40 КБ CSS или 40 КБ JS почти всегда можно разбить на <1 КБ, что на самом деле зависит от динамических данных, а остальные - могут быть указаны в статическом внешнем файле и затем рекомбинированы с использованием каскада (для CSS) или глобально доступного переменные (глобальные переменные, элементы DOM или любые другие предпочтительные места для JS).
источник
Динамический случай CSS довольно прост.
Просто создайте функцию, которая выводит динамические определения CSS внутри
<style type="text/css"></style>
тегов, а затем подключите эту функцию кwp_print_styles
. напримерИли, скажем, у вас есть предварительно настроенные цветовые схемы; Вы можете поставить в очередь соответствующую таблицу стилей в соответствии с текущими настройками пользователя:
Обратите внимание, что в этом случае функция подключается
wp_enqueue_scripts
, поскольку WordPress не имеетwp_enqueue_styles
ловушки действий.источник
Я думал об этом некоторое время сейчас. Ваш вопрос заставляет меня вернуться к нему. Не уверен, что это хорошая идея или нет, поэтому я хотел бы получить комментарии экспертов по этому поводу.
Что делать, если я пишу файл javascript / css через php, когда администратор сохраняет данные. Это будет однократная запись, пока пользователь не изменит макет снова (что пользователь может делать не слишком часто). Таким образом, мы получаем доступ к базе данных для пользовательских настроек только один раз, когда пользователь сохраняет данные.
После записи файла это будут обычные файлы javascript / css, поэтому нам не нужно вызывать базу данных каждый раз при загрузке темы.
Один вопрос, на который нужно ответить: что произойдет, когда посетитель попытается получить доступ к сайту в тот момент, когда php пишет файл?
Дайте мне знать, что вы думаете.
источник
wp-content/uploads
(единственном каталоге, который гарантированно доступен для записи из кода WP), это может быть жизнеспособным подходом. Я думаю, что даже WP Core использует эту технику для одного файла js.Для небольших фрагментов скриптов, которые вы, возможно, не захотите включать в отдельный файл, например, потому что они генерируются динамически, WordPress 4.5 и другие предложения
wp_add_inline_script
. Эта функция в основном привязывает скрипт к другому скрипту. Допустим, например, что вы разрабатываете тему и хотите, чтобы ваш клиент мог вставлять свои собственные сценарии (например, Google Analytics или AddThis) через страницу параметров. Пример .Для стилей
wp_add_inline_style
, которые в основном работают одинаково. Вы могли бы использовать его, например, для циклического прохождения всех ваших модификаторов-модификаторов и собирать их в строку с именем$all_mods
, которую вы затем добавили бы так в свою основную таблицу стилей:источник
Создайте динамический файл JS.php и передайте ему важные query_vars. Эти переменные в
$_GET
файле помогут определить контекст, и в нем вы сможете кэшировать и использовать егоreadfile()
для будущих запросов ... делайте что угодно.Просто убедитесь, что файл загружает
wp-load.php
прежде всего, чтобы у вас был доступ к функциям WP. Используйте относительный путь к текущей папке(dirname(__FILE__))
или просто копайте по убыванию в структуре папок, чтобы найтиwp-load.php
независимо от размещения плагина.Код для поиска wp-load.php из любого места
Ура, Scribu!
PS : Для сложных структур , где папки не следуют нормальной структуре WP декрементной, родительские модули могут обмениваться информация с непосредственно доступными файлами. Родительский плагин, который поставляется с динамическим файлом PHP, который отображает CSS / JS, может записать в файл
realpath()
the,wp-load.php
и автономный файл может использовать это. Это будет проблемой для 0,1% пользователей WP. Я думаю, что те, кто перемещают папки и не следуют обычной структуре, знают, что они делают, и, вероятно, могут подключать плагины PIMP, которые нужно загружатьwp-load.php
напрямую.источник
wp-load.php
из файла темы или плагина, так как каталогиwp-content
и / илиplugins
могут находиться где угодно относительно корневого каталога WP. Помните WP_CONTENT_DIR и WP_PLUGINS_DIR.