Вопрос или проблема
У меня проблемы с этим кодом, в общем, он создает заявку на конкурс в totalcontest с загруженным изображением. Все работает хорошо, и заявка добавляется правильно, единственная проблема в том, что она отображается как анонимная вместо того, чтобы добавлять пользователя, который ее сделал.
Вот код
$('#totalcontest-upload-form').on('submit', function(event) {
event.preventDefault();
if (!cropper) {
$('#response').html('<p>Пожалуйста, выберите и обрежьте изображение перед отправкой.</p>');
return;
}
const canvas = cropper.getCroppedCanvas();
canvas.toBlob(function(blob) {
const formData = new FormData();
formData.append('totalcontest[image_copy]', blob, 'cropped-image.png');
formData.append('totalcontest[author_id]', authorId);
$.ajax({
url: 'https://domain.com/wp-json/totalcontest/v2/contest/43434/participate',
method: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(data) {
if (data && data.code === 200) {
$('#response').html('<p>Загрузка изображения прошла успешно.</p>');
} else {
$('#response').html('<p>Ошибка: ' + (data.message || 'Ошибка ответа API.') + '</p>');
}
},
error: function(jqXHR, textStatus, errorThrown) {
$('#response').html('<p>Ошибка: ' + errorThrown + '</p>');
}
});
});
А вот и функция action в functions.php
function handle_submission_image_upload() {
if (isset($_FILES['submission_image']) && !empty($_FILES['submission_image']['name'])) {
$uploaded_file = $_FILES['submission_image'];
$upload = wp_handle_upload($uploaded_file, array('test_form' => false));
$current_user_id = get_current_user_id();
if (isset($upload['file'])) {
$attachment = array(
'post_mime_type' => $upload['type'],
'post_title' => sanitize_file_name($uploaded_file['name']),
'post_content' => '',
'post_author' => $current_user_id,
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment($attachment, $upload['file']);
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata($attach_id, $upload['file']);
wp_update_attachment_metadata($attach_id, $attach_data);
$current_user_id = get_current_user_id();
if ($current_user_id === 0) {
wp_send_json_error(array('message' => 'Пользователь не вошел в систему.'));
wp_die();
}
if (!current_user_can('publish_posts')) {
wp_send_json_error(array('message' => 'У пользователя нет прав на создание постов.'));
wp_die();
}
$post_id = wp_insert_post(array(
'post_title' => 'Новая заявка',
'post_type' => 'submissions',
'post_status' => 'publish',
'post_author' => $current_user_id,
'meta_input' => array(
'imagen' => wp_get_attachment_url($attach_id)
)
));
if (!is_wp_error($post_id)) {
wp_send_json_success(array(
'message' => 'Пост был создан и изображение загружено успешно.',
'post_author' => $current_user_id,
));
} else {
wp_send_json_error(array('message' => 'Не удалось создать пост.'));
}
} else {
wp_send_json_error(array('message' => 'Не удалось загрузить файл.'));
}
} else {
wp_send_json_error(array('message' => 'Не был загружен ни один файл.'));
}
wp_die();
}
add_action('wp_ajax_handle_submission_image_upload', 'handle_submission_image_upload');
Я заметил, что отправка постов все равно работает хорошо, даже если я удаляю функцию из functions.php, что значит, что я что-то сделал неправильно или не правильно их связываю, я думаю.
Причина, по которой я использую это вместо стандартной отправки totalcontest, заключается в том, чтобы добавить обрезку изображения при загрузке изображения.
Ответ или решение
Конечно! Давайте разберём вашу проблему с отправкой данных через Ajax для плагина TotalContest и последующим присвоением автора посту, который создаётся на сервере.
Основная проблема
Вы столкнулись с тем, что при создании поста о конкурсе через Ajax, автор поста устанавливается на "аноним", даже если в коде указывается идентификатор текущего пользователя. Это может быть связано с тем, как вы передаете данные и с тем, как обрабатываются эти данные на сервере.
Расшифровка кода
В вашем коде происходит следующее:
- При отправке формы вы создаёте объект
FormData
, в который добавляете изображение и идентификатор автора (authorId
). - Вы отправляете Ajax-запрос на сервер с использованием URL-адреса API TotalContest, который, похоже, не связан с функцией
handle_submission_image_upload
в вашемfunctions.php
.
Проблема в функции handle_submission_image_upload
Из представленного кода видно, что вы используете переменную $_FILES['submission_image']
, но в вашем JavaScript-коде вы загружаете изображение под ключом 'totalcontest[image_copy]'
. Поэтому на сервере этот массив не содержит загруженного изображения. Кроме того, идентификатор автора не передается в вашу функцию.
Решение
-
Измените ключ загружаемого файла для соответствия с вашим кодом:
Замените$_FILES['submission_image']
на$_FILES['totalcontest']['name']['image_copy']
и соответствующим образом получите файл. -
Добавьте авторский идентификатор в
$_POST
на сервере:
Передайте также из вашего Ajax-кодаauthorId
, чтобы его можно было использовать в функции.
Давайте перепишем переменную handle_submission_image_upload
с учётом вышеуказанных изменений:
function handle_submission_image_upload() {
if (isset($_FILES['totalcontest']['name']['image_copy']) && !empty($_FILES['totalcontest']['name']['image_copy'])) {
$uploaded_file = $_FILES['totalcontest']['name']['image_copy']; // Заменено
$upload = wp_handle_upload($uploaded_file, array('test_form' => false));
$current_user_id = get_current_user_id();
if ($current_user_id === 0) {
wp_send_json_error(array('message' => 'User is not logged in.'));
wp_die();
}
$attachment = array(
'post_mime_type' => $upload['type'],
'post_title' => sanitize_file_name($uploaded_file['name']),
'post_content' => '',
'post_author' => $current_user_id,
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment($attachment, $upload['file']);
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata($attach_id, $upload['file']);
wp_update_attachment_metadata($attach_id, $attach_data);
if (!current_user_can('publish_posts')) {
wp_send_json_error(array('message' => 'User does not have permission to create posts.'));
wp_die();
}
$post_id = wp_insert_post(array(
'post_title' => 'New Submission',
'post_type' => 'submissions',
'post_status' => 'publish',
'post_author' => $current_user_id,
'meta_input' => array(
'imagen' => wp_get_attachment_url($attach_id)
)
));
if (!is_wp_error($post_id)) {
wp_send_json_success(array(
'message' => 'Post created and image uploaded successfully.',
'post_author' => $current_user_id,
));
} else {
wp_send_json_error(array('message' => 'Failed to create post.'));
}
} else {
wp_send_json_error(array('message' => 'No file was uploaded.'));
}
wp_die();
}
add_action('wp_ajax_handle_submission_image_upload', 'handle_submission_image_upload');
Вызов функции через Ajax
Убедитесь, что ваш Ajax-вызов включает правильный URL для вызова handle_submission_image_upload
и вызывает его через wp_ajax_
в WordPress. Обновите URL в Ajax-запросе:
url: 'https://domain.com/wp-admin/admin-ajax.php?action=handle_submission_image_upload',
Резюме
- Убедитесь, что в вашем JavaScript-коде вы передаете правильные ключи данных в
FormData
. - В
handle_submission_image_upload
используйте правильные проверки для получения загруженного файла. - Передайте идентификатор пользователя на сервер через
get_current_user_id()
.
После реализации этих изменений ваши посты должны корректно создаваться с указанием авторa. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!