Использование Ajax для создания отправок в TotalContest, проблема с назначением автора поста.

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

У меня проблемы с этим кодом, в общем, он создает заявку на конкурс в 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, автор поста устанавливается на "аноним", даже если в коде указывается идентификатор текущего пользователя. Это может быть связано с тем, как вы передаете данные и с тем, как обрабатываются эти данные на сервере.

Расшифровка кода

В вашем коде происходит следующее:

  1. При отправке формы вы создаёте объект FormData, в который добавляете изображение и идентификатор автора (authorId).
  2. Вы отправляете Ajax-запрос на сервер с использованием URL-адреса API TotalContest, который, похоже, не связан с функцией handle_submission_image_upload в вашем functions.php.

Проблема в функции handle_submission_image_upload

Из представленного кода видно, что вы используете переменную $_FILES['submission_image'], но в вашем JavaScript-коде вы загружаете изображение под ключом 'totalcontest[image_copy]'. Поэтому на сервере этот массив не содержит загруженного изображения. Кроме того, идентификатор автора не передается в вашу функцию.

Решение

  1. Измените ключ загружаемого файла для соответствия с вашим кодом:
    Замените $_FILES['submission_image'] на $_FILES['totalcontest']['name']['image_copy'] и соответствующим образом получите файл.

  2. Добавьте авторский идентификатор в $_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',

Резюме

  1. Убедитесь, что в вашем JavaScript-коде вы передаете правильные ключи данных в FormData.
  2. В handle_submission_image_upload используйте правильные проверки для получения загруженного файла.
  3. Передайте идентификатор пользователя на сервер через get_current_user_id().

После реализации этих изменений ваши посты должны корректно создаваться с указанием авторa. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!

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

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