← Volver

Crear plugin API Rest para WordPress

Publicado el 29 de abril de 2025

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