Проблема с загрузкой пользовательских файлов Soflyy WP All Import

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

Мне нужно отправить идентификатор пользователя на удалённый сервер, чтобы скачать XML файл. Я делаю это с помощью приведённого ниже кода:

function custom_file_download($url, $type="xml"){

    $ch = curl_init();

    $userData = array( 'user_id' => 'MY_USER_ID' );

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $userData);


    $result = curl_exec($ch);
    if (curl_errno($ch)) {
            exit('Ошибка:' . curl_error($ch));
    }
    curl_close ($ch);

    $uploads = wp_upload_dir();
    $filename = $uploads['basedir'] . "https://wordpress.stackexchange.com/" . strtok(basename($url), "?") . '.' . $type;

    if (file_exists($filename)){
            @unlink($filename);
    }
    file_put_contents($filename, $result);
    return str_replace($uploads['basedir'], $uploads['baseurl'], $filename);
}

Затем я использую опцию ‘Загрузить по URL’ с адресом

[custom_file_download("MY_REMOTE_URL", "xml")]

Это успешно скачивает файл в /wp-content/uploads. Однако WP-Import возвращает сообщение “Существует проблема с вашим файлом импорта. Пожалуйста, убедитесь, что URL возвращает допустимый файл импорта.”

Я могу вручную импортировать файл, используя опцию ‘загрузить файл’, без каких-либо проблем, что говорит о том, что с самим файлом всё в порядке. Но я не могу создать cron-задачу для выполнения ежедневного обновления, пока WP All Import не сможет распознать, что файл был успешно создан при использовании ‘Загрузить по URL’.

Было предложено, что расположение файла не возвращается в WP All Import корректно. Пожалуйста, может кто-то помочь с отладкой и/или выявлением ошибок в приведённом выше коде?

Возможно, место скачивания следует изменить на стандартное для WP All Import (/wp-content/uploads/wpallimport/uploads)?

Заранее спасибо

Вместо пользовательского HTTP-запроса cURL я бы рекомендовал использовать wp_remote_post() или
wp_remote_get(), которые внутри вызывают HTTP-запрос и обрабатывают все возможные ошибки.

Также используйте download_url() для загрузки файла и media_handle_sideload() для загрузки скачанного файла в директорию загрузок.

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

Проблема с загрузкой пользовательского файла в WP All Import: Дебаггинг и решения

Ваша ситуация с использованием WP All Import для загрузки XML файла через удаленный сервер требует тщательного анализа. Давайте разберем ваш код и предложим решение с использованием встроенных функций WordPress для повышения надежности и совместимости.

1. Анализ текущего кода

Вы используете функцию curl для отправки POST-запроса на удаленный сервер и получения XML-файла. Ваша функция custom_file_download имеет несколько важных этапов, однако вы сталкиваетесь с проблемой: WP All Import не распознает загружаемый файл, что приводит к ошибке, указывающей на проблемы с импортируемым файлом.

function custom_file_download($url, $type="xml") {
    $ch = curl_init();
    $userData = array('user_id' => 'MY_USER_ID');

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $userData);

    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        exit('Error:' . curl_error($ch));
    }
    curl_close($ch);

    $uploads = wp_upload_dir();
    $filename = $uploads['basedir'] . "/custom/" . strtok(basename($url), "?") . '.' . $type;

    if (file_exists($filename)) {
        @unlink($filename);
    }
    file_put_contents($filename, $result);
    return str_replace($uploads['basedir'], $uploads['baseurl'], $filename);
}

2. Проблемы в текущем подходе

  • Некорректный путь к файлу: Вы указываете путь /wp-content/uploads/..., что может не соответствовать требованиям WP All Import.
  • Использование curl: Хотя это работает, лучше использовать функции WordPress, так как они более устойчивы и интегрированы в ядро CMS.
  • Отсутствие обработки ошибок: Если файл не будет успешно записан, это может вызвать проблемы с импортом.

3. Рекомендованное решение

Для устранения вышеописанных проблем, рекомендую использовать функции wp_remote_post() и download_url(), которые упрощают процесс загрузки и помогают избежать ошибок. Вот модифицированный код:

function custom_file_download($url, $type="xml") {
    // Отправляем POST-запрос с использованием WP функции
    $userData = array('user_id' => 'MY_USER_ID');
    $response = wp_remote_post($url, array('body' => $userData));

    // Проверка на ошибки
    if (is_wp_error($response)) {
        return 'Error: ' . $response->get_error_message();
    }

    // Получаем содержимое файла
    $body = wp_remote_retrieve_body($response);
    if (empty($body)) {
        return 'Error: пустое содержание файла.';
    }

    // Создаем директорию для хранения файла
    $uploads = wp_upload_dir();
    $upload_dir = $uploads['basedir'] . '/wpallimport/uploads/';
    if (!file_exists($upload_dir)) {
        mkdir($upload_dir, 0755, true);
    }

    // Сохраняем файл
    $filename = $upload_dir . strtok(basename($url), "?") . '.' . $type;
    file_put_contents($filename, $body);

    // Возвращаем URL для WP All Import
    return $uploads['baseurl'] . '/wpallimport/uploads/' . basename($filename);
}

4. Как использовать данную функцию

Вы можете вызвать функцию custom_file_download следующим образом:

[custom_file_download("MY_REMOTE_URL", "xml")]

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

Заключение

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

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

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