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

59

Mi problema es cuando en el archivo de complemento principal incluyo un archivo PHP algo como esto:

include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
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:

Error grave: llamada a la función indefinida add_action ()

Ahora, antes de decir "usar if(**function_exists**('add_action')){" si lo uso, simplemente no funciona.

Las preguntas:

  • ¿Cuál sería la forma correcta de hacer eso?
  • ¿Cuáles son las diferencias entre include, include_once, requirey cuando hacer yo utilizo bruja?
Bainternet
fuente
estás haciendo algo mal si recibes ese mensaje. Asegúrese de incluir cualquier archivo antes de comenzar a ejecutar funciones desde estos archivos
onetrickpony
eso no es así, ¡las llamadas están dentro de los archivos que estoy incluyendo!
Bainternet
jaja, ahora veo WP_PLUGIN_URLen su código de arriba :)
onetrickpony
3
En pocas palabras, solo puede incluir archivos () a través de una ruta de archivo y no un URI.
editor
1
Este artículo del Codex (probablemente escrito después de hacer su pregunta) es bastante útil: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

Respuestas:

88

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

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

Tenga en cuenta que la función no devuelve la barra final de la ruta de archivo.

Chip Bennett
fuente
3
Tenga en cuenta que al usarlo __FILE__se generará un resultado relativo al archivo actual desde el que lo llama, por lo que si su includedeclaración se realiza desde un subdirectorio dentro de la estructura de su archivo de complemento, también obtendrá el subdirectorio.
squarecandy
La alternativa, si NECESITA caminos relativos, esrequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay
10

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

Defina su directorio de complementos

Dentro de su complemento tiene la siguiente definición para definir la ubicación actual del complemento.

Código de ejemplo:

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

Solo un directo incluye o requiere

Simplemente puedes usar; include, include_once, require o require_once dentro de su carpeta de complementos haciendo referencia a la ubicación como en el código de ejemplo a continuación. El siguiente ejemplo se basará en un archivo en su directorio raíz de complementos que incluye otro archivo dentro de una carpeta dentro de su carpeta de complementos.

Código de ejemplo:

include "classes/plugin-core.php";
Dwayne Charrington
fuente
relativo incluye puede traer todo tipo de desagradables problemas inesperados.
Mark Kaplun
5

Termino renunciando a las construcciones de WordPress para incluye y uso lo siguiente:

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

No creo que realmente resuelva su problema, que parece ser un problema de alcance, pero es el código que uso.

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

include_once y require_once no incluirán / requerirán el archivo / código nuevamente si ya ha sido incluido / requerido (tenga en cuenta que, por lo que puedo decir, esto es solo para un archivo específico en un directorio específico).

mtekk
fuente
5

Primero, gracias a todos los que respondieron:

Mi problema fue llamar a los archivos incluidos con la URL completa para que no pasen por WordPress. y eso sucedió porque, como dije en la pregunta, los estaba llamando desde el archivo de complemento principal. entonces la solución terminó usando:

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

Lo leí en el soporte de WordPress . y de nuevo gracias por responder!

Bainternet
fuente
¿Puede reconsiderar marcar esta respuesta ( wordpress.stackexchange.com/a/32002/123092 ) como aceptada?
Soy la persona más estúpida
4

Incluir

La instrucción include () incluye y evalúa el archivo especificado.

Incluir una vez

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

Exigir

require () e include () son idénticos en todos los sentidos, excepto cómo manejan las fallas. Ambos producen una Advertencia, pero requieren () resulta en un Error Fatal. En otras palabras, no dude en utilizar require () si desea que falte un archivo para detener el procesamiento de la página.

Requerir una vez

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

La información anterior es de la documentación de PHP, la cuestión es que no hay una correcta, dependerá de la necesidad del código, sí necesito () en cosas importantes como funciones, pero en archivos de temas como el pie de página o el bucle que uso include_once o include porque puedo manejar la advertencia y decirle al usuario / visitante que ocurrió un error en lugar de solo un error_ fatal

Webord
fuente
Como dice @mtekk, le recomendaría que use esta estructura: require_once (dirname ( FILE ). '/Filename.php);
Webord
1

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

Cuando se está cargando WordPress, define la add_action()función antes de que intente cargar cualquier complemento. El hecho de que reciba el error me dice que está haciendo algo extraño o que algo está mal con su instalación de WordPress.

¿A quién vas a cargar tu "plugin" ? ¿Está utilizando include*()o require*()para cargarlo, tal vez en su wp-config.phparchivo?

MikeSchinkel
fuente
1
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 colocar archivos .css y .js admin_enqueue_scriptsdentro del uso del complementoplugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');
Aamer Shahzad
fuente
0

Cada vez que crea un nuevo archivo dentro de su directorio de trabajo, debe incluirlo cada vez. Pero intente un método para escanear su directroy y adjuntarlo automáticamente, no solo los archivos php, que ayuda a incluir php, js y css correctamente en ambos lados (backend, front-end).

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

varadha
fuente
1
Agregue información relevante del enlace proporcionado a su respuesta. Utilice el enlace para fines de crédito. Por favor edite su pregunta
Pieter Goosen