Die Aufgabe
Sie können registrieren, indem register_theme_directory()
Sie zusätzliche Themes-Verzeichnisse für Ihre WP-Installation hinzufügen . Leider bietet core nicht die gleiche Funktionalität für Plugins. Wir haben bereits MU-Plugins, Drop-Ins, Plugins und Themes. Für eine bessere Dateiorganisation benötigen wir jedoch mehr.
Hier ist die Liste der Aufgaben, die zu erfüllen sind:
- Fügen Sie ein zusätzliches Plugin-Verzeichnis hinzu
- Für jedes Plugin-Verzeichnis wird ein neuer "Tab" benötigt, wie hier gezeigt [1].
- Das zusätzliche Verzeichnis hätte die gleiche Funktionalität wie das Standard-Plugin-Verzeichnis
Was ist für dich drin?
Die beste und vollständigste Antwort wird mit einem Kopfgeld belohnt.
[1] Zusätzliche Registerkarte für einen neuen Plugin-Ordner / -Verzeichnis
plugins
plugin-development
directory
Kaiser
quelle
quelle
get_themes()
in eine Klasse.Antworten:
Okay, ich werde es versuchen. Einige Einschränkungen, auf die ich unterwegs gestoßen bin:
Es gibt nicht viele Filter in Unterklassen von WP_List_Table, zumindest nicht dort, wo wir sie brauchen.
Aufgrund des Fehlens von Filtern können wir oben keine genaue Liste der Plugin-Typen führen.
Wir müssen auch einige großartige (read: dirty) JavaScript-Hacks verwenden, um Plugins als aktiv anzuzeigen.
Ich habe meine Admin-Vorwahl in eine Klasse eingeschlossen, damit meinen Funktionsnamen kein Präfix vorangestellt wird. Sie können den gesamten Code hier sehen . Bitte tragen Sie bei!
Zentrale API
Nur eine einfache Funktion, die eine globale Variable erstellt, die unsere Plugin-Verzeichnisse in einem assoziativen Array enthält. Das
$key
wird intern verwendet, um Plugins abzurufen, usw.$dir
ist entweder ein vollständiger Pfad oder etwas relativ zumwp-content
Verzeichnis.$label
wird für unsere Anzeige im Admin-Bereich sein (zB eine übersetzbare Zeichenfolge).Dann müssen wir natürlich die Plugins laden. Hängen Sie
plugins_loaded
sich spät ein und gehen Sie die aktiven Plugins durch und laden Sie sie.Admin-Bereich
Lassen Sie uns unsere Funktionalität in einer Klasse einrichten.
Wir werden
plugins_loaded
sehr früh einsteigen und die erlaubten "Aktionen" einrichten, die wir verwenden werden. Diese behandeln die Aktivierung und Deaktivierung des Plugins, da die eingebauten Funktionen dies mit benutzerdefinierten Verzeichnissen nicht tun können.Dann ist da noch die Funktion, in die man sich einhakt
load-plugins.php
. Das macht alle möglichen lustigen Sachen.Lassen Sie uns diese eine Sache nach der anderen durchgehen. Die
get_plugins
Methode ist ein Wrapper um eine andere Funktion. Es füllt das Attributplugins
mit Daten.cd_apd_get_plugins
ist eine Kopie der eingebautenget_plugins
Funktion ohne HardcodierungWP_CONTENT_DIR
undplugins
Business. Grundsätzlich gilt: Holen Sie sich das Verzeichnis aus dem$wp_plugin_directories
globalen, öffnen Sie es, finden Sie alle Plugin-Dateien. Speichern Sie sie für später im Cache.Als nächstes geht es darum, Plugins tatsächlich zu aktivieren und zu deaktivieren. Dazu verwenden wir die
handle_actions
Methode. Dies ist wieder krass von der Spitze der Kerndatei abgerissenwp-admin/plugins.php
.Ein paar benutzerdefinierte Funktionen hier wieder.
cd_apd_activate_plugin
(abgerissen vonactivate_plugin
) undcd_apd_deactivate_plugins
(abgerissen vondeactivate_plugins
). Beide sind die gleichen wie ihre jeweiligen "Eltern" -Funktionen ohne die fest codierten Verzeichnisse.Und die Deaktivierungsfunktion
Es gibt auch
cd_apd_validate_plugin
Funktionen, die natürlich eine Abzocke sind,validate_plugin
ohne den fest codierten Müll.Okay, damit aus dem Weg. Wir können tatsächlich über die Anzeige der Listentabelle sprechen
Schritt 1: Fügen Sie unsere Ansichten zur Liste oben in der Tabelle hinzu. Dies geschieht durch Filtern
views_{$screen->id}
innerhalb unsererinit
Funktion.Dann durchläuft die eigentliche Hook-Funktion einfach die
$wp_plugin_directories
. Wenn eines der neu registrierten Verzeichnisse Plugins enthält, werden diese in die Anzeige aufgenommen.Das erste, was wir tun müssen, wenn wir eine benutzerdefinierte Plugin-Verzeichnisseite anzeigen, ist, die Ansichten erneut zu filtern. Wir müssen die
inactive
Zählung loswerden, weil sie nicht genau sein wird. Eine Folge davon, dass es keine Filter gibt, wo wir sie brauchen. Haken Sie wieder ein ...Und ein kurzes Loslassen ...
Lassen Sie uns als Nächstes die Plugins entfernen, die Sie sonst in der Listentabelle gesehen hätten, und sie durch unsere benutzerdefinierten Plugins ersetzen. Haken Sie ein
all_plugins
.Da wir bereits unsere Plugins und Daten eingerichtet haben (siehe
setup_plugins
oben),filter_plugins
speichert die Methode nur (1) die Anzahl aller Plugins für einen späteren Zeitpunkt und (2) ersetzt die Plugins in der Listentabelle.Und jetzt werden wir die Massenaktionen töten. Diese könnten leicht unterstützt werden, nehme ich an?
Die standardmäßigen Plugin-Aktionslinks funktionieren bei uns nicht. Also müssen wir stattdessen unsere eigenen einrichten (mit den benutzerdefinierten Aktionen usw.). In der
init
Funktion.Die einzigen Dinge, die hier geändert werden, sind: (1) Wir ändern die Aktionen, (2) den Plugin-Status beizubehalten und (3) die Nonce-Namen ein wenig zu ändern.
Und zum Schluss müssen wir nur noch JavaScript in die Warteschlange stellen, um das Ganze abzurunden.
init
Wieder in der Funktion (diesmal alle zusammen).Während wir unser JS in die Warteschlange stellen, verwenden wir auch
wp_localize_script
, um den Wert der Gesamtzahl aller Plugins abzurufen .Und natürlich ist der JS nur ein paar nette Hacks, um die Listentabelle von aktiven / inaktiven Plugins richtig anzuzeigen. Wir werden auch die korrekte Anzahl aller Plugins wieder in den
All
Link einfügen.Einpacken
Das eigentliche Laden zusätzlicher Plugin-Verzeichnisse ist ziemlich aufregend. Schwieriger ist es, die Listentabelle korrekt anzuzeigen. Ich bin immer noch nicht ganz zufrieden mit dem Ergebnis, aber vielleicht kann jemand den Code verbessern
quelle
__return_empty_array()
.__return_empty_array
Funktion eingebaut !Ich persönlich habe kein Interesse daran, die Benutzeroberfläche zu ändern, aber ich würde aus mehreren Gründen ein besser organisiertes Dateisystem-Layout begrüßen.
Zu diesem Zweck wäre ein anderer Ansatz die Verwendung von Symlinks.
Sie können Ihre benutzerdefinierten Plugins einrichten
plugins-custom
, die Teil des Versionskontroll-Repository Ihres Projekts sein können.Dann können Sie Abhängigkeiten von Drittanbietern installieren
plugins-external
(über Composer, Git-Submodule oder was auch immer Sie bevorzugen).Dann können Sie ein einfaches Bash-Skript oder einen WP-CLI-Befehl verwenden, der die zusätzlichen Verzeichnisse durchsucht und
plugins
für jeden gefundenen Unterordner einen Symlink erstellt .plugins
wäre immer noch überladen, aber es wäre egal, weil Sie nur mitplugins-custom
und interagieren müsstenplugins-external
.Das Skalieren in
n
zusätzliche Verzeichnisse würde dem gleichen Prozess folgen wie die ersten beiden.quelle
Sie können auch COMPOSER mit einem benutzerdefinierten Verzeichnispfad verwenden, der auf den Ordner wp-content verweist. Wenn es sich bei einer direkten Antwort auf Ihre Frage nicht um eine neue Denkweise von WordPress handelt, fahren Sie mit dem Komponisten fort, bevor er Sie auffrisst.
quelle