Solución para el conflicto entre The Events Calendar y API REST de WordPress. Evitar que los endpoints estándares se vean afectados por el plugin de calendario y poder utilizar ambos sin que nada deje de funcionar. En mi caso la aplicación Android de la revista Valle del Guadalhorce dejó de mostrar contenido al instalar ese plugin.
¿Cómo resolver el conflicto entre The Event Calendar y la API REST?
El Problema
- Contexto :
- El plugin The Events Calendar modifica las reglas de autenticación de la API REST de WordPress.
- Esto causa errores
401 Unauthorized
al intentar acceder a los endpoints estándares (/wp-json/wp/v2/posts
,/wp-json/wp/v2/categories
) o personalizados desde una aplicación Android. - La página web de eventos debe seguir funcionando correctamente mientras se permite el acceso público a los datos necesarios para la aplicación.
- Impacto :
- Las solicitudes realizadas por la aplicación Android no pueden cargar los datos debido a las restricciones impuestas por el plugin.
- El error persiste incluso después de implementar varios filtros y redirecciones iniciales.
La Solución
Para resolver este conflicto, seguimos un enfoque paso a paso que incluye:
- Desactivar las Modificaciones de Autenticación de The Events Calendar :
- Eliminamos las reglas de autenticación impuestas por el plugin utilizando los siguientes filtros:phpCopiar12remove_filter(‘rest_authentication_errors’, ‘tribe_rest_authentication_errors’);remove_all_filters(‘rest_authentication_errors’);
- Esto asegura que las solicitudes específicas no sean bloqueadas por las validaciones del plugin.
- Crear Endpoints Personalizados Inmunes a The Events Calendar :
- Registramos nuevos endpoints completamente independientes (
/wp-json/nueva/v1/posts
y/wp-json/nueva/v1/categories
) que no están afectados por las modificaciones del plugin:
- Registramos nuevos endpoints completamente independientes (
register_rest_route('nueva/v1', '/posts', array(
'methods' => 'GET',
'callback' => 'get_nueva_posts',
));
register_rest_route('nueva/v1', '/categories', array(
'methods' => 'GET',
'callback' => 'get_nueva_categories',
));
- Redirigir Solicitudes de los Endpoints Estándares :
- Redirigimos internamente las solicitudes de los endpoints estándares (
/wp-json/wp/v2/posts
y/wp-json/wp/v2/categories
) a los nuevos endpoints personalizados:
- Redirigimos internamente las solicitudes de los endpoints estándares (
if (strpos($request_uri, '/wp-json/wp/v2/posts') !== false) {
wp_redirect(home_url('/wp-json/nueva/v1/posts'));
exit;
}
- Mantener la Funcionalidad de The Events Calendar :
- Aseguramos que la página web de eventos siga funcionando correctamente sin interferir con las funcionalidades del plugin.
Resultados
- Aplicación Android : Ahora puede acceder a los datos necesarios sin errores
401 Unauthorized
. - Página Web de Eventos : Sigue funcionando correctamente con todas las funcionalidades de The Events Calendar intactas.
- Endpoints Personalizados : Los nuevos endpoints (
/wp-json/nueva/v1/posts
y/wp-json/nueva/v1/categories
) son accesibles públicamente y completamente inmunes a las modificaciones del plugin.
Código Final Implementado
Aquí tienes el código completo que implementamos para resolver el problema:
// Desactivar todas las modificaciones de autenticación de The Events Calendar
add_action('init', function () {
// Eliminar el filtro de autenticación de The Events Calendar
remove_filter('rest_authentication_errors', 'tribe_rest_authentication_errors');
// Eliminar cualquier otro hook registrado por The Events Calendar
remove_all_filters('rest_authentication_errors');
}, 1); // Prioridad 1 para ejecutarse ANTES de cualquier otra modificación
// Registrar endpoints personalizados inmunes a The Events Calendar
add_action('rest_api_init', function () {
// Endpoint personalizado para entradas
register_rest_route('nueva/v1', '/posts', array(
'methods' => 'GET',
'callback' => 'get_nueva_posts',
));
// Endpoint personalizado para categorías
register_rest_route('nueva/v1', '/categories', array(
'methods' => 'GET',
'callback' => 'get_nueva_categories',
));
});
function get_nueva_posts($request) {
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
);
$query = new WP_Query($args);
return $query->posts;
}
function get_nueva_categories() {
$args = array(
'taxonomy' => 'category',
'hide_empty' => false,
);
$categories = get_terms($args);
if (is_wp_error($categories)) {
return new WP_Error('no_categories', 'No se encontraron categorías.', array('status' => 404));
}
return $categories;
}
// Redirigir solicitudes de los endpoints estándares a los endpoints personalizados
add_action('template_redirect', function () {
// Verifica si la solicitud es para uno de los endpoints estándares
if (isset($_SERVER['REQUEST_URI'])) {
$request_uri = $_SERVER['REQUEST_URI'];
if (
strpos($request_uri, '/wp-json/wp/v2/posts') !== false || // Entradas estándares
strpos($request_uri, '/wp-json/wp/v2/categories') !== false // Categorías estándares
) {
// Construir la nueva URL para el endpoint personalizado
$new_url = home_url('/wp-json/nueva/v1/' . (strpos($request_uri, 'posts') ? 'posts' : 'categories'));
// Redirigir la solicitud internamente
wp_redirect($new_url);
exit;
}
}
});
Una solución a largo plazo para el conflicto entre el plugin The Events Calendar y la API REST de WordPress
Este enfoque garantiza que:
- La aplicación Android pueda acceder a los datos necesarios sin conflictos.
- The Events Calendar siga funcionando correctamente en la página web de eventos.
- Los endpoints personalizados sean accesibles públicamente y estén protegidos contra futuros cambios en el plugin.
Agradecer desde aquí a chat.qwen.ai por las 2 horas que le hemos dedicado para encontrar la solución que no la había visto en ningún sitio de Internet.
Ahora ya podéis ver el calendario de actividades del Valle del Guadalhorce. Y descargaros la APP de la revista para no perderos nada de lo que ocurre en esta bonita comarca del interior de Málaga.