Frisch notiert!

Die neusten Artikel aus unserem Blog.

Advanced Custom Fields PHP vs. JSON: In PHP konvertierte ACF-Felder wieder in JSON umwandeln

Gepostet am 27/03/2018 von Gino Cremer
6 Kommentare
Allgemein, Wordpress
/ Allgemein / Wordpress / 6

Das beliebte WordPress-Plugin "Advanced Custom Fields" - kurz ACF - erlaubt den Export der angelegten Felder als JSON-Datei und als PHP-Datei. Beide Formate haben jeweils Ihre Vor- und Nachteile. Wir zeigen welche und wie man in PHP exportierte Felder wieder via JSON in WordPress "zurück spielen" kann.

Was ist dieses Advanced Custom Fields?

Advanced Custom Fields erlaubt die Bearbeitungsmasken in WordPress deutlich zu erweitern. Während - zumindest Stand heute - nur ein Titel und ein Editor zur Verfügung steht, kann man zahlreiche neue Felder dank ACF hinzufügen. Ideal zur Darstellung von Produkt-Details oder zum Anlegen von Mitarbeiter-Steckbriefen beispielsweise. Das Plugin ist toll dokumentiert und existiert sowohl in einer kostenlosen Basis-Fassung als auch in einer erweiterten kostenpflichtigen Version (allerdings ist der Betrag jeweils nur einmal zu zahlen - alle Updates erhält man anschließend kostenlos). Mehr Infos: advancedcustomfields.com

Wählt man unter „Eigene Felder“ das Menü „Werkzeuge“, kann man ACF-Felder als JSON-Datei importieren – zum Beispiel aus einer anderen WordPress-Installation. Ein Export ist ebenfalls möglich. So stehen die Optionen „Datei exportieren“ (erstellt eine JSON-Datei) und „PHP erstellen“ (stellt alles in PHP-Form bereit).

Vorteile und Nachteile der JSON-Option

Vorteil der ersten Option „Datei exportieren“: Man erhält eine einzige gruppierte Datei mit allen vorab ausgewählten ACF-Feldern. Diese eine Datei kann man dann in einer beliebigen anderen Installation importieren. Vorausgesetzt dort ist ebenfalls ACF installiert. Ein tiefgreifenderes technisches Verständnis ist nicht notwendig. Alles klappt „out of the box“.

Der Nachteil ist allerdings, dass sich JSON-Code nicht sofort in der eigenen Programmierung einsetzen lässt. Gerade wer eigene WordPress-Plugins unterhält, ein eigenes auf ACF-basierendes Plugin schreibt oder in seinem eigenen Theme gerne vorab definierte ACF-Felder nutzen möchte, hat damit ein Problem. Schöner ist da nämlich Option 2: „PHP erstellen“

Vorteile und Nachteile der PHP-Option

Vorteil der zweiten Option „PHP erstellen“: Man erhält umgehend einen PHP-Schnippsel, den man via Copy-Paste in seine eigene PHP-Programmierung einarbeiten kann. Möchte man also eigene ACF-Felder in sein Plugin einarbeiten zum Beispiel für ein eigenes „Mitarbeiter-Plugin“, kann man hier den entsprechenden PHP-Code erhalten, heraus kopieren und verwerten.

Der Nachteil ist allerdings: Möchte man anschließend an den ACF-Felder noch etwas ändern, wird es etwas hakelig. Man kann zwar im PHP-Code „wurschteln“, allerdings hat man nicht die Möglichkeit bequem und intuitiv auf die ACF-typischen Bedienelemente zurück zu greifen. Anders ausgedrückt: Der PHP-Code ist fest in den Code „zementiert“. Die Felder werden korrekt im Backend dargestellt, allerdings kann man sie nicht wie „Eigene Felder“ > „Feld-Gruppen“ bearbeiten.

Dass man mit der PHP-Option also eine Einbahnstraße gewählt hat, ist allerdings bedauerlich, da man im Prinzip als Plugin-Entwickler immer eine eigene WordPress-Installation betreiben muss, um von dort ausgehend die ACF-Felder frisch als PHP zu exportieren.

Doch auch hier hilft ein bisschen PHP-Code: Es ist nämlich durchaus möglich, den bereits fertig exportierten PHP-Code später wieder in eine JSON-Datei umzuwandeln. Diese lässt sich wiederum dann in ACF importieren und schon sind alle ACF-Felder wieder über die komfortable ACF-Benutzeroberfläche veränderbar.

Quelle: https://dev-notes.eu/2017/01/convert-acf-fields-registered-by-php-to-importable-json-format/

ACF: PHP-Code wieder in JSON umwandeln zur erneuten Bearbeitung im Backend

In einem ersten Schritt müssen wir innerhalb des Themes bzw. Child-Themes einen Ordner /acf-json/ erstellen. Dieser wird von ACF automatisch erkannt. Anschließend werden alle Gelder-Gruppen dort als JSON abgelegt und nicht mehr in der Datenbank. Wer ein Versionierungssystem wie Git nutzt, wird diese Tatsache sicher zu schätzen wissen.

