diff --git a/css/style.css b/css/style.css new file mode 100644 index 00000000..cc1b961c --- /dev/null +++ b/css/style.css @@ -0,0 +1,25 @@ +.likeImg{ + display: inline-block; + width: 25px; + cursor: pointer; + transition: transform 0.6s ease-in-out; +} + +.likeImg:hover { + transform: scale(1.6); +} + +.alert{ + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-warning{ + color: #145275; + background-color: #fff3cd; + border-color: #231d5c; +} + diff --git a/img/star-active.svg b/img/star-active.svg new file mode 100644 index 00000000..d55308fb --- /dev/null +++ b/img/star-active.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/img/star.svg b/img/star.svg new file mode 100644 index 00000000..81a4d42f --- /dev/null +++ b/img/star.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/includes/functions.php b/includes/functions.php new file mode 100644 index 00000000..a64fe2ab --- /dev/null +++ b/includes/functions.php @@ -0,0 +1,76 @@ +prefix . 'liked'; + + // Consulta para verificar se o usuário já curtiu o post. + $query = $wpdb->prepare("SELECT * FROM $table_name WHERE id_post = %d AND id_user = %d", $post_id, $user_id); + $already_liked = $wpdb->get_row($query); + + $active = ''; + $liked = 'false'; + if($already_liked){ + $active = '-active'; + $liked = 'true'; + } + + if (is_singular('post')) { + if(!is_user_logged_in()){ + $content .= "
Funcionalidade de like somente para usuários cadastrados
"; + return $content; + } + + $img_url = plugin_dir_url(dirname(__FILE__)) . "img/star$active.svg"; + $img_html = '
like
'; + $content .= $img_html; + } + + return $content; +} +add_filter('the_content', 'add_text_after_content'); + +// Função para registrar endpoints personalizados da REST API. +add_action('rest_api_init', function () { + register_rest_route('favorites/v1', '/toggle/', [ + 'methods' => 'POST', + 'callback' => 'toggle_favorite', + 'permission_callback' => function () { + return is_user_logged_in(); // Garante que apenas usuários logados possam acessar. + }, + ]); +}); + +// Função de callback para o endpoint da REST API. +function toggle_favorite(WP_REST_Request $request) { + global $wpdb; + + $user_id = get_current_user_id(); + $post_id = $request->get_param('post_id'); + + if (!$user_id || !$post_id) { + return new WP_REST_Response(['success' => false, 'message' => 'Dados inválidos'], 400); + } + + $table_name = $wpdb->prefix . 'liked'; + + // Verifica se o post já foi favoritado pelo usuário. + $favorite = $wpdb->get_row($wpdb->prepare( + "SELECT * FROM $table_name WHERE id_post = %d AND id_user = %d", + $post_id, $user_id + )); + + if ($favorite) { + // Se já estiver favoritado, remove. + $wpdb->delete($table_name, ['id_user' => $user_id, 'id_post' => $post_id]); + return new WP_REST_Response(['success' => true, 'message' => 'disliked'], 200); + } else { + // Caso contrário, adiciona como favorito. + $wpdb->insert($table_name, ['id_post' => $post_id, 'id_user' => $user_id]); + return new WP_REST_Response(['success' => true, 'message' => 'liked'], 200); + } +} diff --git a/includes/install.php b/includes/install.php new file mode 100644 index 00000000..5ee4d03c --- /dev/null +++ b/includes/install.php @@ -0,0 +1,23 @@ +prefix . 'liked'; + + $charset_collate = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE IF NOT EXISTS $nome_tabela ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + id_post BIGINT(20) NOT NULL, + id_user BIGINT(20) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY user_post (id_user, id_post) + ) $charset_collate;"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + + dbDelta($sql); +} + +register_activation_hook(__FILE__, 'create_custom_table'); diff --git a/js/script.js b/js/script.js new file mode 100644 index 00000000..a0fc1aab --- /dev/null +++ b/js/script.js @@ -0,0 +1,37 @@ +jQuery(document).ready(function ($) { + $(".likeImg").click(function () { + let postID = $(this).data("post-id"); + let userID = $(this).data("user-id"); + let liked = $(this).data("liked"); + + let data = { + post_id: postID, + user_id: userID, + }; + + $.ajax({ + url: '/wp-json/favorites/v1/toggle/', // Usando o endpoint da REST API. + method: 'POST', + data: data, + beforeSend: function (xhr) { + xhr.setRequestHeader('X-WP-Nonce', myAjax.restNonce); // Incluindo o nonce. + }, + success: function (response) { + if (response.success) { + if (response.message === "disliked") { + $(".likeImg").attr("src", myAjax.imgUrl + "star.svg"); + $(".likeImg").data("liked", "false"); + } else if (response.message === "liked") { + $(".likeImg").attr("src", myAjax.imgUrl + "star-active.svg"); + $(".likeImg").data("liked", "true"); + } + } else { + alert(response.message); + } + }, + error: function (response) { + alert('Ocorreu um erro ao processar sua solicitação.'); + } + }); + }); +}); diff --git a/like.php b/like.php new file mode 100644 index 00000000..9b845882 --- /dev/null +++ b/like.php @@ -0,0 +1,31 @@ + admin_url('admin-ajax.php'), + 'imgUrl' => $plugin_dir . "img/", + 'restNonce' => wp_create_nonce('wp_rest') // Gera o nonce para REST API. + ); + wp_localize_script('like-js', 'myAjax', $paths); +} +add_action('wp_enqueue_scripts', 'enqueue_scripts'); + +require_once plugin_dir_path(__FILE__) . 'includes/functions.php';