Вопрос или проблема
Мне нужно отправить идентификатор пользователя на удалённый сервер, чтобы скачать 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, вы обеспечите более высокую стабильность и уменьшите вероятность ошибок. Если возникают дополнительные проблемы или у вас есть вопросы, не стесняйтесь обращаться за помощью. Это поможет вам создать надежный механизм автоматической загрузки и импорта данных с удаленных серверов.