← Volver
Crear plugin API Rest para WordPress
Publicado el 29 de abril de 2025
PHP
Código del archivo tamila_api.php
<?php
/*
Plugin Name: Tamila API
Description: Este plugin es para la API
Version: 1.0.0
Author: ccorreas
Text Domain: tamila_api
*/
require __DIR__ . "/vendor/autoload.php"; // Asegúrate de tener esto
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
// Filtrar categoría
add_filter("rest_prepare_category", function ($data, $category, $context) {
return [
"id" => $data->data["id"],
"name" => $data->data["name"]
];
}, 10, 3);
// Filtrar post
add_filter("rest_prepare_post", function ($data, $post, $context) {
return [
"id" => $data->data["id"],
"date" => $data->data["date"],
"title" => $data->data["title"]["rendered"],
"slug" => $data->data["slug"],
"content" => $data->data["content"]["rendered"],
"excerpt" => $data->data["excerpt"]["rendered"],
"category_id" => $data->data["categories"][0],
"category" => get_the_category_by_ID($data->data["categories"][0]),
"link" => $data->data["link"],
"image" => wp_get_attachment_image_src(get_post_thumbnail_id($data->data["id"]))
];
}, 10, 3);
// Crear endpoint /wp/v2/login
add_action("rest_api_init", function () {
register_rest_route("/wp/v2", "/login", [
"methods" => "POST",
"callback" => "tamila_api_login_display"
]);
});
function tamila_api_login_display($data)
{
$json = json_decode(file_get_contents("php://input"), true);
if (!is_array($json)) {
return new WP_Error("rest_bad_request", "Bad Request", ["status" => 400]);
}
$user = get_user_by("email", sanitize_text_field($json["correo"]));
if (empty($user)) {
return new WP_Error("rest_invalid_user", "Usuario no encontrado", ["status" => 403]);
}
$login = wp_signon([
"user_login" => sanitize_text_field($json["correo"]),
"user_password" => sanitize_text_field($json["password"])
], false);
if (is_wp_error($login)) {
return new WP_Error("rest_invalid_login", "Credenciales inválidas", ["status" => 403]);
}
$payload = [
"iss" => get_site_url(),
"aud" => $user->ID,
"iat" => time(),
"exp" => time() + 60 * 60 // 1 hora
];
return new WP_REST_Response([
"token" => JWT::encode($payload, "123456", "HS512")
], 200);
}
// Middleware para proteger rutas
add_filter("rest_authentication_errors", function ($result) {
if (!empty($result)) {
return $result;
}
$uri_parts = explode("/", $_SERVER["REQUEST_URI"]);
$endpoint = end($uri_parts);
if ($endpoint === "login") {
return $result;
}
$headers = function_exists("apache_request_headers") ? apache_request_headers() : getallheaders();
if (empty($headers["Authorization"])) {
return new WP_Error("rest_not_logged_in", "No autorizado", ["status" => 401]);
}
try {
$token = $headers["Authorization"];
JWT::decode($token, new Key("123456", "HS512"));
return $result;
} catch (\Throwable $e) {
return new WP_Error("rest_invalid_token", "Token inválido", ["status" => 401]);
}
});
Para poder instalar JWT es necesario tener instalados PHP y Composer:
brew install php
export PATH="/opt/homebrew/bin:$PATH"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
sudo mv composer.phar /usr/local/bin/composer
composer require firebase/php-jwt