Не получается отправить отзыв с фронтенд на сайт wordpress
Подскажите в чем проблема? Пытаюсь сделать форму отправки отзыва через фронтенд на wordpress. После нажатия кнопки отправить страница просто перезагружается без всяких уведомлений и отзыв соответственно в базу не попадает. Что уже сделал:
1.Создал на сайте кастомный тип записей reviews:
add_action( 'init', 'register_post_type_reviews' );
function register_post_type_reviews(){
$labels = array(
'name' => _x( 'Отзывы', 'post type general name' ),
'singular_name' => _x( 'Отзывы', 'post type singular name' ),
'menu_name' => _x( 'Отзывы', 'admin menu' ),
'name_admin_bar' => _x( 'Отзывы', 'add new on admin bar' ),
'add_new' => _x( 'Добавить отзыв', 'mbds_products' ),
'add_new_item' => __( 'Добавить новый отзыв' ),
'new_item' => __( 'Новый отзыв' ),
'edit_item' => __( 'Редактировать отзыв' ),
'view_item' => __( 'Показать отзыв' ),
'all_items' => __( 'Все отзывы' ),
'search_items' => __( 'Найти отзыв' ),
'not_found' => __( 'Отзыв не найден' ),
'not_found_in_trash' => __( 'Нет отзывов в корзине' )
);
$args = array(
'labels' => $labels,
'description' => __( 'Отзывы.' ),
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => true,
'menu_position' => 8,
'menu_icon' => 'dashicons-format-status',
'supports' => array( 'title', 'thumbnail', 'editor', 'custom-fields' ),
// добавит поддержку меток к custom post type
'taxonomies' => array('post_tag')
);
register_post_type( 'reviews', $args );
}
Создал произвольные поля для этого типа записей:otziv_minusi, otziv_plusi, otziv_name, otziv_ocenka, otziv_avatar
2.Сделал форму для отправки:
<form id="add_review" enctype="multipart/form-data">
<input type="text" name="imya" placeholder="Имя">
<input type="text" name="title" placeholder="Заголовок">
<input type="text" name="plusi" placeholder="Плюсы">
<input type="text" name="minusi" placeholder="Минусы">
<input type="file" name="review_image">
<?php wp_editor( '', 'reviews', array('teeny'=>false, 'textarea_name' => 'message', 'media_buttons'=>true, 'quicktags'=> 0, 'tinymce' => array(
'toolbar1' => 'formatselect, bold, italic, strikethrough, bullist, numlist, blockquote, undo, redo, fullscreen', 'toolbar2'=>false ),) ); ?>
<select name="tag">
<option value="Тег1" selected>Тег1</option>
<option value="Тег2">Тег2</option>
<option value="Тег3">Тег3</option>
</select>
<div class="rating__group">
<input class="rating__star" type="radio" name="rating" value="1" aria-label="Ужасно">
<input class="rating__star" type="radio" name="rating" value="2" aria-label="Сносно">
<input class="rating__star" type="radio" name="rating" value="3" aria-label="Нормально">
<input class="rating__star" type="radio" name="rating" value="4" aria-label="Хорошо">
<input class="rating__star" type="radio" name="rating" value="5" aria-label="Отлично" checked>
</div>
<input type="submit" value="Отправить">
</form>
3.Js обработчик формы:
<script>
$('#add_review').submit(function (e) {
e.preventDefault();
$.ajax({
type: 'POST',
url: '/wp-content/themes/default/handler.php',
dataType: "JSON",
data: new FormData(this),
processData: false,
contentType: false,
success: () => {
console.log('Спасибо. Ваш отзыв отправлен.');
$(this).trigger('reset'); // очищаем поля формы
},
error: () => console.log('Ошибка отправки.')
});
});
</script>
4.Обработчик на сервере handler.php:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Подключаем необходимые файлы
require_once( $_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
// Получение отправленных данных
$user_imya = trim($_POST['imya']);
$user_zagolovok = trim($_POST['zagolovok']);
$user_plusi = trim($_POST['plusi']);
$user_minusi = trim($_POST['minusi']);
$user_message = trim($_POST['message']);
$user_rating = trim($_POST['rating']);
$user_tag = trim($_POST['tag']);
$post_data = array(
'post_author' => 1,
'post_status' => 'pending', # статус - «На утверждении»
'post_type' => 'reviews', # тип записи - «Отзывы»
'post_title' => $user_zagolovok, # заголовок отзыва
'post_content' => $user_message,
'tags_input' => $user_tag,
);
// Вставляем запись в базу данных
$post_id = wp_insert_post( $post_data );
// Добавляем остальные поля
update_field( 'otziv_ocenka', $user_rating, $post_id );
update_field( 'otziv_name', $user_imya, $post_id );
update_field( 'otziv_minusi', $user_minusi, $post_id );
update_field( 'otziv_plusi', $user_plusi, $post_id );
// Загрузка изображения
if (isset($_FILES)) {
$attachment_id = media_handle_upload('review_image', $post_id); # загрузка в медиафайлы
update_field('otziv_avatar', $attachment_id, $post_id); # обновление/добавление в БД
if (is_wp_error($attachment_id)) {
echo "Ошибка загрузки медиафайла.";
} else {
echo "Медиафайл был успешно загружен!";
}
}
Ответы (1 шт):
Проблема в том что Ваш скрипт находится над формой, submit событие которой он должен обработать. Следственно когда скрипт заиничен, такого элемента как $('#add_review') еще не существует. Поменяйте местами обработчик события и форму, а еще лучше, разместите скрипт в подвале сайта, где-то перед закрывающим тегом body.