Cómo incluir archivos PHP en plugins de la manera correcta

21 ene 2011, 03:48:41
Vistas: 185K
Votos: 81

Mi problema es cuando en el archivo principal del plugin incluyo un archivo PHP de esta manera:

include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// o
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// o
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// o
require_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');

y en ese archivo tengo una llamada a una función de WordPress como:

add_action('hook', 'callback');

y obtengo:

Fatal Error: Call to undefined function add_action()

Ahora antes de que digas "usa if(**function_exists**('add_action')){" si uso eso simplemente no funciona.

Las preguntas:

  • ¿Cuál sería la forma correcta de hacer eso?
  • ¿Cuáles son las diferencias entre include, include_once, require y cuándo uso cada uno?
6
Comentarios

estás haciendo algo mal si recibes ese mensaje. Asegúrate de incluir cualquier archivo antes de comenzar a ejecutar funciones desde estos archivos

onetrickpony onetrickpony
21 ene 2011 04:55:31

eso no es, ¡las llamadas están dentro de los archivos que estoy incluyendo!

Bainternet Bainternet
21 ene 2011 05:06:44

jaja, ahora veo WP_PLUGIN_URL en tu código arriba :)

onetrickpony onetrickpony
21 ene 2011 06:04:54

En términos muy simples, solo puedes incluir archivos mediante una ruta de archivo y no a través de un URI.

editor editor
21 ene 2011 07:25:25

Este artículo del Codex (probablemente escrito después de que hicieras tu pregunta) es bastante útil: http://codex.wordpress.org/Determining_Plugin_and_Content_Directories

henrywright henrywright
12 mar 2014 12:52:12

¿Estás haciendo esto en un archivo PHP que se usa como punto final de AJAX o como manejador de formularios? Nunca deberías hacer llamadas directas a archivos PHP dentro de temas o plugins de WordPress. Además, incluir URLs no funciona, si lo hiciera tendrías un enorme problema de seguridad y un rendimiento terrible

Tom J Nowell Tom J Nowell
13 may 2016 19:58:46
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 9
2
109

Llegando tarde a esta fiesta, pero aquí está la forma "WordPress": usa plugin_dir_path( __FILE__ ), por ejemplo:

<?php
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
?>

Ten en cuenta que la función devuelve la barra diagonal final para la ruta del archivo.

25 oct 2011 01:19:04
Comentarios

Ten en cuenta que al usar __FILE__ devolverá la ruta relativa al archivo actual desde donde lo llamas, así que si tu declaración include se hace desde un subdirectorio dentro de la estructura de archivos de tu plugin, obtendrás también ese subdirectorio.

squarecandy squarecandy
30 ene 2018 22:30:40

La alternativa - si NECESITAS rutas relativas, es require_once(plugin_dir_path(__DIR__).'/myfile.inc');

paulsm4 paulsm4
4 oct 2019 23:28:09
1
10

Revisé un par de plugins que creé anteriormente para ver las diferentes formas en las que he incluido archivos adicionales dentro de los plugins y noté que hay dos métodos que puedes usar, probablemente hay más.

Define tu directorio de plugin

Dentro de tu plugin, usa la siguiente definición para establecer la ubicación actual del plugin.

Código de ejemplo:

define( 'PLUGIN_DIR', dirname(__FILE__).'/' );  

Incluir o requerir directamente

Puedes simplemente usar: include, include_once, require o require_once dentro de la carpeta de tu plugin haciendo referencia a la ubicación como en el ejemplo de código a continuación. El ejemplo siguiente se basa en un archivo en el directorio raíz del plugin que incluye otro archivo de una carpeta dentro de tu directorio de plugin.

Código de ejemplo:

include "classes/plugin-core.php";  
21 ene 2011 12:40:55
Comentarios

las inclusiones relativas pueden traer todo tipo de problemas inesperados y desagradables.

Mark Kaplun Mark Kaplun
1 dic 2017 09:47:29
0

Termino evitando las construcciones de WordPress para los includes y uso lo siguiente:

require_once(dirname(__FILE__) . '/filename.php');

No creo que realmente resuelva tu problema, que parece ser un tema de ámbito, pero es el código que yo uso.

En cuanto a la diferencia entre include y require:
include mostrará una advertencia si el archivo no se encuentra
require mostrará un error fatal si el archivo no se encuentra

