Вопрос или проблема
У меня проблема со ссылкой для загрузки, URL дублируется. Например, так http://localhost/test/files/http://localhost/test/files/2016/05/testonly.docx
То же самое на живом сайте: http://www.homecredit.ph/wp-content/uploads/home1/homecre1/public_html/files/News-26.jpg, URL испорчен
Как это исправить? Я не добавлял ничего в .htaccess
.htaccess:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /test/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /test/index.php [L]
</IfModule>
# END WordPress
Вот код для ссылки на загрузку:
functions.php
function upload_user_file($file = array()){
require_once(ABSPATH . 'wp-admin/includes/admin.php');
$file_return = wp_handle_upload($file, array('test_form' => false));
if(isset($file_return['error']) || isset($file_return['upload_error_handler'])){
return false;
} else {
$filename = $file_return['file'];
$attachment = array(
'post_mime_type' => $file_return['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
'post_content' => '',
'post_status' => 'inherit',
'guid' => $file_return['url']
);
$attachment_id = wp_insert_attachment($attachment, $file_return['url']);
require_once(ABSPATH . 'wp-admin/includes/file.php');
$attachment_data = wp_generate_attachment_metadata($attachment_id, $filename);
wp_update_attachment_metadata($attachment_id, $attachment_data);
if(0 < intval($attachment_id)){
return $attachment_id;
}
}
return false;
}
Шаблон пользовательской страницы
echo '<td id="resumeFile'.$optionId.'"><a href="https://wordpress.stackexchange.com/questions/227257/. wp_upload_dir($record_s->attachment_resume_id) .">Скачать резюме</a></td>';
Я только что проверил ваш URL http://www.homecredit.ph/wp-content/uploads/home1/homecre1/public_html/files/News-26.jpg и код и заметил, что вы сохраняете изображение по пути http://www.homecredit.ph/files/News-26.jpg, но пытаетесь получить доступ из папки загрузок WordPress. /home1/homecre1/public_html/files/News-26.jpg – это путь, сохраненный в базе данных для вашего идентификатора вложения. /home1/homecre1/public_html/ – это ваш корневой каталог, где установлен WordPress. Поэтому лучше сохранить только имя файла в базе данных или удалить корневой путь из значения базы данных и присоединить его к URL сайта. Например:
$filePath = str_replace('/home1/homecre1/public_html', '', $record_s->attachment_resume_id);
echo '<td id="resumeFile'.$optionId.'"><a href="https://wordpress.stackexchange.com/questions/227257/. $filePath .">Скачать резюме</a></td>';
Это всего лишь пример. Вам не следует жестко кодировать путь в функции str_replace. Вам нужно использовать PHP функцию для получения корневого пути и разместить его в функции. Сначала попробуйте с приведенным выше кодом. Если это сработает, тогда продолжайте с вышеописанным шагом.
Ответ или решение
Вам необходимо устранить проблему с дублированием базового URL в ваших ссылках, которая возникает из-за неправильного формирования ссылок в коде WordPress. Давайте разберёмся, как это можно исправить.
Шаг 1: Понимание проблемы
Вы указали, что ссылки дублируются. Например, вы получаете URL вида:
http://localhost/test/files/http://localhost/test/files/2016/05/testonly.docx
или
http://www.homecredit.ph/wp-content/uploads/home1/homecre1/public_html/files/News-26.jpg
Это происходит, когда вы сохраняете полный путь к файлу в базе данных, а затем пытаетесь его получить и соединяете с базовым URL, что приводит к добавлению его дважды.
Шаг 2: Исправление кода для загрузки файла
Ваша функция загрузки файла сохранит полный URL (включая корневой путь). Необходимо сохранить только относительный путь к файлу или файл без полного пути. Внесите следующие изменения в вашу функцию upload_user_file
:
function upload_user_file($file = array()){
require_once(ABSPATH . 'wp-admin/includes/admin.php');
$file_return = wp_handle_upload($file, array('test_form' => false));
if (isset($file_return['error']) || isset($file_return['upload_error_handler'])) {
return false;
} else {
$filename = $file_return['file'];
$attachment = array(
'post_mime_type' => $file_return['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
'post_content' => '',
'post_status' => 'inherit',
'guid' => $file_return['url'] // Оставьте этот URL без изменений
);
$attachment_id = wp_insert_attachment($attachment, $file_return['url']);
require_once(ABSPATH . 'wp-admin/includes/file.php');
$attachment_data = wp_generate_attachment_metadata($attachment_id, $filename);
wp_update_attachment_metadata($attachment_id, $attachment_data);
return $attachment_id > 0 ? $attachment_id : false;
}
}
Шаг 3: Исправление кода шаблона страницы
Теперь вам нужно изменить, как вы генерируете ссылки на этот файл в вашем шаблоне. Вместо жесткой привязки к пути, используйте функцию wp_upload_dir()
для получения актуального пути:
$filePath = str_replace('/home1/homecre1/public_html', '', $record_s->attachment_resume_id);
echo '<td id="resumeFile' . $optionId . '"><a href="' . wp_upload_dir()['baseurl'] . $filePath . '">Download Resume</a></td>';
Заключение
Эти изменения позволят вам избежать дублирования базового URL и привести к правильному формированию ссылок на загруженные файлы. Убедитесь, что вы протестировали все изменения и проверьте, чтобы все ссылки были корректными.
Если после этих шагов проблема не решится, то рекомендуется дополнительно проверять, как данные сохраняются в базе данных, и при необходимости очищать их от лишней информации.