Требуется специалист Jacascript/PHP исправить функцию.

Александр15 лет в сервисе
Данные заказчика будут вам доступны после подачи заявки
20.12.2016

WP. Реализована функция добавления поста в "избранное" пользователя. На странице поста размещена ссылка "удалить/добавить" которая добавляет или удаляет этот пост из "избранного пользователя" (избранное выводится на отдельной странице). Баг заключается в том что, если находясь на странице поста, уже добавленного в избранное, кликнуть быстро два или больше раз по ссылке "удалить", то из избранного удалиться не только этот пост но и один или несколько других добавленных в избранное ранее.  Таким образом, находясь на странице любого поста, беспрерывно кликая по ссылке добавить/удалить можно в итоге очистить все избранное, чего происходить не должно.

Еще раз, на практике это происходит так:

находясь на странице поста кликаем ссылку "добавить в избранное" (пост добавляется в избранное, ссылка "добавить в избранное" меняется на ссылку "удалить из избранного"). Кликаем на ссылку "удалить из избранного" (пост удаляется из избранного, ссылка "удалить из избранного" меняется на ссылку "добавить в избранное").

Все хорошо, Но! Если кликнуть на ссылку "удалить" два раза (быстро), то из избранного удалится этот пост и плюс еще один последний добавленный в избранное.  Или если просто быстро кликать по ссылке много раз то избранное быстро очистится.

А должно быть так:

находясь на странице поста при многократных кликах по ссылке добавить/удалить, в независимости от скорости кликания, должна происходить строгая очередность обработки запроса: добавился, удалился, добавился, удалился...  и именно только этот пост, на котором находимся.

Страница поста:

 

            $userFavList = explode(",", $userFavList);

     $addListEl = ' style="display:none"';

     $removeListEl = ' style="display:none"';

            if(in_array($post->ID, $userFavList)) {

                $removeListEl = ' style="display:inline-block"';

  $addClass = ' class="added"';

            }

     else{

         $addListEl = ' style="display:inline-block"';

            }

             ?>

 >>Удалить из избранного>Добавить в избранное

Файл script.js:

function addToMyFavorite(userId,filmId, el){

            var thisEl = jQuery(el);

            var actn = 'add';

            if(thisEl.hasClass('added')){

                actn = 'removed';

            }

            jQuery.ajax({

                url: addToFavoriteParth + "/addons/favorite.php",

                data: 'userID=' + userId + '&filmID=' + filmId + '&action=' + actn,

                success: function(data){

      var flItem = thisEl.parent('.post');

                    if(data == 'added'){

   showLink(thisEl, 'add');

                        //thisEl.addClass('added');

                    }

                    if(data == 'removed'){

                        //thisEl.removeClass('added');

   if(thisEl.hasClass('favListItem')){    

    flItem.animate({opacity: 0},300,function(){jQuery(this).hide()});

    }

    showLink(thisEl, 'remove');

   }

   if(data == 'empty'){

                         //thisEl.removeClass('added');

    flItem.animate({opacity: 0},300,function(){jQuery(this).hide().after('Ничего нет в избранном')});

    showLink(thisEl, 'remove');

    }

   }

  });

 }

function showLink(el, arg){

  var duration = 300;

  var linkText = jQuery('.' + arg, el);

  var hiddenLink = jQuery('span:hidden', el);

  if(linkText.is(':visible')) {

   linkText.fadeOut(duration, function(){

    if(arg == 'add'){

     el.addClass('added'); 

    }

    else{

     el.removeClass('added'); 

    }

    hiddenLink.fadeIn(duration)

   })

  }

 }

Файл favorite.php:

include_once($_SERVER['DOCUMENT_ROOT'].'/wp-config.php');

global $wpdb;

$user_id = $_GET["userID"];

$film_id = $_GET["filmID"];

$actn = $_GET["action"];

$chckClose = $_GET["chk"];

$favList = get_usermeta($user_id, 'favorite_film');

if($chckClose == true){

if(!$favList) echo 'empty';

}

if($favList) {

$favList = explode(",", $favList);

        if($actn == 'add') {

            if(!in_array($film_id ,$favList)) {

                array_unshift($favList, $film_id);

                echo 'added';

}

        }

        elseif($actn == 'removed'){            

$removeFav = array_search($film_id, $favList);

            unset( $favList[$removeFav]);

if($favList){

echo 'removed';

}

else{

echo 'empty';

}

        }

        $newFavList = implode(",", $favList);

        update_usermeta( $user_id, 'favorite_film', $newFavList );

}

else{

update_usermeta( $user_id, 'favorite_film', $film_id );

echo 'added';

}

?>

Сайт на локале, поэтому продемонстрировать наглядно, к сожалению, не могу. Жду предложений.

Заявки фрилансеров