Comment inclure les fichiers PHP dans les plugins correctement

59

Mon problème est quand j'inclus dans le fichier de plugin principal un fichier PHP ressemblant à ceci:

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');

et sur ce fichier, j'ai un appel à une fonction WordPress comme:

add_action('hook', 'callback');

et je reçois:

Erreur fatale: appel de la fonction non définie add_action ()

Maintenant, avant de dire "utiliser if(**function_exists**('add_action')){" si je l'utilise, cela ne fonctionne tout simplement pas.

Questions:

  • Quelle serait la bonne façon de faire cela?
  • Quelles sont les différences entre include, include_once, requireet quand dois - je utiliser sorcière?
Bainternet
la source
vous faites quelque chose de mal si vous recevez ce message. Assurez-vous d'inclure tous les fichiers avant de commencer à exécuter des fonctions à partir de ces fichiers
onetrickpony le
thats no it, les appels sont dans les fichiers que je suis inclus!
Bainternet le
lol, maintenant je vois WP_PLUGIN_URLdans votre code ci-dessus :)
onetrickpony le
3
En termes très simples, vous ne pouvez inclure que des fichiers via un chemin de fichier et non un URI.
rédacteur en chef
1
Cet article du Codex (probablement écrit après que vous ayez posé votre question) est très utile: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

Réponses:

88

Nous arrivons tard à cette soirée, mais voici la méthode "WordPress": utilisez plugin_dir_path( __FILE__ ), par exemple:

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

Notez que la fonction ne retourne la barre oblique de fin pour le filepath.

Chip Bennett
la source
3
Notez qu'en l'utilisant __FILE__, la sortie sera relative par rapport au fichier actuel depuis lequel vous l'appelez. Ainsi, si votre includeinstruction est exécutée à partir d'un sous-répertoire de la structure de fichier du plug-in, vous obtiendrez également le sous-répertoire.
squarecandy
L'alternative - si vous BESOIN de chemins relatifs, estrequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay
10

J'ai parcouru quelques plugins que j'avais précédemment créés pour voir les différentes manières dont j'ai inclus des fichiers supplémentaires à l'intérieur des plugins et j'ai remarqué qu'il y avait deux méthodes que vous pouvez utiliser, il y en a probablement d'autres.

Définir votre répertoire de plugin

À l’intérieur de votre plugin, définissez la localisation suivante du plugin.

Exemple de code:

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

Juste une ligne droite inclure ou exiger

Vous pouvez simplement utiliser; include, include_once, require ou require_once à l'intérieur de votre dossier plugin en référençant l'emplacement comme dans l'exemple de code ci-dessous. L'exemple ci-dessous sera basé sur un fichier de votre répertoire de plug-in racine comprenant un autre fichier situé dans un dossier du dossier de votre plug-in.

Exemple de code:

include "classes/plugin-core.php";
Dwayne Charrington
la source
le parent inclut peut apporter toutes sortes de problèmes inattendus et méchants.
Mark Kaplun
5

Je finis par renoncer aux constructions WordPress pour includes et utiliser les éléments suivants:

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

Je ne pense pas que cela résoudra réellement votre problème, ce qui semble être un problème de portée, mais c'est le code que j'utilise.

En ce qui concerne la différence entre include et require:
include émettra un avertissement si le fichier n'est pas trouvé.
Require émettra une erreur fatale si le fichier n'est pas trouvé.

include_once et require_once n'incluront plus / exigent le fichier / code s'il a déjà été inclus / requis (notez que pour autant que je sache, il ne s'agit que d'un fichier spécifique dans un répertoire spécifique).

Mtekk
la source
5

Tout d'abord, merci à tous ceux qui ont répondu,

Mon problème était d'appeler les fichiers inclus avec l'URL complète de cette façon, ils ne passent pas par WordPress. et cela s’est passé parce que, comme je l’ai dit sur la question, je les appelais depuis le fichier de plugin principal. donc le correctif a fini par utiliser:

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

J'ai lu sur le support WordPress . et encore merci d'avoir répondu!

Bainternet
la source
Pouvez-vous reconsidérer pour marquer cette réponse ( wordpress.stackexchange.com/a/32002/123092 ) comme acceptée?
Je suis la personne la plus stupide le
4

Comprendre

L'instruction include () inclut et évalue le fichier spécifié.

Inclure une fois

L'instruction include_once () inclut et évalue le fichier spécifié lors de l'exécution du script. Ce comportement est similaire à celui de l'instruction include (), à la différence que si le code d'un fichier a déjà été inclus, il ne sera plus inclus. Comme son nom l'indique, il ne sera inclus qu'une fois.

Exiger

require () et include () sont identiques à tous égards sauf la façon dont ils gèrent les échecs. Ils produisent tous deux un avertissement, mais require () entraîne une erreur fatale. En d'autres termes, n'hésitez pas à utiliser require () si vous souhaitez qu'un fichier manquant arrête le traitement de la page.

Demandez une fois

L'instruction require_once () inclut et évalue le fichier spécifié lors de l'exécution du script. Ce comportement est similaire à celui de l'instruction require (), à la différence que si le code d'un fichier a déjà été inclus, il ne sera plus inclus.

Les informations ci-dessus proviennent de la documentation PHP. Le problème est qu'il n'y en a pas une correcte, cela dépendra de la nécessité du code. include_once ou include parce que je peux gérer l'avertissement et dire à l'utilisateur / visiteur qui se produit une erreur au lieu d'un message fatal_error

Webord
la source
Comme @mtekk le dit, je vous recommanderais d'utiliser cette structure: require_once (dirname ( FILE ). '/Filename.php);
Webord
1

Bonjour @ יית אתרים:

Lorsque WordPress est en cours de chargement, il définit la add_action()fonction avant de tenter de charger des plug-ins. Le fait que vous obtenez une erreur indique que vous faites quelque chose d'étrange ou que quelque chose ne va pas avec votre installation WordPress.

Qui chargez- vous votre "plugin" ? Utilisez-vous un include*()ou require*()pour le charger, peut-être dans votre wp-config.phpfichier?

Mike Schinkel
la source
1
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

ou

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

ou

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

Remarque: pour interroger les fichiers .css & .js admin_enqueue_scriptsdans l’utilisation du pluginplugin_dir_url( __FILE__ )

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

Chaque fois que vous créez un nouveau fichier dans votre répertoire de travail, vous devez l’inclure à chaque fois. Mais essayez une méthode pour analyser votre répertoire et l’attacher automatiquement, pas seulement les fichiers php, ce qui permet d’inclure correctement les fiules php, js et css des deux côtés (backend, front end).

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

varadha
la source
1
Veuillez ajouter les informations pertinentes à partir du lien fourni avec votre réponse. Utilisez le lien à des fins de crédit. Veuillez éditer votre question
Pieter Goosen