Deshabilitar la REST API para usuarios no logueados

Php marzo 10, 2026

Por defecto, la REST API de WordPress es accesible públicamente. Cualquiera puede consultar /wp-json/wp/v2/posts y obtener todos los posts publicados, o explorar los endpoints disponibles. En sitios que no necesitan exponer contenido a apps externas, es recomendable bloquear el acceso a usuarios no autenticados como medida de seguridad y privacidad.

Casos de uso: sitios corporativos o intranets sin API pública, instalaciones WordPress usadas solo como backend para una app propia, sitios donde no quieres que se enumere el contenido ni los usuarios vía API.

<?php
add_filter( 'rest_authentication_errors', 'mi_restringir_rest_api' );
function mi_restringir_rest_api( $result ) {
    if ( ! empty( $result ) ) {
        return $result;
    }

    if ( ! is_user_logged_in() ) {
        return new WP_Error(
            'rest_not_logged_in',
            'La API REST requiere autenticación.',
            array( 'status' => 401 )
        );
    }

    return $result;
}

¿Qué hace cada parte?

  • rest_authentication_errors: filter que WordPress ejecuta en cada petición a la REST API para comprobar la autenticación. Si devuelve un WP_Error, la petición se bloquea con ese error.
  • ! empty( $result ): si ya hay un error de autenticación previo (de otro plugin, por ejemplo), se respeta y se devuelve sin modificar. Evita conflictos con otros sistemas de autenticación.
  • is_user_logged_in(): comprueba si la petición viene de un usuario con sesión activa. Las peticiones con Application Passwords o tokens OAuth también pasan esta comprobación.
  • new WP_Error(): crea un error de WordPress con código identificativo, mensaje legible y código de estado HTTP 401 (No autorizado).
  • status => 401: código HTTP estándar para «no autenticado». Diferente del 403 («autenticado pero sin permiso») — aquí el problema es que no hay autenticación.
  • return $result al final: si el usuario está logueado, se devuelve $result sin cambios, permitiendo que la petición continúe normalmente.