PHP Fatal error: Вызов неопределенной функции download_url()

20 мая 2011 г., 17:33:40
Просмотры: 14.1K
Голосов: 5

Сначала полный текст ошибки:

PHP Fatal error:  Call to undefined function download_url() in /path/to/wordpress/wp-admin/includes/media.php on line 562

Внизу вопроса я также привел связанные функции.

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

Функция (media_sideload_image()), которая вызывает download_url и приводит к ошибке:

PHP Fatal error:  Call to undefined function download_url() in /path/to/wordpress/wp-admin/includes/media.php on line 562

Как видно, я успешно подключил media.php - остальная часть моего скрипта уже реализована на сайте, и у меня не было других проблем с доступом к файлам WordPress. Ошибка, похоже, связана с самим media.php - что кажется мне странным.

Есть идеи, как решить эту проблему? Альтернативно, если вы знаете другую функцию, которую я могу использовать для этого, это тоже будет полезно.

Если вам нужны дополнительные детали о проблеме - просто спросите.

/**
 * Загружает изображение по указанному URL и прикрепляет его к записи.
 *
 * @since 2.6.0
 *
 * @param string $file URL изображения для загрузки
 * @param int $post_id ID записи, к которой будет прикреплено изображение
 * @param string $desc Опционально. Описание изображения
 * @return string|WP_Error HTML-тег img при успехе или объект ошибки
 */
function media_sideload_image($file, $post_id, $desc = null) {
    if ( ! empty($file) ) {
        // Загрузка файла во временное местоположение
        $tmp = download_url( $file );

        // Установка переменных для хранения
        // исправление имени файла для query-строк
        preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
        $file_array['name'] = basename($matches[0]);
        $file_array['tmp_name'] = $tmp;

        // Если ошибка при временном сохранении, удаляем
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // выполняем проверку и сохранение
        $id = media_handle_sideload( $file_array, $post_id, $desc );
        // Если ошибка при постоянном сохранении, удаляем
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
            return $id;
        }

        $src = wp_get_attachment_url( $id );
    }

    // Проверяем, что файл сохранен, и возвращаем html
    if ( ! empty($src) ) {
        $alt = isset($desc) ? esc_attr($desc) : '';
        $html = "<img src='$src' alt='$alt' />";
        return $html;
    }
}

Функция, где я вызываю media_sideload_image() в своем коде:

// Загружаем изображение, если оно существует, и возвращаем post_id
function upload_image($post_id, $image_url) {
    require_once('wp-admin/includes/media.php');
    $image_url = 'http://admin.gkbusiness.com/gkbusiness/files/2011/04/LOGOGKMBUS1.jpg';
    media_sideload_image($image_url, $post_id);
    return $post_id;
}
0
Все ответы на вопрос 3
0

Вам также необходимо подключить файл /path/to/wordpress/wp-admin/includes/file.php, так как media.php использует функцию download_url() из этого файла.

20 мая 2011 г. 17:39:05
0

Как насчет этого:

/**
 * Прикрепляет изображение по URL к записи
 * 
 * @param string $file URL изображения
 * @param int $post_id ID записи
 * @param string|null $desc Описание изображения
 */
function attach_image_url($file, $post_id, $desc = null) {
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');
    if ( ! empty($file) ) {
        // Загружаем файл во временное расположение
        $tmp = download_url( $file );
        // Устанавливаем переменные для хранения
        // исправляем имя файла для query strings
        preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
        $file_array['name'] = basename($matches[0]);
        $file_array['tmp_name'] = $tmp;
        // Если ошибка временного сохранения - удаляем
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }
        // выполняем валидацию и сохранение
        $id = media_handle_sideload( $file_array, $post_id, $desc );
        // Если ошибка постоянного сохранения - удаляем
        if ( is_wp_error($id) ) {@unlink($file_array['tmp_name']);}
        // Добавляем метаданные миниатюры
        add_post_meta($post_id, '_thumbnail_id', $id, true);
    }
}
7 мар. 2012 г. 17:28:47
1

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

Таким образом, в начале вашего "внешнего" скрипта, который должен использовать функциональность WordPress, подключите wp-load.php для фронтенд-функций и admin.php для бэкенд/административных функций:

require_once ('wp-load.php');
require_once ('wp-admin/includes/admin.php');

Это предполагает, что ваш скрипт находится на корневом уровне WordPress. Если это не так, вам нужно будет адаптировать пути.

5 сент. 2016 г. 17:21:02
Комментарии

include(ABSPATH . "wp-admin/includes/admin.php"); сэкономило кучу времени в сравнении с поиском всех необходимых файлов. Просто оберните это в блок if (!is_admin()) внутри вашей функции, и всё готово.

Kaji Kaji
9 мая 2017 г. 09:08:32