Über dieses Plugin
Der IDF ACF Bidirectional Sync ersetzt ACF Pro’s eingebauten bidirektionalen Sync für Relationship- und Post-Object-Felder durch einen kontrollierten, kaskadenfreien Mechanismus. Entwickelt von der Ideenfabrik GmbH, verhindert das Plugin Endlosschleifen und unkontrolliertes Überschreiben bei komplexen Beziehungen zwischen Custom Post Types.
Features
- Master-Key-Anbindung: Automatische Updates und Lizenzprüfung über IDF Master-Key (>= 1.5.0). Non-blocking: Plugin funktioniert auch ohne Master-Key.
- Anti-Kaskade: Wenn der Sync die Gegenseite aktualisiert, wird kein weiterer Sync ausgelöst (keine Endlosschleifen).
- Diff-basierter Sync: Nur tatsächliche Änderungen (hinzugefügt/entfernt) werden synchronisiert, kein blindes Überschreiben.
- Einfache Paare: Jedes Feld synchronisiert nur sein Gegenfeld (keine Kettenreaktion).
- Auto-Erkennung: Scannt aktive ACF-Feldgruppen nach Relationship- und Post-Object-Feldern und erstellt automatisch Mapping-Vorschläge.
- Manuelles Mapping: CPT-Slug und Feldname manuell eingeben, falls die Auto-Erkennung nicht greift.
- Snapshots: Erstellt Snapshots aller aktuellen Verknüpfungen für den Diff-Vergleich.
- Admin-Oberfläche: Einstellungsseite mit Mapping-Tabelle, Toggle-Schalter, Status-Übersicht und Snapshot-Verwaltung.
- Hilfe-Seite: Dokumentation der Funktionsweise direkt im WordPress-Admin.
- Dependency-Check: Automatische Prüfung, ob ACF Pro aktiv ist. Klare Admin-Hinweise bei fehlender Abhängigkeit.
- Migration: Automatische Übernahme von Einstellungen aus älteren Plugin-Versionen (kein Datenverlust beim Update).
Changelog
v3.7.1
Behoben
- Eine Marke (oder jeder andere Term mit ACF-Feldern) ließ sich im Backend nicht mehr anlegen oder speichern, WordPress meldete nur „A server error occurred". ACF feuert
acf/save_postauch für Terme, Nutzer und Options-Seiten und übergibt dann einen String wieterm_12; der Sync hing direkt mitidf_acf_sync_controlled_sync( int $post_id )am Hook, und PHP 8 bricht bei einem String amint-Parameter mit einem TypeError ab. Aufgefallen, seit Marken ein ACF-Feld haben. Neu hängt am Hookidf_acf_sync_on_save_post(), das nur Post-IDs an den Sync weiterreicht; Terme, Nutzer und Options-Seiten sind kein Sync-Fall.
v3.7.0
Behoben
- Der Sync hat jeden Ziel-Post still übersprungen, dessen Gegenfeld noch nie gespeichert worden war - die Gegenseite blieb dann leer, obwohl
sync-postund "Spiegeln" Erfolg meldeten. Ursache war die Prüfung überget_field_object()mit dem Feldnamen: ACF löst einen Namen über die Referenz-Meta_{name}auf, die erst beim ersten Speichern entsteht. Getroffen hat es damit genau den Bestand, für den das Plugin gedacht ist - Einträge, die seit ihrer Anlage nie im Editor waren. Neu entscheidet die Feldgruppe: Gehört das Feld laut Location-Regel zum Post-Typ des Ziels, wird geschrieben (idf_acf_sync_resolve_field(), Karte je Request inidf_acf_sync_cpt_field_map()).update_field()mit dem Feld-Key legt die Referenz-Meta selbst an.
Geändert
idf_acf_sync_add_to_field()undidf_acf_sync_remove_from_field()geben jetzt zurück, was passiert ist:truegeschrieben,nullstand schon so,falseübersprungen.idf_acf_sync_controlled_sync()liefert darausadded,removedundskipped;idf_acf_sync_reconcile_pair()zählt zusätzlichidf_acf_sync_remove_from_field()0. Damit ist ein stiller Ausfall an der Zahl erkennbar und nicht mehr nur in deridf_acf_sync_remove_from_field()1.
v3.6.2
Behoben
- Auf den Reiter-Seiten (Hilfe, Deinstallation) blieb die Seitenleiste weiterhin zugeklappt: Die Seiten hingen am versteckten Eltern-Slug
idf-acf-bidirectional-sync-reiter, zu dem WordPress kein Menü kennt, und derparent_file-Filter half nicht, weilmenu-header.phpnach den Filternget_admin_page_parent()aufruft und$parent_filedabei neu setzt. Der versteckte Eltern-Slug entfällt; alle Seiten hängen jetzt am echten Eltern-Menü (IDF Home bzw. Top-Level-Fallback) und werden aufadmin_headperremove_submenu_page()aus der Navigation genommen. Damit sind sie unsichtbar, über ihre unveränderte URL erreichbar und die Seitenleiste bleibt aufgeklappt.
v3.6.1
Behoben
- Auf den Reiter-Seiten (Hilfe, Deinstallation) blieb die Seitenleiste zugeklappt und kein Menüeintrag war markiert - man sah beim Arbeiten nicht, in welchem Plugin man ist. Ursache: Die Seiten hängen am versteckten Eltern-Slug
idf-acf-bidirectional-sync-reiter, zu dem es kein Menü gibt. Die Filterparent_fileundsubmenu_fileklappen jetzt IDF Home (bzw. den Top-Level-Fallback) auf und markieren den Plugin-Eintrag.
v3.6.0
Geändert
- Admin-Menü auf die IDF-Menükonvention umgebaut: Das Plugin hängt sich mit einem einzigen Eintrag "ACF Sync" unter IDF Home; Hilfe und Deinstallation sind Reiter auf der Einstellungsseite statt eigener Menüpunkte. Läuft IDF Home nicht, bleibt der bisherige eigene Menüpunkt (gleicher Slug, gleiches Icon, gleiche Position) als Rückfall erhalten. Alle Seiten-URLs bleiben unverändert, alte Lesezeichen funktionieren weiter.
- Das Admin-Menü liegt jetzt in der Klasse
IDF_ACF_Sync_Admin(includes/admin.php); Seiten-Slugs, Titel und Capabilities stehen dort als einzige Quelle inseiten(). Die Berechtigungsprüfung je Seite nutzt die Capability dieser Seite.
v3.5.0
Hinzugefügt
- Automatik "Leere Felder beim Speichern entfernen" (Default an, in den Aktionen abschaltbar): Beim Speichern eines Beitrags entfernt das Plugin leere Relationship-/Post-Object-Felder automatisch, statt sie als leeren Datenbank-Eintrag zurückzulassen. Verhindert dauerhaft die "leeren-aber-vorhandenen" Felder (Ursache leerer Frontend-Überschriften), die ACF beim Speichern jeder Feldgruppe anlegt. Per
acf/save_post(Priorität 25).
v3.4.3
Behoben
- Im IDF-Home-Dashboard fehlte der "Settings"-Button für dieses Plugin. Ursache: Das Admin-Menü lief unter dem Kurz-Slug
idf-acf-sync, während IDF Home die Einstellungsseite unter dem Plugin-Slugidf-acf-bidirectional-syncsucht. Die Menü-Slugs (Hauptseite, Hilfe, Deinstallation) nutzen jetzt den vollen Plugin-Slug; der Button erscheint.
v3.4.2
Behoben
- Der Sync hinterließ beim vollständigen Leeren eines Feldes ein leeres Array im Postmeta, statt es zu löschen. Solche "leeren-aber-vorhandenen" Felder ließen Ausblend-Logiken im Frontend leere Überschriften zeigen. Leere Felder werden jetzt per
delete_field()vollständig entfernt.
Hinzugefügt
- Aktion "Leere Felder aufräumen": findet und entfernt bestehende leere-aber-vorhandene Relationship-/Post-Object-Felder seitenweit. Erst Vorschau (zeigt Anzahl je Feld), dann Bereinigung. Es werden ausschließlich Felder ohne gültige Verknüpfung bereinigt, befüllte Felder bleiben unangetastet.
v3.4.1
Geändert
- Backend-Oberfläche auf natives WordPress-Layout umgestellt (WP-Design-Konvention): native Listentabelle ohne Breitenbegrenzung, je Aktion eine eigene Spalte (Spiegeln, Spiegelungen löschen, Paar entfernen), native Checkbox statt eigenem Toggle, native Buttons und
form-tablefür die Aktionen. Eigene Styles auf das Minimum reduziert (nur dezente Abblendung inaktiver Zeilen).
v3.4.0
Hinzugefügt
- "Spiegelungen löschen" je Paar: entfernt gezielt nur die vom Plugin selbst erzeugten Verknüpfungen wieder. Von Hand gepflegte Verknüpfungen bleiben erhalten.
- Protokoll der vom Plugin gesetzten Verknüpfungen in
_idf_acf_sync_managed_{field_name}als Grundlage dafür. Greift für Verknüpfungen, die ab dieser Version automatisch erzeugt werden (nicht rückwirkend).
v3.3.2
Geändert
- Der "Spiegeln"-Button zeigt nach dem Ausfuehren das Datum des letzten Spiegelns ("gespiegelt: TT.MM.JJJJ") und wird zu einem dezenten "erneut spiegeln"-Link. Aufgeraeumtere Uebersicht, ohne die Funktion zu entfernen. Gespeichert wird der Zeitstempel je Paar unter
reconciled_at.
v3.3.1
Behoben
- Aktivierungs-Absturz auf Sites mit mehreren IDF-Plugins behoben. Da dieses Plugin alphabetisch als erstes geladen wird, definierte sein Dependency-Checker die geteilte Klasse
IDF_Dependency_Checkerzuerst; ein spaeter ladendes Plugin mit einer ungeschuetzten Kopie stuerzte dann mit "Cannot declare class IDF_Dependency_Checker, because the name is already in use" ab. Der Checker dieses Plugins traegt jetzt einen eindeutigen Klassennamen (IDF_ACF_Sync_Dependency_Checker) und kollidiert nicht mehr mit den Kopien anderer Plugins.
v3.3.0
Geändert
- Datenmodell von CPT-zu-Feld-Zuordnung (
mappings) auf explizite Feld-Paare (pairs) umgestellt. Ein Paar verbindet ein Feld auf Seite A mit dem Gegenfeld auf Seite B; der Sync läuft in beide Richtungen.
Behoben
- Selbst-Verknüpfungen (Felder, die auf den eigenen Beitragstyp zeigen, z.B. "Ähnliche Jobs" oder die Wissen-Verbindungen) wurden nie auf die Gegenseite gespiegelt. Ursache war eine Anti-Kaskaden-Bedingung, die das eigene Gegenfeld grundsätzlich übersprang.
- Pro Beitragstyp wurde nur ein einziges Verknüpfungsfeld erkannt; weitere Felder fielen aus dem Sync.
- Bei mehreren Feldern auf denselben Ziel-Beitragstyp landete der Rück-Sync im falschen Feld.
Hinzugefügt
- Aktiv-Schalter je Verknüpfungs-Paar in der Übersicht.
- "Spiegeln" (Reconcile): ergänzt für ein Paar die Gegenseiten bereits vorhandener Verknüpfungen, ohne bestehende zu entfernen.
- Paar-basierte Auto-Erkennung inklusive symmetrischer Selbst-Verknüpfungen.
- Automatische Migration der Alt-Konfiguration (
mappingszu_legacy_mappings) auf das neue Paar-Modell.
v3.2.0
Hinzugefügt
- Deinstallations-Standard:
uninstall.phpund Untermenü "Deinstallation" mit Opt-in zum Entfernen aller Plugin-Daten (Mappings, Snapshot-Zeitstempel,_idf_acf_sync_prev_*-Postmeta, Legacy-Optionen) beim Löschen des Plugins.
Geändert
- Mapping-Liste nutzt jetzt das native WordPress-Listenlayout ohne feste Spaltenbreiten. Die Tabelle wird nicht mehr durch den
.card-Container (max-width 520px) und dasfixed-Tabellenlayout eingeengt und ist dadurch deutlich übersichtlicher.
v3.1.3
Geändert
- Auf Git-basiertes Deployment migriert (idf-ci Workflow,
readme.txt+CHANGELOG.mdals Pflichtdateien).
v3.1.1
Behoben
- Dependency-Check funktioniert jetzt unabhängig von der alphabetischen Plugin-Ladereihenfolge.
- Dependency-Checker auf v1.5.1 (mit
class_exists-Guard).
Hinzugefügt
- Plugin-Header
Requires at least: 6.0.
v3.1.0
Hinzugefügt
- Master-Key-Anbindung für automatische Updates und Lizenzprüfung.
- Dependency-Check (prüft IDF Master-Key >= 1.5.0).
- Konstante
IDF_ACF_SYNC_FILE. - Eigener Dependency-Checker in
includes/.
v3.0.0
Geändert
- Kompletter Rewrite auf IDF-Plugin-Standards.
- IDF-Naming: alle Funktionen, Konstanten, Option-Keys, CSS-Klassen und Hooks auf
idf_acf_sync_-Prefix. - Modulare Dateistruktur (
includes/,assets/). - Eigener Top-Level-Menüpunkt mit Einstellungen und Hilfe.
- CSS in
assets/admin.cssausgelagert. - PHP 8.0 Minimum.
Hinzugefügt
- Hilfe-Seite mit Funktionsbeschreibung und Bedienungsanleitung.
- Dependency-Check für ACF Pro.
- Migration v2.x-Option-Keys auf neue Namen.
Entfernt
- Emoticons in der Admin-Oberfläche (Dashicons stattdessen).