Das Problem
Wir waren alle in einer solchen Situation und viele Fragen auf dieser Website erfordern eine solche Lösung. Sie müssen entweder eine Datenbank aktualisieren, viele Daten automatisch einfügen, konvertieren meta_keys
oder ähnliches.
In einem laufenden System, das auf Best Practices basiert, sollte dies natürlich nicht passieren.
Aber ich würde gerne Ihre persönliche Lösung für dieses Problem erfahren und wissen, warum Sie sich für Ihre entschieden haben.
Die Frage
Wie implementieren Sie einmalige Skripte in Ihre (laufende) WordPress-Installation?
Das Problem ist hauptsächlich auf folgende Gründe zurückzuführen:
- Skripte, die Daten einfügen, sollten nicht mehrmals ausgeführt werden
- Skripte, die viele Ressourcen erfordern, sollten nicht zu einem Zeitpunkt ausgeführt werden, an dem sie nicht überwacht werden können
- Sie sollten nicht versehentlich ausgeführt werden
Den Grund frage ich
Ich habe meine eigene Praxis, ich werde sie in den Antworten veröffentlichen. Da ich nicht weiß, ob es die beste Lösung ist, würde ich gerne etwas über Ihre erfahren. Dies ist auch eine Frage, die häufig im Zusammenhang mit anderen Fragen gestellt wird, und es wäre großartig, wenn eine Ressource die Ideen sammelt.
Ich freue mich darauf, von dir zu lernen :)
quelle
wp-cron
geplanten Ereignissen.Antworten:
Ich benutze für mich eine Kombination aus:
Struktur
Ich verwende eine Datei (
onetime.php
) in meinem Include-Ordnerinc
, die in der enthaltenfunctions.php
ist und von dort nach der Verwendung gelöscht wird.Die Datei für das Skript selbst
In meinem ist
onetime.php
meine Funktionf711_my_onetime_function()
platziert. Da könnte es jede Funktion sein. Ich gehe davon aus, dass Ihr Skript getestet wurde und ordnungsgemäß funktioniert.Um die Kontrolle über die Ausführung des Skripts zu erlangen, verwende ich beide
Fähigkeitskontrolle
So verhindern Sie, dass andere Benutzer versehentlich mein Skript ausführen:
oder
eine vorübergehende
um mich davon abzuhalten, das Skript versehentlich mehr als einmal auszuführen.
Die Datei zum Ausführen des Skripts in meiner Funktion
f711_my_onetime_function()
würde folgendermaßen aussehen:Der Grund, warum ich den Transienten unmittelbar nach der Prüfung auf Vorhandensein gesetzt habe, ist, dass die Funktion ausgeführt werden soll, nachdem das Skript für die zweimalige Verwendung gesperrt wurde.
Wenn ich eine Ausgabe von meiner Funktion benötige, drucke ich sie entweder als Kommentar in der Fußzeile aus oder filtere manchmal sogar den Inhalt.
Die Sperrzeit ist auf 10 Minuten eingestellt, kann aber an Ihre Bedürfnisse angepasst werden.
Aufräumen
Nach der erfolgreichen Ausführung meines Skripts lösche ich das
include
ausfunctions.php
und entferne dasonetime.php
vom Server. Da ich für den Übergang eine Zeitüberschreitung verwendet habe, muss die Datenbank nicht bereinigt werden. Natürlich können Sie den Übergang auch löschen, nachdem Sie die Datei entfernt haben.quelle
Sie können dies auch tun:
laufen
onetime.php
und benennen Sie sie nach der Ausführung.quelle
Ich habe ein Kommandozeilen-Phing-Skript dafür erstellt. Es ist nichts Besonderes, als ein externes Skript zu laden, das ausgeführt werden soll. Der Grund, warum ich es über die CLI verwendet habe, ist folgender:
Sie können also Phing oder die PHP-CLI verwenden und nachts schlafen. Die WP-CLI ist auch eine gute Alternative, obwohl ich vergesse, ob Sie sie außerhalb des Webroot verwenden können.
Da dies ein beliebter Beitrag ist, ist hier ein Beispiel für das Skript: https://github.com/wycks/WordPhing (run.php)
quelle
Eine andere ziemlich einfache Möglichkeit, ein einmaliges Skript auszuführen, ist die Verwendung eines MU-Plugins.
Fügen Sie den Code in eine PHP-Datei ein (z. B.
one-time.php
), die Sie in den Ordner Ihrer MU-Plugins hochgeladen haben (standardmäßig/wp-content/mu-plugins
), passen Sie die Dateiberechtigungen an und führen Sie das Plugin aus (dh Sie müssen entsprechend Ihrem gewählten Hook nur das Frontend besuchen) / backend) und du bist fertig.Hier ist ein Kesselschild:
Ohne die Kommentare und das Zeug sieht es einfach so aus:
quelle
Unter idealen Bedingungen würde ich in den Server ssh und die Funktion selbst mit wp-cli ausführen.
Dies ist jedoch oft nicht möglich. Daher setze ich normalerweise eine $ _GET-Variable und hänge sie an 'init' an, zum Beispiel:
dann schlagen
und deaktivieren Sie den Haken, wenn es fertig ist.
quelle
Manchmal habe ich eine Funktion verwendet, die bei der Deaktivierung des Plugins aktiviert ist.
Siehe hier Aktualisiere alte Links zu hübschen Permalinks
Sobald nur noch Administratoren Plugins aktivieren können, erfolgt als Nebeneffekt eine Funktionsprüfung.
Es ist nicht nötig, die Datei zu löschen, wenn sie deaktiviert ist. Sie wird nicht von wordress aufgenommen. In der Sucht, wenn Sie es wieder ausführen möchten, können Sie. Aktivieren und wieder deaktivieren.
Und manchmal habe ich transient verwendet wie in @fischi answer. ZB hier abfragen, um Woocommerce-Produkte aus Bildern zu erstellen oder hier img-Tags im Post-Inhalt für automatisch veröffentlichte Posts löschen / ersetzen
Eine Kombination von beiden kann eine Alternative sein.
quelle
Auf jeden Fall können Sie, erstellen Sie einfach Ihren einmaligen Zeitcode als Plugin.
Problem, wie kann ich dieses Plugin aktivieren, ohne auf den Link Aktivieren zu klicken?
fügen Sie einfach
activate_plugins('onetime/index.php');
infunctions.php
oder Use muss Plugins verwenden, http://codex.wordpress.org/Must_Use_Plugins
Versuchen Sie es mit verschiedenen Aktionen, als wenn Sie einmaliges Plugin ausführen möchten,
admin_init - nach admin init
Init - WordPress Init
wp - wenn WordPress geladen
quelle
Eine andere Möglichkeit besteht darin, eine globale wp_option festzulegen, wenn die Arbeit abgeschlossen ist, und diese Option bei jeder Ausführung des init-Hooks zu überprüfen.
Natürlich müssen Sie diesen Code nicht für immer haben (auch wenn es sich um ein einfaches Lesen aus der Datenbank handelt), sodass Sie den Code wahrscheinlich entfernen können, wenn die Arbeit erledigt ist. Sie können diesen Optionswert auch manuell in 0 ändern, wenn Sie den Code erneut ausführen müssen.
quelle
Mein Ansatz ist diesbezüglich etwas anders. Ich füge mein einmaliges Skript gerne als Funktion in die function.php meines Themas ein und führe es auf einer bestimmten GET-Abfrage aus.
Um dies auszuführen, besuchen Sie einfach die URL "www.sitename.com/?linkupdate"
Das funktioniert bis jetzt gut für mich ...
Hat diese Methode irgendwelche Nachteile? Ich frage mich nur ...
quelle
Ich verwende nur eine einzelne benutzerdefinierte Produktvorlagenseite, die ich nicht verwende und die mit nichts auf dem öffentlichen Server verbunden ist.
Zum Beispiel, wenn ich eine Testimonial-Seite habe, die nicht online ist (im Entwurfsmodus oder was auch immer), sondern mit einer einzelnen Seitenvorlage verbunden ist
single-testimonial.php
- ich kann dort Funktionen platzieren, die Seite über a ladenpreview
und die Funktion oder was auch immer einmal gestartet. Es ist auch sehr einfach, die Funktion beim Debuggen zu ändern.Ist wirklich einfach und ich bevorzuge es gegenüber der Verwendung,
init
weil ich mehr Kontrolle darüber habe, wann und wie es gestartet wird. Nur meine Präferenz.quelle
Nur für den Fall, dass es hilft, habe ich das getan und es funktioniert gut:
quelle