Одна дополнительная опция, в зависимости от типа параметров, которые вам нужно передать. Давайте назовем это (2a). Вы также можете создавать PHP-скрипты, которые выводят динамически сгенерированные text/css
или text/javascript
вместо них text/html
, и предоставлять им необходимые данные, используя параметры GET, а не загружая WordPress. Конечно, это работает, только если вам нужно передать относительно небольшое количество относительно компактных параметров. Так, например, скажем, вам нужно передать только URL-адрес поста или директории файла или чего-то подобного, вы можете сделать что-то вроде этого:
В header.php:
<script type="text/javascript" src="<?php print get_stylesheet_directory_uri();
?>/fancy-js.php?foo=bar&url=<?php print urlencode(get_permalink($post->ID)); ?>"></script>
В fancy-js.php:
<?php
header("Content-type: text/javascript");
?>
foo = <?php print json_encode($_GET['foo']); ?>;
url = <?php print json_encode($_GET['url']); ?>;
и т.п.
Но это только позволяет вам получить доступ к данным, непосредственно переданным в параметрах GET; и это будет работать только в том случае, если количество вещей, которые вам нужно передать, относительно мало, а представление этих вещей относительно компактно. (В основном горстка строковых или числовых значений - имя пользователя, скажем, или каталог; не список всех последних сообщений пользователя или что-то в этом роде.)
Что касается того, какой из этих вариантов является лучшим - я не знаю; это зависит от вашего варианта использования. Вариант (1) имеет преимущество простоты и однозначного предоставления вам доступа к любым данным WordPress, которые вам могут понадобиться, без снижения производительности при двойной загрузке WordPress. Это почти наверняка то, что вы должны делать, если у вас нет веских причин не делать этого (например, из-за размера таблицы стилей или сценария, которые вам нужно использовать).
Если размер становится достаточно большим, чтобы вызвать проблемы с точки зрения веса одной страницы, то вы можете попробовать (2) или (2a).
Или - возможно, это лучшая идея - вы можете попытаться отделить части скрипта или таблицы стилей, которые фактически используют динамические данные, от частей, которые могут быть определены статически. Скажем, у вас есть таблица стилей, которой нужно передать каталог из WordPress, чтобы установить параметр фона для элемента # my-fancy. Вы можете поместить все это в элемент head:
<style type="text/css">
#my-fancy-element {
background-image: url(<?php print get_stylesheet_directory_uri(); ?>images/fancy.png);
padding: 20px;
margin: 20px;
font-weight: bold;
text-transform: uppercase;
font-size: 12pt;
/* ... KB and KB of additional styles ... */
}
#another-fancy-element {
/* ... KB and KB of additional styles ... */
}
/* ... KB and KB of additional styles ... */
</style>
Но зачем вам это делать? Здесь есть только одна строка, которая зависит от данных из WordPress. Лучше выделить только те строки, которые зависят от WordPress:
<style type="text/css">
#my-fancy-element {
background-image: url(<?php print get_stylesheet_directory_uri(); ?>images/fancy.png);
}
</style>
Поместите все остальное в статическую таблицу стилей, в которую вы загружаете стандартный элемент ссылки (style.css или любой другой):
#my-fancy-element {
/* background-image provided dynamically */
padding: 20px;
margin: 20px;
font-weight: bold;
text-transform: uppercase;
font-size: 12pt;
/* ... KB and KB of additional styles ... */
}
#another-fancy-element {
/* ... KB and KB of additional styles ... */
}
/* ... KB and KB of additional styles ... */
И пусть каскад сделает всю работу.
То же самое касается JavaScript: вместо того, чтобы делать это:
<script type="text/javascript">
// Here comes a huge function that uses WordPress data:
function my_huge_function () {
// Do a million things ...
jQuery('#my-fancy').append('<a href="'+<?php json_encode(get_permalink($GLOBALS['post']->ID)); ?>+'">foo</a>);
// Do a million more things ...
my_other_function(<?php print json_encode(get_userdata($GLOBALS['post']->post_author); ?>);
}
function my_other_function (user) {
// Do a million things ...
}
</script>
Вместо этого поместите что-то вроде этого в элемент head:
<script type="text/javascript">
var WordPressPostData = {
url: <?php print json_encode(get_permalink($GLOBALS['post']->ID)); ?>,
author: <?php print json_encode(get_userdata($GLOBALS['post']->post_author)); ?>
}
</script>
А затем поместите остальные в статический файл JavaScript, переписав my_huge_function () и my_other_function (), чтобы использовать глобальные переменные WordPressPostData.url и WordPressPostData.author.
40 КБ CSS или 40 КБ JS почти всегда можно разбить на <1 КБ, что на самом деле зависит от динамических данных, а остальные - могут быть указаны в статическом внешнем файле и затем рекомбинированы с использованием каскада (для CSS) или глобально доступного переменные (глобальные переменные, элементы DOM или любые другие предпочтительные места для JS).