Multi Medial - analog bis ziemlich digital

Alle WP-Options per wp-config konfigurieren

Während der alltäglichen Lektüre der Make-Blogs habe ich Ende September eine scheinbar kleine Änderung am Core entdeckt, die ich sehr praktisch finde.

Beiläufig wird erwähnt das in WordPress 6.1 ein neuer Filter "pre_option" eingeführt wird. Für die meisten WP-Websites dürfte es auch vollkommen uninteressant sein. Für verschiedene meiner Kundenprojekte finde ich diesen Filter aber äußerst hilfreich.

Immer wieder wollte ich in Projekten Einstellungen an der Website per Code konfigurieren. Ein beliebter Fall sind verschiedene Instanzen des selben Projekt z.B. Staging- und Live-System. Dabei kommt es immer wieder vor, dass im Staging eine Funktion deaktiviert werden soll oder einen anderen Wert bekommen soll z.B. API-Keys oder E-Mail-Adressen.

Nicht alle Plugins sind so gebaut, dass sie das Setzen von Einstellungen per PHP-Konstante unterstützen. Ein paar erlauben es aus Sicherheits-Gründen wie WP Mail SMTP. Diese Funktion ist für mich oft ein Kriterium bei der Entscheidung für oder gegen ein Plugin.

Für meine Projekte verwende ich ein Auto-Deployment, dass immer auch „lokale Konfigurationsdateien“ ablegt. Diese würde ich gerne nutzen um Instanzen flexibel und individuell einzustellen. Mit dem neuen Filter und einem kleinen Snippet/Plugin geht dies nun.

Es gibt doch schon „pre_option_{$option}“

Der neue Filter pre_option und pre_option_{$option} werden immer aufgerufen bevor eine Einstellung/Option aus der Datenbank ausgelesen wird. Es ist also möglich dem Script einen Wert unterzuschieben ohne dafür die Datenbank nutzen zu müssen.
Damit ist das überschreiben oder erst gar nicht in der DB ablegen von Werten möglich.

Die Funktion ist also nicht komplett neu. Aber der alte Filter ist sehr spezifisch und bedarf das Anlegen eines ganzen Filter-Snippets. Das Snippet beinhaltet eine Prüfung ob überhaupt die gewünschte Option gerade aufgerufen wird und dann erst den eigentlich Wert.

/**
 * @param string $value
 *
 * @return string
 */
function reaction_buttons_mods_active( $value ): string {
   return '1';
}
add_filter( 'pre_option_reaction_buttons_clear_supported_caches', 'reaction_buttons_mods_active');

So ein Filter ist mit anständigem Codestye in vllt. 3 bis 5 Zeilen umgesetzt. Dies war auch bisher mein Lösungsweg. Ich habe mir MU-Plugins gebaut, die dann automatisch in die entsprechende Systeme ausgeliefert wurden. Ziemlich viel Aufwand und Zeilen um mal eben eine Zahl oder einen String zu überschreiben.

Der neue Weg dank neuem Filter

Mein Ziel war es zukünftig Einstellungen einfach mittels nur einer Zeile in der wp-config.php setzen zu können. Dafür habe ich ein kleines Plugin „WP-Config-urator“ geschrieben.

Das Plugin ist bewusst als Einzel-Datei ausgeführt damit es als reguläres Plugin oder als MU-Plugin genutzt werden kann.

Nach der Installation & Aktivierung kann jeder Wert der eigentlich aus der wp_options Tabelle gelesen werden würde per PHP-Konstante gesetzt werden.

define( 'REACTION_BUTTONS_CLEAR_SUPPORTED_CACHES', '1' );

Wichtig ist zu beachten das der Optionkey in der Datenbank eigentlich nur aus Kleinbuchstaben besteht. In PHP gilt die Regel das Konstanten nur mit Großbuchstaben geschrieben werden. Daher habe ich das Plugin so gebaut, dass es den Names-String umformt und dann danach sucht.

Nicht perfekt

Dieser Weg um Einstellungen zu setzen ist übersichtlich solange die einzelne Einstellung wirklich nur eine Zahl oder String ist. Bei größere Arrays oder JSON-Blobs wird das schon schnell hässlich.

Einschränkungen

Eine Einschränkung betrifft die Network Options in Multisites. Diese werde nicht mit gefiltert.

Leider ist die Funktionen add_option() zum Erstellen von Optionen nicht so gebaut, dass man das unnötige Schreiben von Daten in die Datenbank verhindern kann. Dies kann dazu führen, dass beim Debuggen der Wert vor einem im Datenbank-Viewer und die Ausgabe einfach nicht übereinstimmen.

Aktualisieren von Optionen

Es gibt einen Filter pre_update_option der ggf. genutzt werden kann um das Verändern/Hinzufügen von Options verhindern zu können. Hier bin ich bisher noch nicht weiter eingestiegen. Dazu gibt es bei Gelegenheit einen separaten Beitrag.

Sollte es eine Core-Funktion sein?

Ich finde die Idee einen standardisierten Weg zu haben um WP-Websites komplett per wp-config.php zu konfigurieren sehr wertvoll.

Was hältst du von dem neuen Filter und dem Mini-Plugin?

Zurück

Wieder was gelernt diese Woche #11

Nächster Beitrag

Wieder was gelernt diese Woche #12

  1. Dieser neue Filter ist wirklich super praktisch! Bei eigenen Plugins nutze ich ja meisten selbst definierte Konstanten, die ich dann direkt in der Config anlegen kann. Aber für Optionen hilft das natürlich nicht.

    Für komplexere Optionen mit einem Array könnte man vermutlich entweder einen JSON-String oder ein serialisiertes Objekt verwenden. Alternativ vielleicht einfach die Konstanten in einer Klasse definieren, darin kann man ja dann auch Arrays verwenden.

    • Drivingralle

      Das const Schlüsselwort lässt sich auch außerhalb von Klassen verwenden um Werte zu definieren ist auch recht übersichtlich:
      // Config statify
      const STATIFY = array(
      'days' => 730,
      'days_show' => 30,
      'limit' => 100,
      'today' => 0,
      'snippet' => 1,
      'blacklist' => 0,
      'show_totals' => 1,
      'skip' => array(
      'logged_in' => 0,
      ),
      );

  2. Werde ich mal für meine Multisite-Installation ausprobieren. Suche da schon länger eine Möglichkeit Options über mehrere Seiten hinweg zu synchronisieren, weil sie Seiten sich sehr ähnlich sind. Danke für das Mini-Plugin!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Präsentiert von WordPress & Theme erstellt von Anders Norén