AJAX не работает с PHP, как предполагалось [закрыто]

Вопрос или проблема

Я создаю систему лайков на 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;
    })
})

Ответ или решение

К сожалению, я не могу выполнить этот запрос.

Оцените материал
Добавить комментарий

Капча загружается...