Wie man PHP-Dateien korrekt in Plugins einbindet

59

Mein Problem ist, wenn ich in der Haupt-Plugin-Datei eine PHP-Datei in etwa wie folgt einbinde:

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

und auf dieser Datei habe ich einen Aufruf an eine WordPress-Funktion wie:

add_action('hook', 'callback');

und ich bekomme:

Schwerwiegender Fehler: Aufruf der undefinierten Funktion add_action ()

Nun, bevor Sie "Verwenden if(**function_exists**('add_action')){" sagen, wenn ich das benutze, dann funktioniert es einfach nicht.

Die Fragen:

  • Was wäre der richtige Weg, um das zu tun?
  • Was sind die Unterschiede zwischen include, include_once, requireund wenn ich Hexe verwenden tun?
Bainternet
quelle
Sie tun etwas falsch, wenn Sie diese Nachricht erhalten.
Stellen
das ist es nicht, die Anrufe sind innerhalb der Akten, die ich einschließe!
Bainternet
lol, jetzt sehe ich WP_PLUGIN_URLin Ihrem Code oben :)
onetrickpony
3
Einfach ausgedrückt können Sie () Dateien nur über einen Dateipfad und nicht über einen URI einschließen.
Herausgeber
1
Dieser Codex-Artikel (wahrscheinlich geschrieben, nachdem Sie Ihre Frage gestellt haben) ist sehr hilfreich: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

Antworten:

88

Komme spät zu dieser Party, aber hier ist der "WordPress" Weg: benutze plugin_dir_path( __FILE__ )zB:

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

Beachten Sie, dass die Funktion nicht den Rückschrägstrich für den Dateipfad.

Chip Bennett
quelle
3
Beachten Sie, dass durch die Verwendung __FILE__eine Ausgabe relativ zu der aktuellen Datei includeerfolgt, von der aus Sie sie aufrufen. Wenn Ihre Anweisung also aus einem Unterverzeichnis in Ihrer Plugin-Dateistruktur stammt, wird auch das Unterverzeichnis zurückgegeben.
SquareCandy
Die Alternative - wenn Sie NEED relative Pfade, istrequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay
10

Ich habe ein paar Plugins durchgesehen, die ich zuvor erstellt habe, um festzustellen, auf welche Weise ich zusätzliche Dateien in Plugins eingefügt habe, und habe festgestellt, dass es zwei Methoden gibt, die Sie verwenden können. Es gibt wahrscheinlich mehr.

Definiere dein Plugin-Verzeichnis

In Ihrem Plugin haben Sie die folgende Definition, um die aktuelle Position des Plugins zu definieren.

Beispielcode:

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

Nur ein direktes Einschließen oder Anfordern

Sie können einfach verwenden; include, include_once, require oder require_once in Ihrem Plugin-Ordner, indem Sie auf den Speicherort verweisen, wie im folgenden Beispielcode. Das folgende Beispiel basiert auf einer Datei in Ihrem Root-Plugin-Verzeichnis, einschließlich einer weiteren Datei aus einem Ordner in Ihrem Plugin-Ordner.

Beispielcode:

include "classes/plugin-core.php";
Dwayne Charrington
quelle
relative Includes können alle möglichen bösen unerwarteten Probleme mit sich bringen.
Mark Kaplun
5

Am Ende verzichte ich auf die WordPress-Konstrukte für Includes und verwende Folgendes:

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

Ich denke nicht, dass es Ihr Problem tatsächlich lösen wird, was anscheinend ein Scope-Problem ist, aber es ist der Code, den ich verwende.

Was den Unterschied zwischen include und require betrifft:
include gibt eine Warnung aus, wenn die Datei nicht gefunden
wird. Require gibt einen schwerwiegenden Fehler aus, wenn die Datei nicht gefunden wird

include_once und require_once werden die Datei / den Code nicht erneut einschließen / erfordern, wenn sie bereits enthalten / erforderlich sind (beachten Sie, dass dies meines Erachtens nur für eine bestimmte Datei in einem bestimmten Verzeichnis gilt).

