WP: require_once in WP plugin
Glossary overview

WP: require_once in WP plugin

У меня есть плагин, который регистрирует REST API endpoint, получает данные и загружает изображения.
Вот одна из функций в моём плагине:
    private function handleMedia(WP_REST_Request $request, int $post_id): void
    {
        require_once ABSPATH . 'wp-admin/includes/file.php';
        require_once ABSPATH . 'wp-admin/includes/media.php';
        require_once ABSPATH . 'wp-admin/includes/image.php';

        $files = $request->get_file_params();

        if (!empty($files['featured_image'])) {
            $attachment_id = media_handle_upload('featured_image', $post_id);
            if (!is_wp_error($attachment_id)) {
                set_post_thumbnail($post_id, $attachment_id);
            }
        } else {
            if (has_post_thumbnail($post_id)) {
                delete_post_thumbnail($post_id);
            }
        }

        if (!empty($_FILES['content_images'])) {
            foreach ($_FILES['content_images']['name'] as $i => $name) {
                $_FILES['tmp_file'] = [
                    'name'     => $name,
                    'type'     => $_FILES['content_images']['type'][$i],
                    'tmp_name' => $_FILES['content_images']['tmp_name'][$i],
                    'error'    => $_FILES['content_images']['error'][$i],
                    'size'     => $_FILES['content_images']['size'][$i],
                ];
                media_handle_upload('tmp_file', $post_id);
            }
        }
    }

Для чего подключать эти файлы WP?

 require_once ABSPATH . 'wp-admin/includes/file.php';
        require_once ABSPATH . 'wp-admin/includes/media.php';
        require_once ABSPATH . 'wp-admin/includes/image.php';

Ответ

Эти require_once действительно нужны, потому что некоторые функции для загрузки медиа в WordPress доступны только в админке (wp-admin) — и не загружаются автоматически в публичной или REST-среде.

🧠 Почему нужно require_once

Функции вроде:

  • media_handle_upload()
  • wp_handle_upload()
  • wp_generate_attachment_metadata()
  • wp_crop_image() и т.д.

находятся в файлах:

  • wp-admin/includes/file.php
  • wp-admin/includes/media.php
  • wp-admin/includes/image.php

❗ Эти файлы не подключаются автоматически, если ты:

  • в REST API;
  • в Ajax-запросе;
  • в консольном WP-CLI;
  • в плагине, который работает вне админки.

🧱 Что будет без require_once

Если ты не подключишь эти файлы, а попытаешься вызвать media_handle_upload(), WordPress выдаст:

Uncaught Error: Call to undefined function media_handle_upload()

📌 Когда можно не подключать?

  • В админке (обычные страницы через /wp-admin/...) — уже подключено.
  • В хуках типа save_post или admin_post_* — возможно, уже доступно.

Но в REST API — почти никогда не подключается.