Не получается отправить отзыв с фронтенд на сайт 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 шт):

Автор решения: Simon

Проблема в том что Ваш скрипт находится над формой, submit событие которой он должен обработать. Следственно когда скрипт заиничен, такого элемента как $('#add_review') еще не существует. Поменяйте местами обработчик события и форму, а еще лучше, разместите скрипт в подвале сайта, где-то перед закрывающим тегом body.

→ Ссылка