Cómo obtener la URL del tema en PHP
Necesito obtener la URL de mi directorio de tema para hacer referencia a una imagen en el directorio image/headers del tema. ¿Cómo se hace esto en PHP?

Esta función devolverá la URL del directorio del tema para que puedas usarla en otras funciones:
get_bloginfo('template_directory');
Alternativamente, esta función mostrará la URL del directorio del tema en el navegador:
bloginfo('template_directory');
Así que un ejemplo para una imagen en la carpeta images/headers
del tema sería:
<img src="<?php bloginfo('template_directory'); ?>/images/headers/image.jpg" alt="Imagen de encabezado" title="Imagen de encabezado del tema" />

Lo que @EAMann mencionó, con una salvedad. Eric tiene razón sobre el enfoque general y cómo funcionan las funciones bloginfo()
y get_bloginfo()
, así como sobre cómo pasar el parámetro 'template_directory'
para obtener el valor que necesitas para (la mayoría de) los temas.
Sin embargo, hay una salvedad y esa salvedad tiene que ver con los Temas Hijos más recientes. Si estás utilizando un tema hijo, entonces 'template_directory'
probablemente no sea lo que buscas, a menos que realmente estés intentando hacer referencia a una imagen que está en el directorio del tema padre. En su lugar, para temas hijos, lo que probablemente necesitas es pasar stylesheet_directory
(lo sé, lo sé, los nombres no te dicen lo que son, pero así es como es). Tomando prestado un poco de la respuesta de Eric, usar stylesheet_directory
se vería así (acorté el ejemplo para que no se extienda):
<img src="<?php bloginfo('stylesheet_directory'); ?>/images/header.jpg" />
Para ilustrar el punto, escribí un archivo independiente rápido que puedes colocar en la raíz de tu sitio web como test.php
y ejecutar para ver lo que muestra. Primero ejecútalo con un tema normal como TwentyTen y luego con un tema hijo:
<?php
/*
* test.php - Prueba la diferencia entre Temas Regulares y Temas Hijos
*
*/
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>';
Si prestas atención, podrías notar que hay mucho más sobre lo que puedes pasar a bloginfo()
y get_bloginfo()
; estudia el código y la captura de pantalla a continuación para obtener ideas.
Al observar la captura de pantalla, puedes ver que stylesheet_directory
devuelve lo mismo que 'template_directory'
para un tema normal, pero un valor diferente, y probablemente el valor que necesitas para un tema hijo.
(fuente: mikeschinkel.com)
Para mayor claridad en esta captura de pantalla,
wp30.dev
es un dominio que solo funciona en mi computadora local. Actualmente es una instancia de WordPress 3.0.1 y está configurada en127.0.0.1
(igual quelocalhost
) en mi laptop y la uso para probar ejemplos ad-hoc como este. Utilicé VirtualHostX por conveniencia en Mac OS X para ayudarme a configurar esos dominios privados no enrutables.dev
, pero cualquiera puede hacerlo manualmente editando el archivo hosts de la computadora y el archivo httpd.conf.
Por cierto, en caso de que no estés familiarizado con los Temas Hijos, aquí hay otras dos respuestas de WordPress Answers que podrían ayudar:

¡Vaya, gran respuesta! Fui perezoso con el tema en el que estoy trabajando ahora y no configuré un tema hijo, pero esto será muy útil en el futuro. Felicitaciones por ese script también. Bien codificado. ¡Gracias!

Toda la estructura del tema se construye sobre dos opciones: template
(que contiene el nombre de la carpeta del tema padre) y stylesheet
(que contiene el nombre de la carpeta del tema hijo). Si no se utiliza un tema hijo, estos valores son iguales.
Para tener flexibilidad con los filtros, en lugar de acceder directamente a la opción, existen respectivamente get_template()
y get_stylesheet()
.
Ahora lo único que falta es combinar estos con la ubicación de la carpeta de temas. Esto se puede hacer con get_theme_root_uri()
y nuevamente convenientemente envuelto en get_template_directory_uri()
y get_stylesheet_directory_uri()
.
[get_]bloginfo()
con los argumentos template_directory
o stylesheet_directory
simplemente envuelve estas funciones y hay poca razón para usarlo de esa manera. Diría que solo genera confusión al tener un argumento que dice "directory" (comúnmente relacionado con rutas locales), pero que devuelve URLs.
Resumen:
- usa
get_template_directory_uri()
para referirte al tema padre o único - usa
get_stylesheet_directory_uri()
para el tema hijo o único
