get_template_directory_uri() и другие URL-теги не работают в теме
Итак, я пытаюсь добавить get_template_directory_uri или bloginfo() в мой файл header.php для создания относительных путей к CSS и JS файлам в теме.
Например,
<link rel="stylesheet" href="<?php echo get_template_directory_uri(); ?>/css/style.css">
Теоретически это должно отображаться как
<link rel="stylesheet" href="http://mysite.com/wp-content/themes/myTheme/css/style.css">
Проблема в том, что когда я просматриваю тег <head>
в исходном коде, я вижу только:
<link rel="stylesheet" href="/css/style.css">
Все остальные теги шаблона работают в моих файлах (get_permalink(), the_title() и т.д.), но этот не работает. echo get_bloginfo('url')
также работает.
Я думал о том, чтобы изменить файл wp-config.php
и сделать что-то вроде:
define('WP_HOME','http://example.com/blog');
define('WP_SITEURL','http://example.com/blog');
...но я не уверен, является ли это лучшей практикой для переписывания URL.
Что я упускаю?

Что у вас есть:
<link rel="stylesheet" href="<?php echo get_template_directory_uri(); ?>/css/style.css">
должно работать нормально. Я скопировал и вставил это в свой header.php
, и это сработало.
Но это не правильный способ подключения CSS или JavaScript файлов. Правильный способ — использовать хук wp_enqueue_scripts
. Например, допустим, у вас есть JavaScript файл, который вы хотите загрузить и который требует jQuery для работы. Вы регистрируете скрипт и указываете jQuery как зависимость. WordPress сделает всё остальное:
<?php
function my_scripts_method() {
// регистрируем расположение скрипта и его зависимости
wp_register_script('custom_script',
get_template_directory_uri() . '/js/custom_script.js',
array('jquery')
);
// подключаем скрипт
wp_enqueue_script('custom_script');
}
add_action('wp_enqueue_scripts', 'my_scripts_method');
?>
Для стилей (используется тот же хук):
function my_styles_method() {
// Регистрируем стиль для темы:
wp_register_style( 'my-custom-style', get_template_directory_uri().'/css/custom-style.css');
// подключаем стиль
wp_enqueue_style( 'my-custom-style' );
}
add_action( 'wp_enqueue_scripts', 'my_styles_method' );
Пожалуйста, прочитайте страницы Кодекса о wp_enqueue_script()
и wp_enqueue_style()
.
Это может показаться неважным, но особенно при загрузке скриптов вы, вероятно, обнаружите, что их "ручная" загрузка может сломать вашу тему и/или плагины.

Я даже не знал, что это существует. Я определенно перенесу свой код на этот метод в ближайшее время. Моя текущая проблема - попытка понять, почему <?php get_template_directory_uri() ?>
возвращает пустое значение.

К сожалению, я не знаком с использованием var_dump
в WordPress. Не мог бы ты пояснить?

Это не WordPress: var_dump(get_template_directory_uri());

Извините, я хотел сказать, что не знаю, как использовать var_dump
и прочитать вывод в WordPress. Предполагаю, что просто вызов этого в header.php не даст мне нужного результата. Но все равно спасибо за помощь.

Немного запоздалый комментарий, но я тоже столкнулся с этой проблемой. В моём случае я заменил все файлы темы на пустой шаблон стартовой темы и не выполнил шаги установки темы, из-за чего система не могла найти правильную директорию. Повторная активация темы может быть подходящим первым шагом для решения этой проблемы.

Я сталкивался с такой же проблемой - в моем случае get_template_directory_uri()
возвращал URI дочерней темы, а не родительской, что, конечно, прямо противоположно тому, что должно происходить. Переключение на родительскую тему и затем обратно на дочернюю полностью решило проблему для меня.

Вы пробовали использовать простую версию bloginfo, например:
<link rel="stylesheet" type="text/css" media="all" href="<?php bloginfo('template_url'); ?>/css/style.css" />
Или можно использовать ваш вариант (get_bloginfo), но я думаю
вам следует сначала присвоить значение переменной, а затем вывести её..
<link rel="stylesheet" type="text/css" media="all" href="<?php $turl = get_bloginfo('template_url'); echo $turl; ?>/css/style.css" />
...
Надеюсь, это поможет решить вашу проблему...
С наилучшими пожеланиями, Sagive.

Привет, Sagive,
Спасибо за ответ.
К сожалению, ни одно из твоих предложений не сработало. URL по-прежнему создаются относительно "mysite.com" вместо "mystie.com/wp-content/themes/myTheme/"
Продолжу экспериментировать, может быть, найду решение.

На самом деле, get_bloginfo( 'template_url' )
просто вызывает get_template_directory_uri()
, так что более простой способ - использовать get_template_directory_ur()
напрямую.

@ChipBennett Согласен. Просто по какой-то причине на этой установке мой сайт неправильно вызывает get_template_directory_uri()
. Я надеялся, что кто-то сталкивался с подобным.

я не вижу разницы :) - bloginfo есть в моём списке сниппетов, так что... я предпочитаю его... скажи @aboutaaron Ты хочешь сказать, что оно до сих пор не работает?

@SagiveSEO Верно. <?php bloginfo('template_url'); ?>
ничего не выводит! Я никогда с таким не сталкивался. На dev-версии всё работало нормально, но после переноса темы URL сломались и теперь это не работает.

@SagiveSEO в этом и суть: если echo get_template_directory_uri()
не работает, то невозможно, чтобы bloginfo( 'template_url' )
работал как альтернатива. (Смотрите ссылку на ядро, которую я прикрепил.)

@aboutaaron у тебя получилось заставить это работать? У меня такая же проблема. get_stylesheet_directory_uri() и get_template_directory_uri() возвращают пустую строку.

если возвращается пустая строка, значит страница, где ты используешь эту команду, не находится внутри WordPress... Это внутренняя команда WP и должна работать без проблем: get_template_directory_uri() ИЛИ get_bloginfo('template_url') - в каком файле ты её используешь?

Деактивируйте текущую тему (т.е. активируйте другую тему, например TwentyFourteen), а затем снова активируйте вашу тему.
При активации темы WordPress выполняет первоначальную настройку относительных URI и другие действия. В некоторых случаях (особенно при разработке новых тем) WordPress может не выполнить этот код инициализации. Деактивация и повторная активация темы дает WordPress еще одну возможность выполнить код начальной настройки темы.
