Wenn wir Advanced Custom Fields Pro als Basis für die Entwicklung eines Themes oder Plugins verwenden, gibt es einige essentielle Dinge zu beachten, um vielen Anfängerfehlern vorzubeugen.

Was sollten wir also beachten um noch besser mit ACF zu arbeiten und um die Entwicklung an einem WordPress Theme oder Plugin zu optimieren?

1. Fallback für ACF-Funktionen: Prüfen ob das Plugin Advanced Custom Fields Pro existiert bevor wir eine ACF-Funktion in unseren Template-Dateien nutzen.
2. ACF Wrapper-Funktionen: Eine ACF-Wrapper Funktion nutzen, welche uns die Entwicklung maßgeblich vereinfacht.

Eine Fallback-Lösung für ACF-Funktion erstellen

Wenn wir ACF-Funktionen wie get_field(), get_sub_field(), have_rows(), etc. in unserem Theme oder Plugin verwenden, müssen wir eine Fallback-Lösung erstellen, damit der Benutzer keine „Call to undefined function“ Fehlermeldung erhält, sobald das ACF Plugin deaktiviert wurde oder nicht installiert ist.

Fatal error: Call to undefined function get_field()

So sieht eine typische Fehlermeldung aus, wenn wir in WordPress einen White-Screen sehen, sobald eine verwendete Funktion in einem Theme oder Plugin nicht gefunden wird:

Wie können wir das lösen?

Die einfache Antwort darauf ist if( class_exists( 'ACF' ) ) { ... } oder if( function_exists( 'get_field' ) ) { ... } Bedingungen in unseren Theme bzw. Plugin zu verwenden. Immer dann bevor wir eine ACF-Funktion aufrufen. Wenn ACF-Funktionen immer innerhalb so einer Bedingung stehen, werden Funktionen wie get_field() oder get_sub_field() gar nicht erst aufgerufen, sollte das Plugin ACF nicht installiert oder deaktiviert sein.

Fallback-Funktionen erstellen, für den Fall das ACF nicht installiert ist

Wenn wir ACF-Felder sehr oft in unseren Templates nutzen, wird der Code sehr unübersichtlich und wirkt aufgebläht, insofern wir jede ACF-Funktion immer wieder, innerhalb einer der oben genannten Funktionen aufrufen müssen.

Um den Code sauber und minimalistisch zu halten, schaffen wir uns eine eigene Fallback-Lösung um nie wieder einen „Fatal error: Call to undefined function“ Fehler zu erhalten.

Zunächst müssen wir für alle ACF-Funktionen die wir in unserem Plugin oder Theme verwenden, eine Funktion erstellen, die „true“ zurückgibt, falls die ACF-Funktion nicht undefiniert ist:

Wrapper-Funktionen für ACF erstellen

Im nächsten Schritt erstellen wir sogenannte Wrapper-Funktionen, für jede ACF-Funktion die wir in unserem Theme oder Plugin verwenden. Dann wird z.B. aus get_field() eine alternative Funktion wie core_get_field().

Du wirst im Zuge deiner weiteren Theme bzw. Plugin-Entwicklung noch feststellen, welche enormen Vorteile diese Vorgehensweise bietet. Zum einen haben wir eine zentrale Stelle, mit der wir automatisch alle Unter-Funktionen wie get_field() oder get_sub_field() beeinflussen können, ohne dabei in jedem einzelnen Template eine Anpassung vornehmen zu müssen. Zum anderen können wir weitere Prüfungen hinzufügen oder einen ACF Feld-Cache einbauen, der automatisch für alle verwendeten ACF-Funktionen in deinem Theme oder Plugin gilt. Außerdem handhaben wir so auch die Fallback-Lösung, sollten ACF-Funktionen undefiniert sein.

ACF Wrapper-Funktion für get_field()

Dieses Beispiel stellt eine Wrapper-Funktion für get_field() dar. Bevor überhaupt ein „Fatal error: Call to undefined function“ Fehler auftreten kann, bricht die Wrapper-Funktion noch vor dem Abruf der undefinierten get_field() Funktion ab:

Die oben beschriebene Lösung funktioniert aber nur dann, wenn du konsequent auf die Nutzung der Standard ACF-Funktionen wie get_field('field_name') verzichtest und stattdessen immer eine eigene Wrapper-Funktion wie core_get_field('field_name') in deinen Theme oder Plugin-Dateien verwendest:

ACF Wrapper-Funktion für get_sub_field()

Eine Wrapper-Funktion für ACF get_sub_field() könnte so aussehen und birgt dieselben Vorteile, wie schon oben erwähnt. Neben einer Fallback-Lösung, haben wir nun auch eine zentrale Stelle, an der wir die ACF-Funktionen noch vor der Ausgabe beeinflussen können um sie bspw. mit weiteren Bedingungen zu verknüpfen:

Anstatt weiterhin die Standard ACF-Funktion get_sub_field('field_name') in deinen Template-Dateien zu verwenden, verwendest du nun ausschließlich core_get_sub_field('field_name'):

ACF Wrapper-Funktion für have_rows()

Je nachdem, welche anderen ACF Funktionen wir noch in unserem Plugin oder Theme verwenden, musst du zusätzliche Wrapper-Funktionen erstellen. Die Wrapper-Funktion für have_rows() könnte folgendermaßen aussehen:

Achte bitte wirklich darauf, überall in deinen Template-Dateien ausschließlich und konsequent die Wrapper-Funktionen zu verwenden, damit diese Lösung auch fehlerfrei funktionieren kann. Im folgenden Beispiel würden wir dann statt dem Aufruf von have_rows('field_name') die alternative Funktion core_have_rows('field_name') verwenden:

Diese Lösung wird dir hintenraus enorm viel Zeit und Nerven sparen. Denn wir haben einen Anlaufpunkt geschaffen, an dem wir wirklich alle ACF-Funktionen durch die Anpassungen nur einer einzigen Funktion beeinflussen können. Wenn wir unser Theme oder Plugin zukünftig mit weiteren Bedingungen anpassen möchten, oder ACF-Felder z.B. aus zwischengespeicherten Transienten abrufen wollen, können wir dann innerhalb der erstellten Wrapper-Funktionen tun. Des Weiteren haben wir somit eine Lösung erschafft, die keine „Fatal error: Call to undefined function“ Fehlermeldungen mehr ausgibt, sollte das ACF Plugin nicht installiert oder deaktiviert sein.