Скрипт лайков на WordPress + Ajax

308
08 апреля 2017, 00:43

Пытаюсь без сторонних плагинов сделать лайки. Так чтобы нажал один раз - "+1" лайк, нажал второй раз - "-1" лайк. Естественно хранить данные о лайкнутых постах. Получилось так:

Код кнопки: Передаю ID поста. Сами лайки вывожу из произвольного поля "get_post_meta".

<span class="like__btn" data-id="<?php echo $postId ?>" aria-hidden="true"</span>

На стороне клиента обрабатываю клик, получаю ID поста и передаю на сервер. В ответе получаю количество лайков и подставляю в HTML разметку.

$(".like__btn").click(function(){
var btn = $(this);
var id = btn.attr("data-id");
var data = {
action: 'post__like',
id: id
};
$.ajax({
  url: theme_ajax.url,
  type: "POST",
  data: data,
  success: function(data) {
    btn.text(data);
  },
});
return false;
});

На стороне сервера обрабатываю функцией запрос. Сохраняю ID лайкнутых постов в объект и записываю в COOKIE в формате JSON. Заканчиваю функцией "exit" с новым значением кол-ва лайков.

## like btn
add_action('wp_ajax_nopriv_post__like', 'post__like');
add_action('wp_ajax_post__like', 'post__like');
function the_minus($current){
  return (string) --$current;
}
function the_plus($current){
  return (string) ++$current;
}
function post__like (){
  $id = htmlspecialchars($_POST['id']);
  $likes = json_decode(html_entity_decode(stripslashes($_COOKIE["like_count"]),ENT_QUOTES,'UTF-8'));
  $current = get_post_meta($id, "the_post_likes", 1);
  if ( $likes->$id == "1" ) {
    $new = the_minus( $current );
    $likes->$id="0";
  } else {
    $new = the_plus( $current );
    $likes->$id="1";
  }
  setcookie("like_count", json_encode($likes), 3*time(), '/', 'centregrani.com');
  update_post_meta($id, "the_post_likes", $new);
  exit( $new );
}

Код работает. Но не очень эффективно. Так же если быстро кликнуть несколько раз - кол-во добавляемых или отнимаемых лайков больше, чем 1. Может есть более правильное решение, как хранить данные о лайках на стороне клиента?

READ ALSO
Запись в массив

Запись в массив

Есть такой функционал

199
Laravel мультиязычность

Laravel мультиязычность

Добрый вечерОпыта в ларе не много

373
Как прикрепить файл к форме заявки woocommerce?

Как прикрепить файл к форме заявки woocommerce?

Всем доброй ночиПоявилась нужда сделать возможным прикрепить 1 файл к форме заявки woocommerce, чтобы при отправке заявки на почту - этот файл прикреплялся

302
Правильно ли составлено условие? (SQL, PHP)

Правильно ли составлено условие? (SQL, PHP)

Код рабочий, просто для себя хочу узнать правильно ли составил условия? Суть кода такая, Сменить значение count на 4, при условии что запись...

162