Как получить URL темы в PHP?
Мне нужно получить URL директории моей темы, чтобы сослаться на изображение в директории image/headers темы. Как это сделать в PHP?

Эта функция будет возвращать URL директории темы, чтобы вы могли использовать его в других функциях:
get_bloginfo('template_directory');
Альтернативно, эта функция будет выводить URL директории темы в браузер:
bloginfo('template_directory');
Пример для изображения в папке темы images/headers
будет выглядеть так:
<img src="<?php bloginfo('template_directory'); ?>/images/headers/image.jpg" alt="Описание изображения" title="Заголовок изображения" />

Как сказал @EAMann, но с оговоркой. Эрик прав насчёт общего подхода и работы функций bloginfo()
и get_bloginfo()
, а также передачи параметра 'template_directory'
для получения нужного значения (в большинстве) тем.
Однако есть оговорка, и эта оговорка касается новых Дочерних Тем. Если вы используете дочернюю тему, то 'template_directory'
, вероятно, не то, что вам нужно, если только вы не хотите обратиться к изображению в директории родительской темы. Вместо этого для дочерних тем скорее всего нужен параметр stylesheet_directory
(да, я знаю, названия не очень информативны, но так уж сложилось!). Заимствуя пример Эрика, использование stylesheet_directory
выглядит так (я сократил пример, чтобы он не переносился):
<img src="<?php bloginfo('stylesheet_directory'); ?>/images/header.jpg" />
Чтобы проиллюстрировать разницу, я написал небольшой автономный файл, который можно поместить в корень сайта как test.php
и запустить для просмотра вывода. Сначала запустите с обычной темой, например TwentyTen, затем с дочерней темой:
<?php
/*
* test.php - Проверка различий между Обычной и Дочерней Темой
*
*/
include "wp-load.php";
$bloginfo_params = array(
'admin_email',
'atom_url',
'charset',
'comments_atom_url',
'comments_rss2_url',
'description',
'home',
'html_type',
'language',
'name',
'pingback_url',
'rdf_url',
'rss2_url',
'rss_url',
'siteurl',
'stylesheet_directory',
'stylesheet_url',
'template_directory',
'template_url',
'text_direction',
'url',
'version',
'wpurl',
);
echo '<table border="1">';
foreach($bloginfo_params as $param) {
$info = get_bloginfo($param);
echo "<tr><th>{$param}:</th><td>{$info}</td></tr>";
}
echo '</table>';
Если присмотреться, можно заметить, что bloginfo()
и get_bloginfo()
принимают гораздо больше параметров; изучите код и скриншот ниже для идей.
На скриншоте видно, что stylesheet_directory
возвращает то же, что и 'template_directory'
для обычной темы, но другое значение для дочерней темы, которое скорее всего и нужно.
(источник: mikeschinkel.com)
Для ясности: на этом скриншоте
wp30.dev
— это домен, работающий только на моём локальном компьютере. В данный момент это экземпляр WordPress 3.0.1, настроенный на127.0.0.1
(то же, что иlocalhost
) на моём ноутбуке, и я использую его для тестирования таких примеров. Я использовал VirtualHostX для удобства на Mac OS X, чтобы настроить эти частные не маршрутизируемые домены.dev
, но любой может сделать это вручную, отредактировав файл hosts и файл httpd.conf.
Кстати, если вы не знакомы с Дочерними Темами, вот ещё два ответа на WordPress Answers, которые могут помочь:

Вау, отличный ответ. Я был ленив с темой, над которой сейчас работаю, и не настроил дочернюю тему, но это будет очень полезно в будущем. Поздравляю и с этим скриптом. Хорошо написан. Спасибо!

Вся структура темы построена на двух опциях - template
(хранит название родительской темы) и stylesheet
(хранит название дочерней темы). Если дочерняя тема не используется, эти значения будут одинаковыми.
Для обеспечения гибкости фильтров, вместо прямого доступа к опциям, используются соответствующие функции get_template()
и get_stylesheet()
.
Единственное, чего не хватает - это объединить эти функции с расположением папки тем. Это можно сделать с помощью get_theme_root_uri()
, что удобно обернуто в функции get_template_directory_uri()
и get_stylesheet_directory_uri()
.
Функция [get_]bloginfo()
с аргументами template_directory
или stylesheet_directory
просто оборачивает эти функции, и нет особых причин использовать её таким образом. Можно сказать, что это только вносит путаницу, поскольку аргумент говорит о директории (что обычно относится к локальным путям), но возвращает URL-адреса.
Итог:
- используйте
get_template_directory_uri()
для ссылки на родительскую или единственную тему - используйте
get_stylesheet_directory_uri()
для ссылки на дочернюю или единственную тему
