# Two-Way ACF Relationship Field

> Keeps a relationship field in sync on both sides, so linking post A to post B also links B back to A, and removing the link removes it from both.

- Type: PHP
- Runs: Run everywhere
- Category: [Custom Post Types & Fields](https://wpide.com/library/category/post-types/)
- Tags: acf, relationship, sync
- Author: WPIDE Team
- Installs: 0
- Updated: 2026-10-28
- Page: https://wpide.com/library/acf-bidirectional-relationship/

## Code

```php
// Name of the relationship field used on both sides.
$wpide_acf_two_way_field = 'related_items';

add_filter( 'acf/update_value/name=' . $wpide_acf_two_way_field, function ( $value, $post_id, $field ) {
    static $running = false;

    if ( $running || ! is_numeric( $post_id ) || ! function_exists( 'update_field' ) ) {
        return $value;
    }

    $running = true;
    $post_id = (int) $post_id;
    $new     = array_filter( array_map( 'intval', (array) $value ) );
    $old     = array_filter( array_map( 'intval', (array) get_post_meta( $post_id, $field['name'], true ) ) );

    // Add this post to newly linked posts.
    foreach ( array_diff( $new, $old ) as $target ) {
        $links = array_filter( array_map( 'intval', (array) get_post_meta( $target, $field['name'], true ) ) );

        if ( ! in_array( $post_id, $links, true ) ) {
            $links[] = $post_id;
            update_field( $field['key'], array_values( array_filter( $links ) ), $target );
        }
    }

    // Remove this post from posts that were unlinked.
    foreach ( array_diff( $old, $new ) as $target ) {
        $links = array_filter( array_map( 'intval', (array) get_post_meta( $target, $field['name'], true ) ) );
        update_field( $field['key'], array_values( array_diff( $links, array( $post_id ) ) ), $target );
    }

    $running = false;

    return $value;
}, 10, 3 );
```

## Notes

Use the same relationship field on both post types (for example related_items). Existing links are updated the next time each post is saved.

## How to use it

Install the free WPIDE plugin (https://wordpress.org/plugins/wpide/), find "Two-Way ACF Relationship Field" in its snippet library and add it in one click; or create a new PHP snippet in WPIDE (or any code snippets plugin) and paste the code above. More snippets: https://wpide.com/library/
