Blog

  • /**  
     * 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 );