Загрузить изображение с помощью REST API в медиатеку.

Вопрос или проблема

Я работаю над загрузкой изображения в медиатеку, а затем прикреплением его к выбранному изображению. Я поместил код ниже в мой файл functions.php и отправил JSON-файл через Postman, но по какой-то причине он загружался тысячи раз, пока я не остановил процесс и не удалил код, чтобы остановить его. Он загружается в медиатеку, но продолжает создавать изображения. У меня в коде нет цикла. Я просто тестировал код ниже, чтобы проверить, смогу ли я заставить его выполниться один раз. Я все еще учусь, как работает WordPress. Извините, если это глупые вопросы.

  1. Файл functions.php выполняется непрерывно, пока работает WordPress?
  2. Должно ли это быть в файле functions.php и как сделать так, чтобы он выполнялся только один раз?
    $url="http://localhost/download.png";
    $request = wp_remote_post(
        'http://localhost/wordpress/wp-json/wp/v2/media',
        array(
            'headers' => array(
                'Authorization' => 'Basic ' . base64_encode( 'api-user:xxxx xxxx xxxx xxxx xxxx xxxx' ),
                'Content-Disposition' => 'attachment; filename="' . basename( $url ) . '"',
                'Content-Type: ' . wp_get_image_mime( $url ),
            ),
            'body' => file_get_contents( $url )
        )
    );

    if( 'Created' === wp_remote_retrieve_response_message( $request ) ) {
        $body = json_decode( wp_remote_retrieve_body( $request ) );
        $featured_image_id = $body->id;
    }
  1. Файл functions.php выполняется непрерывно, пока работает WordPress?

Да, он выполняется при каждой загрузке страницы. Вы можете узнать больше о файле функций темы на https://developer.wordpress.org/themes/basics/theme-functions/.

  1. Должно ли это быть в файле functions.php и как сделать так, чтобы оно выполнялось только один раз?

Это может быть помещено в этот файл, однако, оно должно выполняться условно, например, поместите его в функцию и затем вызовите функцию из вашего шаблонного файла или из хука. Таким образом, вы можете сделать так, чтобы она выполнялась только один раз. (но будет ли она фактически выполнена только один раз, зависит от вашего кода)

Пример:

  • Код в файле functions.php активной темы:

    <?php
    /**
     * Функции и определения вашей темы
     *
     * @link https://developer.wordpress.org/themes/basics/theme-functions/
     */
    
    function my_upload_image_function() {
        // ваш код здесь, который загружает изображение
    }
    
  • Затем в вашем шаблонном файле просто вызовите функцию, когда это необходимо: my_upload_image_function().

  • Или вы можете подключить функцию к определенному действию:

    add_action( 'hook_name', 'my_upload_image_function' );
    

Это краткая информация о файле функций темы, а теперь о том, что пытается сделать ваш код.

Пытаюсь привыкнуть работать на этом сайте тоже. Потерял пост на несколько дней и, видимо, неправильно зарегистрировал. Не могу вернуться к вашему последнему ответу.

JSON-файл предназначен для индивидуального типа записи. Индивидуальная запись работает нормально. Я могу создать новую индивидуальную запись с обновлением пользовательских полей, используя REST API. Кроме того, я хочу загрузить изображение для этой записи, прикрепить изображение к выбранному изображению во время создания новой индивидуальной записи. Честно говоря, я все еще изучаю REST API и WordPress. Изучая /wp/v2/media и исследуя код, я вижу только примеры для curl или wp_remote_post(). Я убрал все из functions.php, и, похоже, происходит то же самое с wp_remote_post(). Он загрузит тысячи изображений и не остановится. Кажется, он застревает на wp_remote_post() и никогда не выходит за его пределы. Я включил отладку, и она никогда не выходит из удаленной функции. Если я не должен вызывать ее на rest_api_init. Я посмотрю на конечную точку еще раз, чтобы увидеть, могу ли я заставить ее работать напрямую. Просто пока не получилось.

.

Ответ или решение

Загрузка изображения в медиатеку WordPress через REST API — сложная задача, особенно если вы только начинаете разбираться с этой системой. Давайте рассмотрим вашу проблему более подробно и предложим оптимальное решение.

Теория

  1. Файл functions.php и его выполнение: Файл functions.php выполняется каждый раз при загрузке страницы вашего сайта WordPress. Он не предназначен для одноразовых операций, таких как загрузка изображения, поскольку выполняет код при каждом запросе к серверу.

  2. Одноразовое выполнение: Для того чтобы выполнить код один раз, его следует определять в виде функции и вызывать либо в конкретном шаблоне, либо через определенные хуки в WordPress.

  3. Использование REST API: В вашем коде используется метод wp_remote_post() для выполнения POST-запроса к эндпоинту /wp/v2/media. Этот метод может вызывать проблемы, если его неправильно использовать или если он вызывается неоднократно из-за структуры вашего кода.

Пример

  1. Создание функции: Определите вашу логику загрузки изображения внутри функции, чтобы четко контролировать, когда и как она выполняется.
function upload_image_to_media_library() {
    $url = "http://localhost/download.png";
    // Следует убедиться, что URL действителен и файл доступен.

    $request = wp_remote_post(
        'http://localhost/wordpress/wp-json/wp/v2/media',
        array(
            'headers' => array(
                'Authorization' => 'Basic ' . base64_encode('api-user:xxxx xxxx xxxx xxxx xxxx xxxx'),
                'Content-Disposition' => 'attachment; filename="' . basename($url) . '"',
                'Content-Type' => wp_get_image_mime($url),
            ),
            'body' => file_get_contents($url)
        )
    );

    if ('Created' === wp_remote_retrieve_response_message($request)) {
        $body = json_decode(wp_remote_retrieve_body($request));
        $featured_image_id = $body->id;
    }
}
  1. Вызов функции: Вызывайте данную функцию в нужном месте — например, при создании или обновлении пользовательского поста.
add_action('transition_post_status', 'run_upload_image_function', 10, 3);

function run_upload_image_function($new_status, $old_status, $post) {
    if ('publish' === $new_status && 'publish' !== $old_status) {
        // Убедитесь, что это именно ваш кастомный тип поста
        if ('ваш_кастомный_тип_поста' === get_post_type($post)) {
            upload_image_to_media_library();
        }
    }
}

Применение

Используя вышеописанный метод, вы можете избежать множественной загрузки одного и того же изображения. Убедитесь, что ваш код выполняется только при определенных условиях, избегая перезаписи функции внутри файлов, которые выполняются при каждом обращении к серверу.

Рекомендации

  1. Дебаггинг: Используйте функции логирования (error_log()) для мониторинга выполнения кода, чтобы вы могли заранее выявить, где именно происходит зацикливание.

  2. REST API Варианты: Рассмотрите возможность использования media_sideload_image(), что упростит вашу задачу, так как эта функция непосредственно интегрирована с WordPress и позволяет загружать изображения из URL в медиатеку более эффективно.

Реализуя эти рекомендации, вы сможете работать с REST API и WordPress более эффективно, избегая типичных ошибок и проблем с многократными загрузками.

Оцените материал
Добавить комментарий

Капча загружается...