In einem zweiten Schritt, können wir nun manuell eine eigene JSON-Datei namens „acf-import.json“ dort ablegen, die wir anschließend via PHP mit unseren Feldern füllen lassen (bitte drauf achten, dass die Datei wirklich im Ordner /acf-json/ abliegt – anderenfalls den PHP-Code entsprechend anpassen).

In einem dritten Schritt muss nun der folgende PHP-Code aufgerufen werden. Damit dies geschieht, empfehle ich diesen Code in den klassischen WordPress-Loop einzubauen und einmalig aufzurufen (sprich zum Beispiel in die page.php oder die single.php setzen).

<?php

$groups = acf_get_local_field_groups();
$json = [];

foreach ($groups as $group) {
// Fetch the fields for the given group key
$fields = acf_get_local_fields($group['key']);

// Remove unecessary key value pair with key "ID"
unset($group['ID']);

// Add the fields as an array to the group
$group['fields'] = $fields;

// Add this group to the main array
$json[] = $group;
}

$json = json_encode($json, JSON_PRETTY_PRINT);
// Optional - echo the JSON data to the page
echo "<pre>";
echo $json;
echo "</pre>";

// Write output to file for easy import into ACF.
// The file must be writable by the server process. In this case, the file is located in
// the current theme directory.
$file = get_stylesheet_directory_uri() . '/acf-json/acf-import.json';
file_put_contents($file, $json );

?>

Ruft man seine WordPress-Website nun auf (hat man zum Beispiel die single.php innerhalb seines Themes genutzt, muss man natürlich ein Beitragsdetail aufrufen), wird die JSON-Datei entsprechend gefüttert. Nun kann man diese im Backend via „Eigene Felder“ > „Werkzeuge“ als JSON-Datei importieren. Und schon stehen alle Felder wieder via ACF bereit!

Häufige Fragen

Nicht immer läuft alles reibungslos. Hier ein paar Erläuterungen zu „klassischen“ Fehlern und ein paar Ratschläge „obendrauf“:

Meine Datei wird nicht gefüllt, woran kann das liegen?

  • Nachprüfen ob die Datei korrekt benannt ist.
  • Nachprüfen ob die Datei auch wirklich korrekt im Ordner /acf-json/ abliegt
  • Nachprüfen ob der PHP-Prozess die Datei beschreiben kann (möglicherweise fehlt das Zugriffsrecht)
  • Nachprüfen ob der PHP-Code ausgeführt wird. Wer den Code in den Loop der page.php gesetzt hat, wird diesen nicht ausführen wenn der Loop der single.php (Beitragsdetail) ausgeführt wird.

Jetzt sind aber alle Felder-Gruppen in diese JSON-Datei gesetzt worden

Der Code „zieht“ automatisch alle registrierten Felder-Gruppen heraus und speichert diese in die JSON-Datei. Es bestehen zwei Möglichkeiten nur die via PHP exportieren Felder zu erhalten:

  • Entweder öffnet man die JSON-Datei und kopiert sich lediglich den Abschnitt heraus, der die PHP-Felder betrifft. Das erfordert allerdings etwas mehr technisches Verständnis von der JSON-Syntax. Ist dies allerdings vorhanden, ist das der schnellste Weg.
  • Man führt die oben notierten Schritte in einer „leeren“ WordPress-Installation aus ohne bereits existierende ACF-Felder. Damit werden logischerweise auch nur die via PHP registrierten ACF-Feldergruppen berücksichtigt.

Gino Cremer

Ich bin Geschäftsführer der auf Weblösungen spezialisierten Agentur Pixelbar aus dem belgischen Eupen. Ich habe langjährige Erfahrung mit CMS-basierten Kundenprojekten, vornehmlich auf WordPress-Basis und bin ein Webdesigner der ersten Stunde. Daneben arbeite ich auch als Dozent und Berater am WIFI Wien im Bereich Social Media und Webdesign.

Weitere Beiträge von gino anzeigen

6 Kommentare

  1. Hallo Gino,

    danke für diese Anleitung. Leider bekomme ich, wenn ich das PHP-Skript ausführe, folgende Fehlermeldung:
    PHP Warning: Invalid argument supplied for foreach() in on line XXX

    In Zeile XXX steht: foreach ($groups as $group) {

    Woran könnte das liegen?

    Beste Grüße
    David

  2. Ok, ich stand nur auf dem Schlauch: Ich hatte das Skript an der falschen Stelle eingebaut – bevor die Plugins geladen wurden.
    Im Loop (wie empfohlen) hats dann geklappt. Super, vielen Dank!

  3. danke für deinen beitrag. fast konnte ich meine daten retten, allerdings scheint das repeater-feld nicht zu funktionieren – hast du eine idee? folgendes musste ich noch machen, damit das schreiben der datei funktioniert: statt get_stylesheet_directory_uri() hab ich get_template_directory() benutzt.

Kommentar hinterlassen

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