Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 201 additions & 0 deletions favourites-controller.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
<?php
/**
* Classe FavouritesController
*
* Responsável por definir as rotas da API do plugin WP Favourites e as funções de callback para cada rota.
*
* @package WP_Favourites
* @since 1.0.0
*/
class FavouritesController {

/**
* Método para registrar as rotas da API do plugin.
*
* Registra as rotas para favoritar, desfavoritar e listar os posts favoritos do usuário.
*
* @since 1.0.0
*/
public static function register_routes() {
// Rota para favoritar um post
register_rest_route(
'wp-favourites/v1',
'/favourite/(?P<post_id>\d+)',
array(
'methods' => 'POST',
'callback' => array( 'FavouritesController', 'favourite_post' ),
'permission_callback' => array( 'FavouritesController', 'check_user_logged_in' ),
)
);

// Rota para desfavoritar um post
register_rest_route(
'wp-favourites/v1',
'/unfavourite/(?P<post_id>\d+)',
array(
'methods' => 'POST',
'callback' => array( 'FavouritesController', 'unfavourite_post' ),
'permission_callback' => array( 'FavouritesController', 'check_user_logged_in' ),
)
);

// Rota para listar os posts favoritos do usuário
register_rest_route(
'wp-favourites/v1',
'/favourites',
array(
'methods' => 'GET',
'callback' => array( 'FavouritesController', 'get_user_favourites' ),
'permission_callback' => array( 'FavouritesController', 'check_user_logged_in' ),
)
);
}

/**
* Método para verificar se o usuário está logado.
*
* Verifica se o usuário está autenticado antes de permitir o acesso a determinadas rotas da API.
*
* @return bool|WP_Error True se o usuário estiver logado, WP_Error caso contrário.
* @since 1.0.0
*/
public static function check_user_logged_in() {
if ( is_user_logged_in() ) {
return true;
} else {
return new WP_Error( 'rest_forbidden', esc_html__( 'You are not authorized to access this endpoint.', 'wp-favourites' ), array( 'status' => 401 ) );
}
}

/**
* Método para favoritar um post.
*
* Adiciona o post aos favoritos do usuário na tabela personalizada.
*
* @param WP_REST_Request $request Objeto da requisição.
* @return WP_REST_Response Resposta da API com o status da ação.
* @since 1.0.0
*/
public static function favourite_post( $request ) {
$user_id = get_current_user_id();
$post_id = $request['post_id'];

// Verificar se o post já está favoritado pelo usuário
if ( self::is_post_favourited( $user_id, $post_id ) ) {
return rest_ensure_response( array( 'error' => true, 'message' => 'This post is already favourited by the user.' ) );
}

// Adicionar o post aos favoritos do usuário na tabela personalizada
global $wpdb;
$table_name = $wpdb->prefix . 'wp_favourites';
$wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'post_id' => $post_id,
)
);

return rest_ensure_response( array( 'success' => true, 'message' => 'Post favourited successfully.' ) );
}

/**
* Método para desfavoritar um post.
*
* Remove o post dos favoritos do usuário na tabela personalizada.
*
* @param WP_REST_Request $request Objeto da requisição.
* @return WP_REST_Response Resposta da API com o status da ação.
* @since 1.0.0
*/
public static function unfavourite_post( $request ) {
$user_id = get_current_user_id();
$post_id = $request['post_id'];

// Verificar se o post está favoritado pelo usuário
if ( ! self::is_post_favourited( $user_id, $post_id ) ) {
return rest_ensure_response( array( 'error' => true, 'message' => 'This post is not favourited by the user.' ) );
}

// Remover o post dos favoritos do usuário na tabela personalizada
global $wpdb;
$table_name = $wpdb->prefix . 'wp_favourites';
$wpdb->delete(
$table_name,
array(
'user_id' => $user_id,
'post_id' => $post_id,
)
);

return rest_ensure_response( array( 'success' => true, 'message' => 'Post unfavourited successfully.' ) );
}

/**
* Método para verificar se um post está favoritado pelo usuário.
*
* Verifica se o post está na lista de favoritos do usuário.
*
* @param int $user_id ID do usuário.
* @param int $post_id ID do post.
* @return bool True se o post está favoritado pelo usuário, false caso contrário.
* @since 1.0.0
*/
private static function is_post_favourited( $user_id, $post_id ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wp_favourites';
$result = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE user_id = %d AND post_id = %d",
$user_id,
$post_id
)
);

return (int) $result > 0;
}

/**
* Método para obter os posts favoritos do usuário.
*
* Obtém a lista de IDs dos posts favoritos do usuário e retorna informações como ID, título e data de cada post.
*
* @param WP_REST_Request $request Objeto da requisição.
* @return WP_REST_Response Resposta da API contendo os posts favoritos do usuário.
* @since 1.0.0
*/
public static function get_user_favourites( $request ) {
$user_id = get_current_user_id();

// Verificar se o usuário está logado
if ( empty( $user_id ) ) {
return new WP_Error( 'rest_forbidden', esc_html__( 'You are not authorized to access this endpoint.', 'wp-favourites' ), array( 'status' => 401 ) );
}

global $wpdb;
$table_name = $wpdb->prefix . 'wp_favourites';

// Consulta para obter os IDs dos posts favoritos do usuário
$query = $wpdb->prepare(
"SELECT post_id FROM $table_name WHERE user_id = %d",
$user_id
);

$post_ids = $wpdb->get_col( $query );

// Preparar uma lista de posts favoritos com ID, título e data
$favourites = array();
foreach ( $post_ids as $post_id ) {
$post = get_post( $post_id );
if ( $post ) {
$favourites[] = array(
'ID' => $post_id,
'title' => get_the_title( $post_id ),
'date' => $post->post_date,
);
}
}

return rest_ensure_response( $favourites );
}
}
11 changes: 11 additions & 0 deletions uninstall.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php
// Impede o acesso direto ao arquivo
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
exit;
}

