Пробую сделать плагин
Не получается сделать обновление после голосования.
Когда голосуешь копки пропадают но "Вы голосовали" не появляется пока не обновишь страницу, да и вовсе отображение шоткодов тоже не обновляется данные
Я так понял нужно использовать 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);
}
});
});
});