Archiv der Kategorie: Advanced Custom Fields

Positionierung von Custom Fields oder wie bekomme ich Felder in die Sidebar: Der ‚context‘-Parameter ist dein Freund!

Wir verwenden ACF und Custom Fields sehr häufig um unseren Produkten einen deutlich komplexeren Aufbau zu ermöglichen.
Daher machen wir uns auch immer reichlich Gedanken darüber, wie wir den Aufbau so einfach und logisch wie möglich gestalten können.

Dazu gehört nicht nur die Auswahl der Darstellungsform, sondern natürlich auch die Auswahl des Orts, wo wir unsere Custom Fields eingeblendet haben wollen.

Wenn ein Artikel z.B. ein alternatives Beitragsbild erhalten soll, ist es unsinnig dieses Feld direkt nach dem Titel anzuzeigen. Es sollte natürlich seitlich in der Nähe des primären Beitragsbild zu finden sein. Und das können wir ja ganz einfach steuern, oder?

Custom Fields und ACF

Wie wir Custom Fields erstellen, soll hier nicht Thema sein. Daher gehe ich nur auf die Funktion ein, mit der wir die Position festlegen können.

Hierfür verwenden wir die Funktion „add_meta_box( $id, $title, $screen, $context, $priority, $callback_args );„. Diese Metabox soll dann unsere Custom Fields beherbergen.

Der „context“ gibt dabei an, in welchem Bereich die Metabox angezeigt werden soll und mit „priority“ können wir zu einem bestimmten Grad festlegen, ob die Metabox vor oder nach anderen Metaboxen angezeigt wird.

ACF hat dafür natürlich einen eigenen Einstellungsbereich, bei dem wir ohne etwas zu programmieren zu unsern Custom Fields kommen.

Beispiel für die ACF Einstellungen

Hier im Screenshot sehen wir die Auswahl der Position unserer neuen Feldgruppe mit ACF.

Die Freiheit der Benutzer, die (unnötige?) Arbeit des Entwicklers

Egal wie gut und durchdacht unsere Logik dahinter ist, so bietet WP jedem Benutzer die Möglichkeit seine Eingabemaske so umzustellen, wie er oder sie es gerne hätte.

Denn die Informationen, wie Custom Fields und ACFs im Backend angezeigt werden, speichert WP in der Datenbank für jeden Nutzer einzeln in der Tabelle „_usermeta“ mit dem Key „meta-box-order_page“ ab.

Aber ist diese Geistesanstrengung dann überhaupt nötig?

Absolut! Immerhin dürfen wir nicht vergessen, dass der Großteil der Nutzer dieses Feature vermutlich gar nicht kennt. Außerdem zählt ja auch der erste Eindruck. Und den geben immer noch wir vor!

Aber einen wichtigen Punkt gibt es hierbei zu bedenken und der ist auch der Grund für diesen Artikel.

Achtung bei nachträglichen Änderungen

Sobald wir uns entscheiden, ein Feld im Nachhinein umzustellen, kann es passieren, dass ein Nutzer von dieser Umstellung nichts mitbekommt.

Denn jeder Nutzer, der bereits aktiv mit unseren Custom Fields oder unsern ACFs gearbeitet hat, der hat noch die alten Positionsangaben in der Datenbank stehen und ist somit von unseren Umstellungen ausgeschlossen.
(Zumindest solange wir hier nicht programmatisch eingreifen und auch gleich diesen Wert in der „_usermeta“-Tabelle ändern…)

In Kurz: Hat ein User bereits ein bestehendes ACF-Feld bearbeitet, wird zu den Usermetadaten die Aufteilung des Backends gespeichert und Änderungen kommen beim User nicht an!

Das ist für alle Entwickler zu bedenken, die im Nachhinein ACF-Felder bearbeiten und in der Position verschieben.

 

weiterführende Links:

Custom Fields

Custom Meta Boxes

add_meta_box()

Creating a Field Group

ACF – Felder vor dem Anzeigen und Speichern ändern

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/custom-database-table/

https://support.advancedcustomfields.com/forums/topic/dynamic-select-from-other-plugin-table/
https://support.advancedcustomfields.com/forums/topic/dynamic-select-from-other-plugin-table/

Hook vor dem Anzeigen – acf/load_value

https://www.advancedcustomfields.com/resources/acf-load_value/
https://www.advancedcustomfields.com/resources/acf-load_value/

Für das Ändern des Feldinhaltes vor der Ausgabe gibt es den acf/load_value Hook.
Es gibt vier Möglichkeiten, um sich in das Feld vor dem Anzeigen reinzuhängen.

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

Auswahlmöglichkeit der Feldtypen in ACF
Auswahlmöglichkeit der Feldtypen in ACF
// 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:

Feldname in ACF
Feldname in ACF
// 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.

Eindeutige ID - Key
Eindeutige ID – Key
// 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/
https://www.advancedcustomfields.com/resources/acf-update_value/

 

ACF Quelltext

Im Quelltext von ACF werden die Hooks so bereitgestellt:

ACF-Quelltext load_value Hooks
ACF-Quelltext load_value Hooks

 

https://github.com/elliotcondon/acf/search?utf8=%E2%9C%93&q=load_value
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:

Leere Werte in Postmeta-Tabelle
Leere Werte in Postmeta-Tabelle

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:

https://github.com/WordPress/WordPress/blob/e6267dcf19f1309954e04b65a7fa8e9e2df5d0a4/wp-includes/meta.php#L143

https://github.com/WordPress/WordPress/blob/e6267dcf19f1309954e04b65a7fa8e9e2df5d0a4/wp-includes/meta.php#L187

Update Metadata Hook
Update Metadata Hook

Links

https://www.advancedcustomfields.com/resources/acf-update_value/

https://www.advancedcustomfields.com/resources/acf-update_value/

https://www.advancedcustomfields.com/resources/acf-load_value/

 

https://www.advancedcustomfields.com/resources/#field-types
https://www.advancedcustomfields.com/resources/#field-types

Dynamic Select from other plugin table?


https://support.advancedcustomfields.com/forums/topic/dynamic-select-from-other-plugin-table/