Bestimmte ACF Felder nicht escapen
Wenn wir Advanced Custom Fields Pro verwenden, um in WordPress mit benutzerdefinierten Feldern zu arbeiten, ist es wichtig alle diese Feldwerte vor dem Speichern zu escapen. Damit verhindern wir auf dem einfachen Weg, dass bspw. Schadcode in Form von Javascript innerhalb der Felder eingeschleust werden kann.
ACF bietet dafür den Filter acf/update_value
, welcher alle Feldwerte vor den Speichern beeinflussen kann:
Durch das obere Code-Beispiel lassen sich also alle Felder von ACF automatisch auf den sicheren Weg speichern, da zuvor ein Wert bspw. durch die WordPress-Funktion wp_kses_post() escaped wird. Auch andere Validierungsmöglichkeiten könnten hier angewendet werden.
Wie kann ich Ausnahmen in diese automatische ACF Feldprüfung integrieren?
Da die automatische Feldprüfung wirklich alle ACF Felder betrifft, kommt sie evtl. auch dort zum Einsatz, wo wir sie in bestimmten Ausnahmen nicht benötigen.
Ein Beispiel: Wir haben ein ACF Feld, welches Code-Beispiele darstellen soll. Hier benötigen wir z.B. das Speichern von HTML-Elementen. Wenn wir allerdings alle Felder automatisch escapen, verliert der gespeicherte Feldwert immer wieder Teilstücke seines Inhaltes.
Ein weiteres Beispiel: Wir möchten in einem ACF-Feldwert HTML und Javascript zulassen, weil wir dies für die Ausgabe von Affiliate-Werbung benötigen. Oft werden Werbebanner mit HTML oder Javascript eingebunden. Auch hier wäre es nicht zielführend, wenn dieser Code wieder escaped wird, da der Werbebanner ansonsten nicht angezeigt werden kann.
Für diesen Fall können wir Ausnahmen in unseren oberen ACF-Filter einbauen und nur in bestimmten Fällen, bzw. für spezielle Felder die Ausgabe von HTML oder Javascript zulassen:
Wie der obere Code-Schnipsel zeigt, ist der Filter nun etwas angepasst und zwei bestimmte ACF Felder werden vor dem Speichern nicht mehr escaped. Alle anderen ACF Felder werden weiterhin escaped. Durch die Angabe eines eindeutigen Feld-Schlüssels $field['key']
, welches jedes ACF Feld besitzt, können wir den Filter noch vor dem eigentlichen escapen beeinflussen. Das sieht dann so aus: