already_liked($post_id)) { if (is_user_logged_in()) { $user_id = get_current_user_id(); update_user_option($user_id, '_user_like_count', (int)get_user_option('_user_like_count', $user_id) + 1); update_post_meta($post_id, '_user_liked', $this->get_user_likes($user_id, $post_id)); } else { update_post_meta($post_id, '_user_IP', $this->get_IP_likes($this->get_IP(), $post_id)); } $like_count = ++$count; $response['status'] = 'liked'; } else { if (is_user_logged_in()) { $user_id = get_current_user_id(); $user_like_count = (int)get_user_option('_user_like_count', $user_id); if ($user_like_count > 0) { update_user_option($user_id, '_user_like_count', $user_like_count - 1); } $post_users = $this->get_user_likes($user_id, $post_id); if ($post_users) { unset($post_users[array_search($user_id, $post_users, true)]); update_post_meta($post_id, '_user_liked', $post_users); } } else { $post_users = $this->get_IP_likes($this->get_IP(), $post_id); if ($post_users) { unset($post_users[array_search($this->get_IP(), $post_users, true)]); update_post_meta($post_id, '_user_IP', $post_users); } } $like_count = ($count > 0) ? --$count : 0; $response['status'] = 'unliked'; } update_post_meta($post_id, '_post_like_count', $like_count); update_post_meta($post_id, '_post_like_modified', date('Y-m-d H:i:s')); $response['count'] = $this->get_like_count($like_count); if ($js_disabled) { wp_redirect(get_permalink($post_id)); exit; } wp_send_json($response); } public function get_button($post_id, $settings) { $nonce = wp_create_nonce('king-addons-post-likes-nonce'); $like_count = (int)get_post_meta($post_id, '_post_like_count', true); $button_text = $settings['element_like_text']; $default_text_class = $button_text === '' ? ' king-addons-likes-no-default' : ''; if ($like_count === 0) $default_text_class .= ' king-addons-likes-zero'; if ($this->already_liked($post_id)) { $title = esc_html__('Like', 'king-addons'); $liked_class = ' king-addons-already-liked'; $icon_class = str_replace('far', 'fas', $settings['element_like_icon']); } else { $title = esc_html__('Unlike', 'king-addons'); $liked_class = ''; $icon_class = $settings['element_like_icon']; } $attributes = 'href="' . esc_url(admin_url('admin-ajax.php?action=king_addons_likes_init&post_id=' . $post_id . '&nonce=' . $nonce)) . '"'; $attributes .= ' class="king-addons-post-like-button' . esc_attr($liked_class . $default_text_class) . '"'; $attributes .= ' title="' . esc_attr($title) . '"'; $attributes .= ' data-ajax="' . esc_url(admin_url('admin-ajax.php')) . '"'; $attributes .= ' data-icon="' . esc_attr($icon_class) . '"'; $attributes .= ' data-nonce="' . esc_attr($nonce) . '"'; $attributes .= ' data-post-id="' . esc_attr($post_id) . '"'; /** @noinspection DuplicatedCode */ $attributes .= ' data-text="' . esc_attr($button_text) . '"'; $output = ''; $output .= ''; $output .= $this->get_like_count($like_count, $button_text); $output .= ''; return $output; } public function already_liked($post_id) { $post_meta = is_user_logged_in() ? get_post_meta($post_id, '_user_liked') : get_post_meta($post_id, '_user_IP'); $post_users = !empty($post_meta[0]) ? $post_meta[0] : []; $user_id = is_user_logged_in() ? get_current_user_id() : $this->get_IP(); return (is_array($post_users) && in_array($user_id, $post_users)); } public function get_user_likes($user_id, $post_id) { $post_meta = get_post_meta($post_id, '_user_liked'); $post_users = !empty($post_meta[0]) ? $post_meta[0] : []; if (!in_array($user_id, $post_users)) { $post_users['user-' . $user_id] = $user_id; } return $post_users; } public function get_IP_likes($user_ip, $post_id) { $post_meta = get_post_meta($post_id, '_user_IP'); $post_users = !empty($post_meta[0]) ? $post_meta[0] : []; if (!in_array($user_ip, $post_users)) { $post_users['ip-' . $user_ip] = $user_ip; } return $post_users; } public function get_IP() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = sanitize_text_field(wp_unslash($_SERVER['HTTP_CLIENT_IP'])); } else { $ip = !empty($_SERVER['REMOTE_ADDR']) ? sanitize_text_field(wp_unslash($_SERVER['REMOTE_ADDR'])) : '0.0.0.0'; } $ip = filter_var($ip, FILTER_VALIDATE_IP); return ($ip === false) ? '0.0.0.0' : $ip; } public function get_format_count($num) { $precision = 2; if ($num >= 1e9) { $formatted = number_format($num / 1e9, $precision) . 'B'; } elseif ($num >= 1e6) { $formatted = number_format($num / 1e6, $precision) . 'M'; } elseif ($num >= 1e3) { $formatted = number_format($num / 1e3, $precision) . 'K'; } else { $formatted = $num; } return str_replace('.00', '', $formatted); } public function get_like_count($count, $like_text = '') { $number = (is_numeric($count) && $count > 0) ? $this->get_format_count($count) : $like_text; return '' . esc_html($number) . ''; } } new Post_Likes_Ajax();