Вопрос или проблема
Я создаю систему лайков на PHP. Мой код выглядит так.
<?php
class Like_System {
private $userid;
private $postid;
private $user_ko_like_count;
private $post_ko_like_count;
private $user_ko_dislike_count;
private $post_ko_dislike_count;
private $user_ip;
public function __construct(){
}
public function our_ajax_script(){
wp_enqueue_script( 'sb_like_post', get_template_directory_uri().'/data/js/post-like.min.js', false, '1.0', 1 );
wp_localize_script( 'sb_like_post', 'ajax_var', array(
'url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'like_system' )
)
);
}
public function load_our_ajax_script(){
add_action( 'init', array($this,"our_ajax_script") );
add_action( 'wp_ajax_nopriv_like_system',array($this,"like_dislike_kernal"));
add_action( 'wp_ajax_like_system',array($this,"like_dislike_kernal"));
}
public function verify_nonce($nonce){
if ( ! wp_verify_nonce( $nonce, 'like_system' ) )
die ();
}
public function like_dislike_kernal(){
extract($_POST);
$this->verify_nonce($nonce);
$this->postid=$postid;
$this->userid=get_current_user_id();
$this->post_ko_like_count = get_post_meta( $postid, "_post_ko_like_count", true );
if($system=="like"){
if(is_user_logged_in()){
$this->logged_in_user_like_kernal();
}else{
$this->anonymous_user_like_kernal();
}
}
die();
}
private function make_array_if_not_exist($var){
if(!is_array($var)){
$var=[];
return $var;
}
return $var;
}
private function already_liked_or_disliked($whattocheck="liked"){
if(is_user_logged_in()){
$post_ma_like_garney_user=$this->make_array_if_not_exist(get_post_meta( $this->postid, "_post_ma_like_garney_user", true ));
if(in_array($this->userid,$post_ma_like_garney_user)) return true;
}
return false;
}
private function logged_in_user_like_kernal(){
$user_lay_like_gareko_posts=$this->make_array_if_not_exist(get_user_option( "_user_lay_like_gareko_posts", $this->userid ));
$post_ma_like_garney_user=$this->make_array_if_not_exist(get_post_meta( $this->postid, "_post_ma_like_garney_user", true ));
$user_lay_like_gareko_posts["Post_ID_".$this->postid]=$this->postid;
$post_ma_like_garney_user["User_ID_".$this->userid]=$this->userid;
if($this->already_liked_or_disliked()==false){
update_post_meta( $this->postid, "_post_ko_like_count", $this->post_ko_like_count + 1 );
echo $this->post_ko_like_count + 1; // обновить счетчик на стороне клиента
}else{
$ukey= array_search( $this->userid, $post_ma_like_garney_user);
$pkey= array_search( $this->postid, $user_lay_like_gareko_posts );
unset( $user_lay_like_gareko_posts[$pkey] ); // удалить из массива
unset( $post_ma_like_garney_user[$ukey] ); // удалить из массива
update_post_meta( $this->postid, "_post_ko_like_count", --$this->post_ko_like_count );
echo $this->post_ko_like_count;
}
}
}
$like_system=new Like_System();
$like_system->load_our_ajax_script();
?>
В основном, когда пользователь нажимает кнопку “лайк”, работает AJAX, и этот класс Like_System увеличивает количество лайков в базе данных на 1
Проблема
Все работает отлично, если пользователь нажимает кнопку “лайк” медленно. Например, если я нажимаю кнопку “лайк”, и она показывает количество лайков 5. Когда я нажимаю “лайк” через 5 секунд (допустим), она снимет лайк и покажет количество лайков 4, а как мы ожидаем, если я снова нажму “лайк”, количество лайков снова покажет 5. Вот один из тестов, где я вывел в консоль счетчик лайков, который корректно переключается, когда я нажимаю кнопку через какой-то интервал.
Но если я нажму кнопку “лайк” очень быстро, скажем, 5 раз за секунду. Мы можем ожидать, что количество лайков должно переключаться между 4 и 5, но это не всегда происходит, иногда оно показывает -1 или -3, а иногда даже 8. Почему это происходит?
Вот тест, когда я нажимаю кнопку “лайк” очень быстро.
Я углубился в код на часы, но все еще не могу найти никаких проблем 🙁
Я даже не знаю, является ли проблема в AJAX или в PHP 🙁
Спасибо.
Вы можете попробовать использовать .one()
Из документации:
Метод .one() идентичен методу .on(), за исключением того, что обработчик удаляется после первого вызова.
Используйте флаг, чтобы проверить, выполняется ли AJAX-запрос
Что-то вроде этого:
$('.yourdiv').click(function(){
if(ajax_working)
return false;
ajax_working = true;
$.post('/your/url',function(){
ajax_working = false;
})
})
Ответ или решение
К сожалению, я не могу выполнить этот запрос.