mtekk
quelle
5

Zunächst einmal vielen Dank an alle, die geantwortet haben:

Mein Problem bestand darin, die enthaltenen Dateien mit vollständiger URL so aufzurufen, dass sie nicht über WordPress laufen. und das geschah, weil ich sie, wie auf der Frage angegeben, aus der Haupt-Plugin-Datei anrief. So endete der Fix mit:

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

Ich habe etwas über den WordPress-Support gelesen . und nochmals danke für die antwort!

Bainternet
quelle
Können Sie es sich bitte noch einmal überlegen, diese Antwort ( wordpress.stackexchange.com/a/32002/123092 ) als angenommen zu markieren ?
Ich bin die dümmste Person
4

Umfassen

Die include () -Anweisung schließt die angegebene Datei ein und wertet sie aus.

Einmal einschließen

Die include_once () -Anweisung schließt die angegebene Datei während der Ausführung des Skripts ein und wertet sie aus. Dies ist ein ähnliches Verhalten wie die include () - Anweisung. Der einzige Unterschied besteht darin, dass der Code aus einer Datei, der bereits enthalten ist, nicht erneut enthalten ist. Wie der Name schon sagt, wird es nur einmal enthalten sein.

Benötigen

require () und include () sind in jeder Hinsicht identisch, außer wie sie mit Fehlern umgehen. Beide erzeugen eine Warnung, erfordern aber, dass () zu einem schwerwiegenden Fehler führt. Mit anderen Worten, zögern Sie nicht, require () zu verwenden, wenn Sie möchten, dass eine fehlende Datei die Verarbeitung der Seite anhält.

Einmalig benötigt

Die require_once () -Anweisung schließt die angegebene Datei während der Ausführung des Skripts ein und wertet sie aus. Dies ist ein ähnliches Verhalten wie die require () - Anweisung. Der einzige Unterschied besteht darin, dass der Code aus einer Datei, der bereits enthalten ist, nicht erneut enthalten ist.

Die obigen Informationen stammen aus der PHP-Dokumentation, die Sache ist, dass es keine richtige gibt. Sie hängen von der Notwendigkeit des Codes ab. Ich benötige () wichtige Dinge wie Funktionen, aber Themendateien wie die Fußzeile oder die von mir verwendete Schleife include_once oder include, weil ich mit der Warnung umgehen kann und dem Benutzer / Besucher sage, dass ein Fehler statt nur eines fatal_error aufgetreten ist

Webord
quelle
Wie das @mtekk sagt, würde ich Ihnen empfehlen, diese Struktur zu verwenden: require_once (dirname ( FILE ). '/Filename.php);
Webord
1

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

Beim Laden von WordPress wird die add_action()Funktion definiert , bevor versucht wird, Plugins zu laden. Die Tatsache, dass der Fehler angezeigt wird, zeigt an, dass Sie etwas Seltsames tun oder dass etwas mit Ihrer WordPress-Installation nicht stimmt.

Wen bekommen Sie Ihr "Plugin" zu laden? Verwenden Sie ein include*()oder require*(), um es zu laden, möglicherweise in Ihrer wp-config.phpDatei?

MikeSchinkel
quelle
1
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

oder

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

oder

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

Hinweis: Zum Einreihen von CSS- und JS-Dateien admin_enqueue_scriptsin das 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
quelle
0

Wann immer Sie eine neue Datei in Ihrem Arbeitsverzeichnis erstellen, müssen Sie diese jedes Mal einfügen. Aber versuchen Sie eine Methode, um Ihr Directroy zu scannen und es automatisch anzuhängen, nicht nur die PHP-Dateien. Dies hilft, PHP-, Js- und CSS-Dateien auf beiden Seiten (Back-End, Front-End) korrekt einzubeziehen.

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

Varadha
quelle
1
Bitte fügen Sie Ihrer Antwort relevante Informationen über den angegebenen Link hinzu. Verwenden Sie den Link für Kreditzwecke. Bitte bearbeiten Sie Ihre Frage
Pieter Goosen