Warum Advanced Custom Fields?
ACF ist ein wunderbares Tool, um strukturierter Daten in WordPress Posts speichern zu können.
Bevor das einzelne Felder im Backend angezeigt wird, kann es mit einem Hook verändert werden.
Das ist dann interessant, wenn ich mit diesen Metadaten vor dem Anzeigen etwas machen will. ZB Texte dranhängen, Berechnungen durchführen o.ä.
Nicht nur für’s Anzeigen gibts einen Hook sondern auch für den Fall, dass ich vor dem Speichern in die Datenbank etwas mit dem Feldinhalt anstellen will.
Warum können die Hooks so interessant sein?
Weil ich zb Daten in eine externe Tabelle speichern will – wie das zb hier besprochen wird:
https://support.advancedcustomfields.com/forums/topic/custom-database-table/
https://support.advancedcustomfields.com/forums/topic/dynamic-select-from-other-plugin-table/
Hook vor dem Anzeigen – acf/load_value
Es gibt vier Möglichkeiten, um sich in das Feld vor dem Anzeigen reinzuhängen.
https://www.advancedcustomfields.com/resources/acf-load_value/
Für das Ändern des Feldinhaltes vor der Ausgabe gibt es den acf/load_value Hook.
Genereller Hook
Dieser Filter greift für jedes Feld – schlägt also bei jedem Feld an.
Das ist dann sinnvoll, wenn ich jedes Feld ändern will oder ich einen Feldtyp nicht ausschließen kann. Oder wenn ich den Namen oder die ID des Feldes nicht kenne.
Da der Hook immer greift, kann es zu Performance-Problemen kommen.
// acf/load_value add_filter('acf/load_value', 'funktion_fuer_load_value_hook', 10, 3);
Hook für einen bestimmten Feldtyp
Wenn ich nur einen bestimmten Feldtypen behandeln will, ist das hier der richtige Hook.
Hier eine Übersicht der möglichen Feldtypen
// acf/load_value/type={$Feldtyp} add_filter('acf/load_value/type=select', 'funktion_fuer_load_value_hook', 10, 3);
Hook für den vergebenen Namen eines Feldes
Wenn ich den Namen eines Feldes kenne und gezielt dieses Feld ansprechen will, bin ich hier richtig.
Der Name ist im Backend bei den Feld-Gruppen ersichtlich:
// acf/load_value/name={$Feldname} add_filter('acf/load_value/name=e_mail_adresse_1', 'funktion_fuer_load_value_hook', 10, 3);
Hook für eine eindeutigen ID
Jedes Feld in ACF bekommt eine eindeutige ID, zb wie in folgendem Screenshot „field_56ac02513c8de“.
Diesen kann ich gezielt ansprechen. Dadurch wird der Code wenig dynamisch – da ich ja irgendwie den Key im PHP-Code hinterlegen muss. Unproblematischer ist das, wenn ich die ACF-Struktur sowieso per PHP bereitstelle.
// acf/load_value/key={$Feld-ID} add_filter('acf/load_value/key=field_56ac02513c8de', 'funktion_fuer_load_value_hook', 10, 3);
Hook vor dem Speichern – acf/update_value
Gleich wie beim Filter load_value gibt es für den Schritt vor dem Speichern der Feldinhalte einen Hook.
Dieser nennt sich acf/update_value.
Dieser kann wieder die gleichen vier Szenarien wie oben abgreifen.
Daher gibt es je einen Hook für
- alle Felder – ‚acf/update_value‘
- für einen bestimmten Feldtypen – ‚acf/update_value/type=select‘
- für einen vergebenen Feldnamen – ‚acf/update_value/name=e_mail_adresse_1‘
- für eine eindeutige ID – ‚acf/update_value/key=field_56ac02513c8de‘
https://www.advancedcustomfields.com/resources/acf-update_value/
ACF Quelltext
Im Quelltext von ACF werden die Hooks so bereitgestellt:
https://github.com/elliotcondon/acf/search?utf8=%E2%9C%93&q=load_value
Problem: Speichern leerer Inhalte in der Postmeta-Tabelle
Wenn ich zb manche ACF-Felder exklusiv in einer eigenen Tabelle speichern will, dann sollen die Daten ja nur dort auftauchen.
Das funktioniert, wenn ich mich in den acf/update_value Hook reinhänge und einen leeren Wert zurückgebe.
Das kann aber zu einem Problem werden, weil ACF dennoch Daten in der Postmeta-Tabelle speichert. Eben einen leeren Wert:
Beheben könnte ich das zb, indem ich mich in der WordPress eigenen Funktion update_metadata in den Hook „update_{$meta_type}_metadata“ reinhänge und bestimmte meta_keys behandle:
Update 2021:
ACF wurde ja bei der Einführung von Gutenberg der Tod vorausgesagt. Auch, weil Custom Fields/Metafelder in den Anfangstagen von Gutenberg absolut keine Rolle spielten.
ACF unwichtig durch Gutenberg?
Ganz im Gegenteil! Mit ACF kann man super einfach Gutenberg-Blöcke erstellen!
ACF bietet also einen einfachen Weg, um mit PHP Gutenberg-Blöcke zu programmieren, ohne viel JavaScript angreifen zu müssen.
Links
https://www.advancedcustomfields.com/resources/acf-update_value/
https://www.advancedcustomfields.com/resources/acf-load_value/
https://www.advancedcustomfields.com/resources/#field-types
https://support.advancedcustomfields.com/forums/topic/dynamic-select-from-other-plugin-table/