From d84cce387335adbc1dc7be0b033e0d9ed0e83114 Mon Sep 17 00:00:00 2001 From: Guilherme Pontes Date: Wed, 28 Aug 2024 00:16:32 -0300 Subject: [PATCH 1/2] Desafio-Apiki --- css/style.css | 25 ++++++++++++++ img/star-active.svg | 11 ++++++ img/star.svg | 7 ++++ includes/functions.php | 76 ++++++++++++++++++++++++++++++++++++++++++ includes/install.php | 23 +++++++++++++ js/script.js | 37 ++++++++++++++++++++ like.php | 31 +++++++++++++++++ 7 files changed, 210 insertions(+) create mode 100644 css/style.css create mode 100644 img/star-active.svg create mode 100644 img/star.svg create mode 100644 includes/functions.php create mode 100644 includes/install.php create mode 100644 js/script.js create mode 100644 like.php diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..cc1b961 --- /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 0000000..d55308f --- /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 0000000..fdbd2e9 --- /dev/null +++ b/img/star.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/includes/functions.php b/includes/functions.php new file mode 100644 index 0000000..a64fe2a --- /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 0000000..5ee4d03 --- /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 0000000..a0fc1aa --- /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 0000000..9b84588 --- /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'; From 959f433b555dbd8645bdb9b7d9c01d8870f0cd95 Mon Sep 17 00:00:00 2001 From: Guilherme Pontes Date: Wed, 28 Aug 2024 00:26:43 -0300 Subject: [PATCH 2/2] Desafio-Apiki --- img/star.svg | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/img/star.svg b/img/star.svg index fdbd2e9..81a4d42 100644 --- a/img/star.svg +++ b/img/star.svg @@ -1,7 +1,12 @@ - + + - - - - \ No newline at end of file + + + + + + + + \ No newline at end of file