// Incluir o arquivo com a definição da função custom_dbDelta
require_once plugin_dir_path( __FILE__ ) . 'wp-favourites.php';

// Remover a tabela personalizada
WP_Favourites::remove_custom_table();
153 changes: 153 additions & 0 deletions wp-favourites.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
<?php
/**
* Nome do Plugin: WP Favourites
* Descrição: Permite que os usuários favoritem posts usando a API REST do WordPress.
* Versão: 1.0.0
* Autor: Itamar Silva
*
* @package WP_Favourites
*/

// Impede o acesso direto ao arquivo
if ( ! defined( 'ABSPATH' ) ) {
exit;
}

// Incluir o arquivo favourites-controller.php para registrar as rotas da API
require_once plugin_dir_path( __FILE__ ) . 'favourites-controller.php';

/**
* Classe principal do Plugin WP Favourites.
*
* Esta classe inicializa o plugin e trata as ações de ativação,
* desativação e desinstalação do plugin. Além disso, cria uma tabela
* personalizada no banco de dados para armazenar dados de posts favoritos
* e registra as rotas da API usando a classe FavouritesController.
*
* @since 1.0.0
*/
class WP_Favourites {

/**
* Construtor da classe WP_Favourites.
*
* Inicializa o plugin e registra os hooks necessários do WordPress.
*
* @since 1.0.0
*/
public function __construct() {
// Criar uma instância da classe FavouritesController para gerenciar as rotas da API
$favourites_controller = new FavouritesController();

// Registrar os hooks necessários do WordPress para a API REST do plugin
add_action( 'rest_api_init', array( $favourites_controller, 'register_routes' ) );
}

/**
* Método para ativar o plugin.
*
* Este método é chamado quando o plugin é ativado e cria
* uma tabela personalizada no banco de dados para armazenar dados
* de posts favoritos.
*
* @since 1.0.0
*/
public static function activate() {
self::create_custom_table();
}

/**
* Método para desativar o plugin.
*
* Este método é chamado quando o plugin é desativado.
*
* @since 1.0.0
*/
public static function deactivate() {
// Adicionar código de desativação aqui, se necessário
}

/**
* Método para desinstalar o plugin.
*
* Este método é chamado quando o plugin é desinstalado e
* remove a tabela personalizada do banco de dados.
*
* @since 1.0.0
*/
public static function uninstall() {
self::remove_custom_table();
}

/**
* Método para criar uma tabela personalizada no banco de dados.
*
* Este método é usado para criar uma tabela personalizada para
* armazenar dados de posts favoritos, como o ID do usuário e o ID do post.
*
* @since 1.0.0
*/
private static function create_custom_table() {
global $wpdb;

// Nome da tabela personalizada
$table_name = $wpdb->prefix . 'wp_favourites';

// SQL para criar a tabela
$charset_collate = $wpdb->get_charset_collate();

// Montar a consulta SQL para criar a tabela
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id INT NOT NULL AUTO_INCREMENT,
user_id BIGINT NOT NULL,
post_id BIGINT NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY unique_favourite (user_id, post_id)
) $charset_collate;";

// Executar a consulta SQL usando a função dbDelta customizada
self::custom_dbDelta( $sql );
}

/**
* Método para remover a tabela personalizada do banco de dados.
*
* Este método é usado para remover a tabela personalizada quando o plugin é desinstalado.
*
* @since 1.0.0
*/
public static function remove_custom_table() {
global $wpdb;

// Nome da tabela personalizada
$table_name = $wpdb->prefix . 'wp_favourites';

// SQL para remover a tabela
$sql = "DROP TABLE IF EXISTS $table_name;";

// Executar a consulta SQL usando $wpdb->query()
$wpdb->query( $sql );
}

/**
* Função customizada para executar uma consulta SQL usando dbDelta.
*
* Esta função é usada para executar a consulta SQL para criar a tabela personalizada.
*
* @param string $sql A consulta SQL para executar.
*
* @since 1.0.0
*/
private static function custom_dbDelta( $sql ) {
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta( $sql );
}
}

// Instanciar a classe principal do Plugin
$wp_favourites_plugin = new WP_Favourites();

// Registrar os hooks de ativação, desativação e desinstalação do Plugin
register_activation_hook( __FILE__, array( 'WP_Favourites', 'activate' ) );
register_deactivation_hook( __FILE__, array( 'WP_Favourites', 'deactivate' ) );
register_uninstall_hook( __FILE__, array( 'WP_Favourites', 'uninstall' ) );