Ü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_post auch für Terme, Nutzer und Options-Seiten und übergibt dann einen String wie term_12; der Sync hing direkt mit idf_acf_sync_controlled_sync( int $post_id ) am Hook, und PHP 8 bricht bei einem String am int-Parameter mit einem TypeError ab. Aufgefallen, seit Marken ein ACF-Feld haben. Neu hängt am Hook idf_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-post und "Spiegeln" Erfolg meldeten. Ursache war die Prüfung über get_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 in idf_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() und idf_acf_sync_remove_from_field() geben jetzt zurück, was passiert ist: true geschrieben, null stand schon so, false übersprungen. idf_acf_sync_controlled_sync() liefert daraus added, removed und skipped; idf_acf_sync_reconcile_pair() zählt zusätzlich idf_acf_sync_remove_from_field()0. Damit ist ein stiller Ausfall an der Zahl erkennbar und nicht mehr nur in der idf_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 der parent_file-Filter half nicht, weil menu-header.php nach den Filtern get_admin_page_parent() aufruft und $parent_file dabei 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 auf admin_head per remove_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 Filter parent_file und submenu_file klappen 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 in seiten(). 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-Slug idf-acf-bidirectional-sync sucht. 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-table fü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_Checker zuerst; 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 (mappings zu _legacy_mappings) auf das neue Paar-Modell.

v3.2.0

Hinzugefügt

  • Deinstallations-Standard: uninstall.php und 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 das fixed-Tabellenlayout eingeengt und ist dadurch deutlich übersichtlicher.

v3.1.3

Geändert

  • Auf Git-basiertes Deployment migriert (idf-ci Workflow, readme.txt + CHANGELOG.md als 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.css ausgelagert.
  • 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).

0 Comments

Info
  • Version: 3.7.1
  • Version vom: 19. September 2026
  • WordPress-Version: 6.0
  • Getestet bis WP-Version: 6.5
  • PHP-Version: 8.0
  • Kompatible Themes: Alle
  • Erforderliche Plugins: Advanced Custom Fields (ACF), IDF Master-Key
  • Mitwirkende: Joerg Martin