/**
* Synchronisiert die Eltern-Kind-Beziehung in beide Richtungen.
* Diese Funktion ist robuster und behandelt Hinzufügen sowie Entfernen.
*/
function sync_parent_child_relationship( $post_id ) {
// Nur für den Inhaltstyp 'personen' ausführen.
if ( get_post_type( $post_id ) !== 'personen' ) {
return;
}
// Prüfen, ob das Feld 'kinder' auf der aktuellen Seite überhaupt existiert.
// Dies verhindert, dass der Code unnötig läuft.
if( ! is_admin() || empty($_POST['acf']) || !isset(get_field_object('kinder')['key']) ) {
return;
}
// Das Geschlecht der Person, die gerade gespeichert wird, ermitteln.
$gender = get_field( 'geschlecht', $post_id );
if ( $gender === 'Weiblich' ) {
$parent_field_name = 'mutter';
} elseif ( $gender === 'Männlich' ) {
$parent_field_name = 'vater';
} else {
// Wenn kein Geschlecht gesetzt ist, kann keine Beziehung hergestellt werden.
return;
}
// Die NEUE Liste der Kinder aus dem Formular holen.
$new_children_ids = get_field( 'kinder', $post_id, false );
if ( ! is_array( $new_children_ids ) ) {
$new_children_ids = []; // Sicherstellen, dass es immer ein Array ist.
}
// Die ALTE Liste der Kinder aus der Datenbank holen.
// Wir fragen: "Wer hat mich aktuell als Mutter/Vater eingetragen?"
$old_children_query = new WP_Query([
'post_type' => 'personen',
'posts_per_page' => -1,
'fields' => 'ids', // Wir brauchen nur die IDs.
'meta_query' => [
[
'key' => $parent_field_name,
'value' => $post_id,
'compare' => '=',
]
]
]);
$old_children_ids = $old_children_query->posts;
// 1. Kinder, die HINZUGEFÜGT werden sollen:
// (Sind in der neuen Liste, aber nicht in der alten)
$children_to_add = array_diff( $new_children_ids, $old_children_ids );
foreach ( $children_to_add as $child_id ) {
// Beim Kind den Elternteil eintragen.
update_field( $parent_field_name, $post_id, $child_id );
}
// 2. Kinder, die ENTFERNT werden sollen:
// (Sind in der alten Liste, aber nicht mehr in der neuen)
$children_to_remove = array_diff( $old_children_ids, $new_children_ids );
foreach ( $children_to_remove as $child_id ) {
// Beim Kind den Elternteil-Eintrag löschen.
update_field( $parent_field_name, '', $child_id );
}
}
// Die Funktion an den Speicher-Vorgang von ACF hängen.
add_action( 'acf/save_post', 'sync_parent_child_relationship', 20 );
/**
* Setzt den Titel einer 'Person' beim Speichern (serverseitiges Fallback).
*/
function set_person_title_on_save_fallback( $post_id ) {
if ( get_post_type( $post_id ) !== 'personen' ) {
return;
}
if ( ! isset($_POST['acf']) ) {
return;
}
// Holen der Feld-Schlüssel aus der ACF-Konfiguration (robuster)
$vorname_key = '';
$nachname_key = '';
$field_groups = acf_get_field_groups(['post_type' => 'personen']);
if ($field_groups) {
foreach ($field_groups as $group) {
$fields = acf_get_fields($group['key']);
foreach ($fields as $field) {
if ($field['name'] === 'vorname') $vorname_key = $field['key'];
if ($field['name'] === 'nachname') $nachname_key = $field['key'];
}
}
}
$vorname = isset($_POST['acf'][$vorname_key]) ? sanitize_text_field($_POST['acf'][$vorname_key]) : '';
$nachname = isset($_POST['acf'][$nachname_key]) ? sanitize_text_field($_POST['acf'][$nachname_key]) : '';
if ( $vorname && $nachname ) {
$new_title = $vorname . ' ' . $nachname;
remove_action( 'acf/save_post', 'set_person_title_on_save_fallback', 20 );
wp_update_post( array(
'ID' => $post_id,
'post_title' => $new_title,
) );
add_action( 'acf/save_post', 'set_person_title_on_save_fallback', 20 );
}
}
add_action( 'acf/save_post', 'set_person_title_on_save_fallback', 20 );