La forma correcta de incluir/requerir archivos PHP en WordPress
Soy un desarrollador nuevo en WordPress y recientemente he tenido problemas (en varios sitios) con include_once
y require_once
para archivos PHP. Si incluyo (get_theme_directory_uri() . 'subdir/file')
el archivo especificado se incluye (o requiere, lo que lleva a errores fatales) pero si se llaman funciones de WordPress dentro de 'file' obtengo algo similar a:
'Call to undefined function
add_action()
in /full/path/to/file'.
La solución aparente que he encontrado es hacer:
include(dirname(__FILE__) . "/subdir/filename");
¿Es esto correcto o me perdí de 'la forma WordPress' de incluir archivos en algún lado?

Si revisas https://codex.wordpress.org/Function_Reference/get_template_directory_uri
Verás que get_template_directory_uri()
devuelve un URI, no una ruta del servidor.
Deberías usar en su lugar la función get_template_directory()
, que devuelve la ruta al tema, sin barra inclinada al final:
include get_template_directory() . '/subdir/filename.php';
Para un plugin puedes usar la función plugin_dir_path()
:
include plugin_dir_path( __FILE__ ) . '/subdir/filename.php';

Quiero señalar que esto está principalmente destinado a localizar rutas en plugins arbitrarios. Dentro de un plugin específico, las rutas relativas son conocidas y los includes básicos de PHP (sin elementos de WP) son una práctica normal.

Con el comentario de Rarst me di cuenta de que mi respuesta era para plugins, no para temas. Para temas, usa get_template_directory() en lugar de get_template_directory_uri(). ¡Fácil!

WordPress 4.7+ introduce las funciones get_theme_file_path() para incluir archivos en el tema de WordPress.
Incluye así:
include get_theme_file_path( '/subdirectorio/nombre-del-archivo.php' );
La ventaja de usar esta función es que en un tema hijo puedes sobrescribir el archivo del tema padre.
Referencia: https://developer.wordpress.org/reference/functions/get_theme_file_path/

En los siguientes ejemplos, asumo que estás usando composer y que un tema hijo podría estar activado o no.
- Usa este método si deseas incluir un archivo dentro de un tema y quieres asegurarte de que se utilice el directorio del tema padre incluso si hay un tema hijo activado:
require get_template_directory() . '/vendor/autoload.php';
- O usa este método si deseas incluir un archivo dentro de un tema y no te importa si se usa el directorio del tema padre o el del tema hijo (en caso de que esté activado):
require get_stylesheet_directory() . '/vendor/autoload.php';
- Y finalmente, usa este método si deseas incluir un archivo dentro de un plugin:
require __DIR__ . '/vendor/autoload.php';
Ten cuidado con el último método porque la constante mágica __DIR__
tendrá un valor diferente dependiendo del directorio en el que se encuentre tu archivo php.
Ten en cuenta que no hay beneficio en usar la función plugin_dir_path()
, ya que es solo un envoltorio para la función trailingslashit()
.
La documentación dice:
La parte "plugin" del nombre es engañosa - puede usarse para cualquier archivo, y no devolverá el directorio de un plugin a menos que lo llames desde un archivo en el directorio base del plugin.
Consulta https://developer.wordpress.org/reference/functions/plugin_dir_path/ para más detalles.
También ten en cuenta que usar include
es una mala práctica porque un archivo faltante solo generará una advertencia. Siempre usa require
en su lugar, ya que un archivo faltante generará un error fatal y no pasará desapercibido.
