# wp_media_attach_action()

URL: https://chugunov.pro/api-wordpress/functions/wp_media_attach_action/
Проверено на WordPress 6.9, обновлено 06.08.2026.
Источник: независимый русскоязычный справочник chugunov.pro. Не является официальной документацией WordPress.

Тип: функция.
Появился в версии: 4.2.0.

## Сигнатура

```php
wp_media_attach_action( int $parent_id, string $action = 'attach' )
```

## Описание

Инкапсулирует логику действий прикрепления/открепления (Attach/Detach).

## Параметры

- `$parent_id` `int` — обязательный. ID родителя вложения.
- `$action` `string` — необязательный, по умолчанию `'attach'`. Действие прикрепления/открепления. Принимает 'attach' или 'detach'.
  
  Значение по умолчанию 'attach'.

## Исходный код

Файл: `wp-admin/includes/media.php:3839`

```php
function wp_media_attach_action( $parent_id, $action = 'attach' ) {
	global $wpdb;

	if ( ! $parent_id ) {
		return;
	}

	if ( ! current_user_can( 'edit_post', $parent_id ) ) {
		wp_die( __( 'Sorry, you are not allowed to edit this post.' ) );
	}

	$ids = array();

	foreach ( (array) $_REQUEST['media'] as $attachment_id ) {
		$attachment_id = (int) $attachment_id;

		if ( ! current_user_can( 'edit_post', $attachment_id ) ) {
			continue;
		}

		$ids[] = $attachment_id;
	}

	if ( ! empty( $ids ) ) {
		$ids_string = implode( ',', $ids );

		if ( 'attach' === $action ) {
			$result = $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment' AND ID IN ( $ids_string )", $parent_id ) );
		} else {
			$result = $wpdb->query( "UPDATE $wpdb->posts SET post_parent = 0 WHERE post_type = 'attachment' AND ID IN ( $ids_string )" );
		}
	}

	if ( isset( $result ) ) {
		foreach ( $ids as $attachment_id ) {
			/**
			 * Fires when media is attached or detached from a post.
			 *
			 * @since 5.5.0
			 *
			 * @param string $action        Attach/detach action. Accepts 'attach' or 'detach'.
			 * @param int    $attachment_id The attachment ID.
			 * @param int    $parent_id     Attachment parent ID.
			 */
			do_action( 'wp_media_attach_action', $action, $attachment_id, $parent_id );

			clean_attachment_cache( $attachment_id );
		}

		$location = 'upload.php';
		$referer  = wp_get_referer();

		if ( $referer ) {
			if ( str_contains( $referer, 'upload.php' ) ) {
				$location = remove_query_arg( array( 'attached', 'detach' ), $referer );
			}
		}

		$key      = 'attach' === $action ? 'attached' : 'detach';
		$location = add_query_arg( array( $key => $result ), $location );

		wp_redirect( $location );
		exit;
	}
}
```

## История изменений

- 4.2.0 — Introduced.

## Связанные

Использует: [`wp_redirect`](https://chugunov.pro/api-wordpress/functions/wp_redirect/), [`wp_get_referer`](https://chugunov.pro/api-wordpress/functions/wp_get_referer/), [`remove_query_arg`](https://chugunov.pro/api-wordpress/functions/remove_query_arg/), [`clean_attachment_cache`](https://chugunov.pro/api-wordpress/functions/clean_attachment_cache/), `wpdb::query`, [`current_user_can`](https://chugunov.pro/api-wordpress/functions/current_user_can/), [`__`](https://chugunov.pro/api-wordpress/functions/__/), [`wp_die`](https://chugunov.pro/api-wordpress/functions/wp_die/), [`add_query_arg`](https://chugunov.pro/api-wordpress/functions/add_query_arg/), [`do_action`](https://chugunov.pro/api-wordpress/functions/do_action/), `wpdb::prepare`.

Оригинал в официальной документации: https://developer.wordpress.org/reference/functions/wp_media_attach_action/