include_once y require_once no incluirán/requerirán el archivo/código nuevamente si ya ha sido incluido/requerido (ten en cuenta que, hasta donde sé, esto solo aplica para un archivo específico en un directorio específico).

21 ene 2011 05:29:35
1

Incluir

La sentencia include() incluye y evalúa el archivo especificado.

Incluir Una Vez

La sentencia include_once() incluye y evalúa el archivo especificado durante la ejecución del script. Este comportamiento es similar al de la sentencia include(), con la única diferencia de que si el código de un archivo ya ha sido incluido, no se volverá a incluir. Como su nombre lo indica, se incluirá solo una vez.

Requerir

require() e include() son idénticos en todo excepto en cómo manejan los fallos. Ambos producen una Advertencia (Warning), pero require() resulta en un Error Fatal. En otras palabras, no dudes en usar require() si quieres que un archivo faltante detenga el procesamiento de la página.

Requerir Una Vez

La sentencia require_once() incluye y evalúa el archivo especificado durante la ejecución del script. Este comportamiento es similar al de la sentencia require(), con la única diferencia de que si el código de un archivo ya ha sido incluido, no se volverá a incluir.

La información anterior proviene de la documentación de PHP, el asunto es que no hay una opción correcta, dependerá de la necesidad del código. Yo uso require() para cosas importantes como funciones, pero en archivos del tema como el footer o el loop uso include_once o include porque puedo manejar la advertencia y decirle al usuario/visitante que ocurrió un error en lugar de simplemente mostrar un error_fatal.

21 ene 2011 05:34:04
Comentarios

Como dice @mtekk, te recomendaría usar esta estructura:

require_once(dirname(FILE) . '/filename.php);

Webord Webord
21 ene 2011 05:35:48
1

Primero, gracias a todos los que respondieron,

Mi problema era llamar a los archivos incluidos con la URL completa, de esa manera no pasaban por WordPress. Y eso sucedió porque, como mencioné en la pregunta, los estaba llamando desde el archivo principal del plugin. Así que la solución terminó siendo usar:

include_once('/ipn/paypal-ipn.php');

Leí sobre esto en el soporte de WordPress. ¡Y nuevamente gracias por responder!

21 ene 2011 06:00:37
Comentarios

¿Podrías reconsiderar marcar esta respuesta (https://wordpress.stackexchange.com/a/32002/123092) como la aceptada?

I am the Most Stupid Person I am the Most Stupid Person
18 sept 2017 13:28:05
0
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

o

define( 'PLUGIN_ROOT_DIR', plugin_dir_path( __FILE__ ) );
include( PLUGIN_ROOT_DIR . 'ipn/paypal-ipn.php');

o

$plugin_dir_path = plugin_dir_path( __FILE__ );
include( $plugin_dir_path . 'ipn/paypal-ipn.php');

Nota: para cargar archivos .css & .js con admin_enqueue_scripts dentro del plugin, usa plugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');
13 may 2016 19:35:20
0

Hola @בניית אתרים:

Cuando WordPress se está cargando, define la función add_action() antes de intentar cargar cualquier plugin. El hecho de que estés recibiendo ese error me indica que estás haciendo algo inusual o que hay algún problema con tu instalación de WordPress.

¿Cómo estás haciendo que tu "plugin" se cargue? ¿Estás usando include*() o require*() para cargarlo, quizás en tu archivo wp-config.php?

21 ene 2011 05:46:32
1

Cada vez que creas un nuevo archivo dentro de tu directorio de trabajo, tienes que incluirlo manualmente cada vez. Pero prueba un método para escanear tu directorio y adjuntarlo automáticamente, no solo los archivos PHP, lo cual ayuda a incluir archivos PHP, JS y CSS correctamente en ambos lados (backend y frontend).

http://kvcodes.com/2014/05/wordpress-theme-development-include-files-automatically/

29 may 2014 07:56:52
Comentarios

Por favor, agrega información relevante del enlace proporcionado a tu respuesta. Usa el enlace para fines de crédito. Por favor [edita] tu pregunta

Pieter Goosen Pieter Goosen
29 may 2014 08:48:10
0

También puede funcionar:

include WP_PLUGIN_DIR . '/plugin-name/ipn/paypal-ipn.php';

25 mar 2022 18:29:41