Wenn Sie den Punkt erreichen, an dem der Code in Ihrem functions.php
Design Sie zu überfordern beginnt, würde ich definitiv sagen, dass Sie bereit sind, die Aufteilung in mehrere Dateien in Betracht zu ziehen. Ich neige dazu, das an diesem Punkt fast von Natur aus zu tun.
Verwenden Sie Include Files in der functions.php
Datei Ihres Themas
Ich erstelle ein Unterverzeichnis mit dem Namen "includes" unter meinem Themenverzeichnis und segmentiere meinen Code in Include-Dateien, die nach dem für mich zum jetzigen Zeitpunkt Sinnvollen geordnet sind (was bedeutet, dass ich ständig Code überarbeite und verschiebe, während sich eine Site weiterentwickelt). Ich auch selten Gib irgendeinen echten Code ein functions.php
. Alles geht in die Include-Dateien; Nur meine Präferenz.
Um Ihnen ein Beispiel zu geben, hier ist meine Testinstallation, mit der ich meine Antworten auf Fragen hier auf WordPress Answers teste. Jedes Mal, wenn ich eine Frage beantworte, behalte ich den Code für den Fall, dass ich ihn erneut benötige. Dies ist nicht genau das, was Sie für eine Live-Site tun, aber es zeigt die Mechanismen der Aufteilung des Codes:
<?php
/*
* functions.php
*
*/
require_once( __DIR__ . '/includes/null-meta-compare.php');
require_once( __DIR__ . '/includes/older-examples.php');
require_once( __DIR__ . '/includes/wp-admin-menu-classes.php');
require_once( __DIR__ . '/includes/admin-menu-function-examples.php');
// WA: Adding a Taxonomy Filter to Admin List for a Custom Post Type?
// http://wordpress.stackexchange.com/questions/578/
require_once( __DIR__ . '/includes/cpt-filtering-in-admin.php');
require_once( __DIR__ . '/includes/category-fields.php');
require_once( __DIR__ . '/includes/post-list-shortcode.php');
require_once( __DIR__ . '/includes/car-type-urls.php');
require_once( __DIR__ . '/includes/buffer-all.php');
require_once( __DIR__ . '/includes/get-page-selector.php');
// http://wordpress.stackexchange.com/questions/907/
require_once( __DIR__ . '/includes/top-5-posts-per-category.php');
// http://wordpress.stackexchange.com/questions/951/
require_once( __DIR__ . '/includes/alternate-category-metabox.php');
// http://lists.automattic.com/pipermail/wp-hackers/2010-August/034384.html
require_once( __DIR__ . '/includes/remove-status.php');
// http://wordpress.stackexchange.com/questions/1027/removing-the-your-backup-folder-might-be-visible-to-the-public-message-generate
require_once( __DIR__ . '/includes/301-redirects.php');
Oder Plugins erstellen
Eine weitere Möglichkeit ist es, den Code nach Funktionen zu gruppieren und eigene Plugins zu erstellen. Für mich fange ich an, in der functions.php
Datei des Themas zu codieren, und als der Code fertig ist, habe ich den größten Teil meines Codes in Plugins verschoben.
Jedoch KEINE signifikante Leistungssteigerung durch PHP Code Organization
Andererseits geht es bei der Strukturierung Ihrer PHP-Dateien zu 99% darum, Ordnung und Wartbarkeit zu schaffen, und zu 1% um die Leistung, wenn dies der Fall ist (Organisieren .js
und .css
Aufrufen von Dateien durch den Browser über HTTP ist ein völlig anderer Fall und hat enorme Auswirkungen auf die Leistung.) Ihr PHP-Code auf dem Server spielt unter Performance-Gesichtspunkten keine Rolle.
Und Code-Organisation ist persönliche Präferenz
Und nicht zuletzt ist die Code-Organisation eine persönliche Präferenz. Einige Leute hassen es, wie ich Code organisiere, genauso wie ich es hasse, wie sie es auch tun. Finden Sie etwas, das Ihnen gefällt, und bleiben Sie dabei. Lassen Sie jedoch zu, dass sich Ihre Strategie im Laufe der Zeit weiterentwickelt, wenn Sie mehr lernen und sich damit vertraut machen.
Späte Antwort
So fügen Sie Ihre Dateien richtig ein:
Das gleiche funktioniert auch in Plugins.
Wie man den richtigen Weg oder URi findet
Schauen Sie sich auch die Funktionen der Dateisystem-API an:
home_url()
plugin_dir_url()
plugin_dir_path()
admin_url()
get_template_directory()
get_template_directory_uri()
get_stylesheet_directory()
get_stylesheet_directory_uri()
So reduzieren Sie die Anzahl der
include/require
Wenn Sie alle Dateien aus einem Verzeichnis holen müssen, gehen Sie mit
Beachten Sie, dass dies Fehler ignoriert (möglicherweise gut für die Produktion) / nicht ladbare Dateien.
Um dieses Verhalten zu ändern, möchten Sie möglicherweise während der Entwicklung eine andere Konfiguration verwenden:
Edit: OOP / SPL-Ansatz
Als ich gerade zurückkam und sah, dass diese Antwort immer mehr positive Stimmen erhielt, dachte ich, ich könnte zeigen, wie ich es heutzutage mache - in einer PHP 5.3+ Welt. Im folgenden Beispiel werden alle Dateien aus einem Themenunterordner mit dem Namen geladen
src/
. Hier habe ich meine Bibliotheken, die bestimmte Aufgaben wie Menüs, Bilder usw. erledigen. Sie müssen sich nicht einmal um den Namen kümmern, wenn jede einzelne Datei geladen wird. Wenn Sie andere Unterordner in diesem Verzeichnis haben, werden diese ignoriert.Das
\FilesystemIterator
ist der PHP 5.3+ Supercedor über dem\DirectoryIterator
. Beide sind Teil der PHP SPL. Während PHP 5.2 es ermöglichte, die eingebaute SPL-Erweiterung zu deaktivieren (weniger als 1% aller Installationen haben dies getan), ist die SPL jetzt Teil des PHP-Kerns.Während ich PHP 5.2.x noch unterstützte, verwendete ich die folgende Lösung: A
\FilterIterator
imsrc/Filters
Verzeichnis, um nur Dateien (und keine Punktzeiger von Ordnern) abzurufen, und a\DirectoryIterator
, um die Schleife zu bilden und zu laden.Das
\FilterIterator
war so einfach:Abgesehen davon, dass PHP 5.2 bereits tot / EOL ist (und auch 5.3), gibt es die Tatsache, dass es mehr Code und eine weitere Datei im Spiel gibt, so dass es keinen Grund gibt, sich für die spätere Version zu entscheiden und PHP 5.2.x zu unterstützen.
Zusammengefasst
Ein noch ausführlicherer Artikel ist hier auf WPKrauts zu finden .
BEARBEITEN Der offensichtlich richtige Weg ist die Verwendung von
namespace
d-Code, der für das automatische Laden von PSR-4 vorbereitet ist, indem alles in das entsprechende Verzeichnis gestellt wird, das bereits über den Namespace definiert ist. Verwenden Sie dann einfach Composer und acomposer.json
, um Ihre Abhängigkeiten zu verwalten, und lassen Sie Ihren PHP-Autoloader automatisch erstellen (der automatisch eine Datei importiert, indem er nur aufruftuse \<namespace>\ClassName
). Dies ist der De-facto-Standard in der PHP-Welt, der einfachste Weg und noch vorautomatisierter und durch WP Starter vereinfacht .quelle
In Bezug auf die Aufteilung verwende ich in meinem Kessel eine benutzerdefinierte Funktion, um nach einem Ordner mit dem Namen "functions" im Themenverzeichnis zu suchen. Wenn dieser Ordner nicht vorhanden ist, wird er erstellt. Anschließend wird ein Array aller gefundenen .php-Dateien in diesem Ordner erstellt (falls vorhanden) und ein include () ausgeführt. auf jedem von ihnen.
Auf diese Weise füge ich jedes Mal, wenn ich neue Funktionen schreiben muss, eine PHP-Datei zum Funktionsordner hinzu und muss mich nicht darum kümmern, sie in die Site zu codieren.
quelle
Ich verwende gerne eine Funktion für die Dateien in einem Ordner. Dieser Ansatz erleichtert das Hinzufügen neuer Funktionen, wenn neue Dateien hinzugefügt werden. Aber ich schreibe immer in der Klasse oder mit Namespaces - geben Sie ihm mehr Kontrolle über den Namespace von Funktionen, Methoden usw.
Unten ein kleines Beispiel; Nutze aber auch die Vereinbarung über die Klasse * .php
In Themes verwende ich oft ein anderes Szenario. Ich definiere die Funktion der externen Datei in einer Support-ID, siehe Beispiel. Das ist nützlich, wenn ich die Funktion der externen Datei einfach deaktivieren möchte. Ich benutze die WP-Core-Funktion
require_if_theme_supports()
und er lade nur, wenn die Support-ID aktiv war. Im folgenden Beispiel habe ich diese unterstützte ID in der Zeile definiert, bevor ich die Datei geladen habe.Sie können mehr davon im Repo dieses Themas sehen .
quelle
Ich verwalte eine Site mit ungefähr 50 benutzerdefinierten Seitentypen in mehreren verschiedenen Sprachen über eine Netzwerkinstallation. Zusammen mit einer Menge Plugins.
Wir waren gezwungen, alles irgendwann aufzuteilen. Eine Funktionsdatei mit 20 bis 30.000 Codezeilen ist überhaupt nicht lustig.
Wir haben beschlossen, den gesamten Code komplett umzugestalten, um die Codebasis besser verwalten zu können. Die standardmäßige WordPress-Designstruktur eignet sich für kleine Websites, jedoch nicht für größere Websites.
Unsere neue functions.php enthält nur das, was zum Starten der Site notwendig ist, aber nichts, was zu einer bestimmten Seite gehört.
Das jetzt verwendete Themenlayout ähnelt dem MCV-Entwurfsmuster, weist jedoch einen prozeduralen Codierungsstil auf.
Zum Beispiel unsere Mitgliederseite:
page-member.php . Verantwortlich für die Initialisierung der Seite. Aufrufen der richtigen Ajax-Funktionen oder ähnliches. Entspricht möglicherweise dem Controller-Teil im MCV-Stil.
functions-member.php . Enthält alle Funktionen zu dieser Seite. Dies ist auch in mehreren anderen Seiten enthalten, die Funktionen für unsere Mitglieder benötigen.
content-member.php . Bereitet die Daten für HTML vor. Entspricht möglicherweise dem Modell in MCV.
layout-member.php . Der HTML-Teil.
Nachdem wir diese Änderungen vorgenommen haben, ist die Entwicklungszeit leicht um 50% gesunken, und jetzt hat der Produktbesitzer Probleme, uns neue Aufgaben zu geben. :)
quelle
Aus der Datei functions.php für untergeordnete Themen:
quelle
In functions.php wäre eine elegantere Art, eine erforderliche Datei aufzurufen:
require_once locate_template ('/ inc / functions / shortcodes.php');
quelle
locate_template()
hat einen dritten Parameter ...Ich habe die Antworten von @kaiser und @mikeschinkel kombiniert .
Ich habe alle meine Anpassungen an meinem Thema in einem
/includes
Ordner und in diesem Ordner habe ich alles in Unterordner aufgeteilt.Ich möchte nur
/includes/admin
und seine Unterinhalte aufgenommen werden, wenntrue === is_admin()
Wenn ein Ordner
iterator_check_traversal_callback
von der Rückgabe ausgeschlossen wird, werdenfalse
seine Unterverzeichnisse nicht iteriert (oder an ihn übergebeniterator_check_traversal_callback
).quelle