La forma correcta de incluir/requerir archivos PHP en WordPress

27 oct 2015, 13:44:35
Vistas: 96.1K
Votos: 14

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?

1
Todas las respuestas a la pregunta 3
4
25

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';
27 oct 2015 19:39:26
Comentarios

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.

Rarst Rarst
27 oct 2015 19:46:51

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!

thomascharbit thomascharbit
27 oct 2015 19:58:09

podrías intentar - /subdir/filename.php?

Jon Jon
15 abr 2019 11:53:48

@Jon gracias, misma observación. Envié una edición a la respuesta.

kontur kontur
16 feb 2023 14:44:47
2
19

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/

14 may 2019 12:09:51
Comentarios

¡Exactamente lo que estaba buscando! Esta debería ser la respuesta correcta ahora.

Oneezy Oneezy
23 ago 2019 16:04:02

Exactamente, WP actualizó el helper para hacerlo, esta es la buena respuesta.

Maxime Culea Maxime Culea
16 sept 2020 19:24:55
0

En los siguientes ejemplos, asumo que estás usando composer y que un tema hijo podría estar activado o no.

  1. 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';
  1. 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';
  1. 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.

23 dic 2022 22:49:51