Пробую сделать плагин

Не получается сделать обновление после голосования.
Когда голосуешь копки пропадают но "Вы голосовали" не появляется пока не обновишь страницу, да и вовсе отображение шоткодов тоже не обновляется данные

Я так понял нужно использовать ajax. Как только не делаю не пойму как сделать.

// 1.1 Регистрация шорткода
function article_rating_shortcode($atts) {
	global $post, $wpdb;
	$post_id = $post->ID;
	$user_ip = $_SERVER['REMOTE_ADDR'];

	// Проверяем, голосовал ли пользователь ранее
	$existing_vote = $wpdb->get_row($wpdb->prepare("SELECT * FROM pf_article_ratings WHERE post_id = %d AND user_ip = %s", $post_id, $user_ip));

	// Получаем текущий рейтинг
	$ratings = $wpdb->get_results($wpdb->prepare("SELECT SUM(rating) as total_rating FROM pf_article_ratings WHERE post_id = %d", $post_id));
	$current_rating = $ratings[0]->total_rating ? $ratings[0]->total_rating : 0;

	// Если пользователь не голосовал, показываем кнопки
	if (!$existing_vote) {
		$output .= '<button class="rate-up" data-postid="' . esc_attr($post_id) . '"> <i class="fa fa-thumbs-o-up color-pf-green"></i> </button>  ';
		$output .= '<button class="rate-down" data-postid="' . esc_attr($post_id) . '"> <i class="fa fa-thumbs-o-down"></i> </button>  ';
	} else {
		// Если пользователь уже голосовал, ничего не показываем
		$output = '<span data-tooltip="Вы голосовали"><i class="fa fa-star colorfiolet"></i> </span>'; // Не отображаем ничего здесь
	}
	// Отображаем текущий рейтинг
	$output .= '';

	return $output;
}
add_shortcode('article_rating', 'article_rating_shortcode');

// 1.2 Шорткод голосования: php echo do_shortcode( '[article_rating]' );
 function enqueue_rating_scripts() {
	 $plugin_url = plugin_dir_url(__FILE__); // __FILE__ указывает на текущий файл
	 wp_enqueue_script('ajax-rating', $plugin_url . '/ajax-rating.js', array('jquery'), null, true);  // Подключаем скрипт
	 wp_localize_script('ajax-rating', 'ajax_rating', array('ajax_url' => admin_url('admin-ajax.php'))); // Локализуем скрипт
 }
 add_action('wp_enqueue_scripts', 'enqueue_rating_scripts');

 function create_rating_table() {
	 global $wpdb; $table_name = $wpdb->prefix . 'article_ratings';$charset_collate = $wpdb->get_charset_collate();
	 $sql = "CREATE TABLE IF NOT EXISTS $table_name (id INT NOT NULL AUTO_INCREMENT,post_id INT NOT NULL,user_ip VARCHAR(45) NOT NULL,rating INT NOT NULL,PRIMARY KEY (id),UNIQUE KEY unique_rating (post_id, user_ip)) $charset_collate;"; // SQL-запрос для создания таблицы
	 require_once(ABSPATH . 'wp-admin/includes/upgrade.php');dbDelta($sql); // Выполняем запрос
 }

 // Шорткод для отображение рейтинга php echo do_shortcode( '[display_article_rating]' );
function display_article_rating_shortcode($atts) { global $wpdb; global $post; $post_id = $post->ID;
   // Получаем текущий рейтинг из базы данных
   $ratings = $wpdb->get_results($wpdb->prepare("SELECT SUM(rating) as total_rating FROM pf_article_ratings WHERE post_id = %d", $post_id)); $current_rating = $ratings[0]->total_rating ? $ratings[0]->total_rating : 0;
   // Формируем HTML для отображения рейтинга
   $output .= '<span data-tooltip="Рейтинг"><i class="fa fa-star colorfiolet"></i>  ' . esc_html($current_rating) . '</span>';
   return $output;
}
add_shortcode('display_article_rating', 'display_article_rating_shortcode');

// 1.3 Пучение рейтинга
 function handle_rating() {
	 global $wpdb; $post_id = intval($_POST['post_id']); $user_ip = $_SERVER['REMOTE_ADDR'];$rating = intval($_POST['rating']);

	 // Проверяем, голосовал ли пользователь ранее
	 $existing_vote = $wpdb->get_row($wpdb->prepare("SELECT * FROM pf_article_ratings WHERE post_id = %d AND user_ip = %s", $post_id, $user_ip));

	 if ($existing_vote) {
		 wp_send_json_error('Вы голосовали!');
	 } else {
		 // Вставляем новый рейтинг
		 $wpdb->insert('pf_article_ratings', array( 'post_id' => $post_id, 'user_ip' => $user_ip, 'rating' => $rating));

		 // Получаем новый общий рейтинг
		 $ratings = $wpdb->get_results("SELECT SUM(rating) as total_rating FROM pf_article_ratings WHERE post_id = $post_id");
		 $current_rating = $ratings[0]->total_rating ? $ratings[0]->total_rating : 0; wp_send_json_success($current_rating);
	 }
 }
 add_action('wp_ajax_rate_article', 'handle_rating'); add_action('wp_ajax_nopriv_rate_article', 'handle_rating');
jQuery(document).ready(function($) {
	$('.rate-up, .rate-down').click(function() {
		var postId = $(this).data('postid');
		var rating = $(this).hasClass('rate-up') ? 1 : -1; // Определяем, какой рейтинг отправить

		$.post(ajax_rating.ajax_url, {
			action: 'rate_article',
			post_id: postId,
			rating: rating
		}, function(response) {
			if (response.success) {
				// Обновляем отображение рейтинга
				$('.current-rating[data-postid="' + postId + '"]').text('Рейтинг: ' + response.data);

				// Убираем кнопки голосования
				$('.rate-up[data-postid="' + postId + '"], .rate-down[data-postid="' + postId + '"]').hide();

				// Показываем сообщение о том, что пользователь уже проголосовал
				$('.current-rating[data-postid="' + postId + '"]').after('<span data-tooltip="Вы голосовали"><i class="fa fa-star colorfiolet"></i></span>');
			} else {
				alert(response.data);
			}
		});
	});
});