Cómo solucionar un error al entrar en Salud del Sitio (Site Health) en WordPress por culpa del cron

Actualizada:

¿Entras en WordPress y vas a Herramientas > Salud del Sitio (Site Health) y te sale un error que cuelga tu blog? No puedes acceder al informe de salud de tu sitio por alguna razón, y vamos a averiguar porque. No ha sido sencillo. Te cuento cómo lo he solucionado yo paso a paso. Te adelanto que tiene que ver con la creación de un evento en el cron (wp_batch_split_terms).

¿Cómo puedes reproducir el error? Al entrar en https://tupaginaweb.com/wp-admin/site-health.php, te sale un error diciéndote que hay un problema grave en tu instalación de WordPress y no te funciona este apartado. Todo lo demás va a correctamente. ¿Qué hice después? Me fui a consultar los errores de PHP:

Error en los logs de PHP

thrown in /public_html/wp-admin/includes/class-wp-site-health.php on line 2985
#8 {main}
#7 /public_html/wp-admin/site-health.php(96): require_once('...')
#6 /public_html/wp-admin/admin-header.php(118): do_action()
#5 /public_html/wp-includes/plugin.php(517): WP_Hook->do_action()
#4 /public_html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters()
#3 /public_html/wp-includes/class-wp-hook.php(324): WP_Site_Health->enqueue_scripts()
#2 /public_html/wp-admin/includes/class-wp-site-health.php(139): WP_Site_Health->perform_test()
#1 /public_html/wp-admin/includes/class-wp-site-health.php(194): WP_Site_Health->get_test_scheduled_events()
#0 /public_html/wp-admin/includes/class-wp-site-health.php(1764): WP_Site_Health->has_missed_cron()
Stack trace:
[12-Jun-2024 09:06:02 UTC] PHP Fatal error:  Uncaught TypeError: Unsupported operand types: string - int in /public_html/wp-admin/includes/class-wp-site-health.php:2985

Si solo te fijas en este error, la verdad es que puede llevar a cierta confusión, porque da la sensación de que hay un error en el archivo del core de WordPress class-wp-site-health.php, y realmente no es así. Hay algo detrás que hay que investigar.

¿Cuál fue el siguiente paso? Pues como tengo instalado WP-CLI y tenía pinta de que había un problema en el cron de WordPress, empecé a investigar los eventos dle cron que tenía instalados con este comando:

wp cron event list

Y vas a obtener algo como esto:

+--------------------+--------------------+-----------------------+------------+
| hook               | next_run_gmt       | next_run_relative     | recurrence |
+--------------------+--------------------+-----------------------+------------+
| jetpack_sync_cron  | 2024-06-13 06:19:5 | now                   | 5 minutes  |
|                    | 0                  |                       |            |
| jetpack_display_po | 2024-06-13 06:21:0 | 1 minute 9 seconds    | 10 minutes |
| sts_widget_cron_up | 9                  |                       |            |
| date               |                    |                       |            |
| jetpack_sync_full_ | 2024-06-13 06:22:1 | 2 minutes 19 seconds  | 5 minutes  |
| cron               | 9                  |                       |            |
| wp_privacy_delete_ | 2024-06-13 06:42:2 | 22 minutes 26 seconds | 1 hour     |
| old_export_files   | 6                  |                       |            |
| wp_cache_gc        | 2024-06-13 06:42:2 | 22 minutes 27 seconds | 1 hour     |
|                    | 7                  |                       |            |
| amp_validated_url_ | 2024-06-13 06:42:3 | 22 minutes 31 seconds | 1 hour     |
| stylesheet_gc      | 1                  |                       |            |
| amp_validate_urls  | 2024-06-13 06:42:3 | 22 minutes 33 seconds | 1 hour     |
|                    | 3                  |                       |            |
| wp_cache_gc_watche | 2024-06-13 06:42:3 | 22 minutes 34 seconds | 1 hour     |
| r                  | 4                  |                       |            |
| jetpack_clean_nonc | 2024-06-13 06:42:3 | 22 minutes 36 seconds | 1 hour     |
| es                 | 6                  |                       |            |
| wp_update_plugins  | 2024-06-13 07:41:3 | 1 hour 21 minutes     | 12 hours   |
|                    | 8                  |                       |            |
| wp_scheduled_delet | 2024-06-13 07:41:4 | 1 hour 21 minutes     | 1 day      |
| e                  | 1                  |                       |            |
| wp_version_check   | 2024-06-13 07:42:4 | 1 hour 22 minutes     | 12 hours   |
|                    | 1                  |                       |            |
| wp_update_themes   | 2024-06-13 07:42:4 | 1 hour 22 minutes     | 12 hours   |
|                    | 4                  |                       |            |
| jetpack_waf_rules_ | 2024-06-13 07:42:4 | 1 hour 22 minutes     | 12 hours   |
| update_cron        | 7                  |                       |            |
| wp_scheduled_auto_ | 2024-06-13 07:42:4 | 1 hour 22 minutes     | 1 day      |
| draft_delete       | 9                  |                       |            |
| jetpack_v2_heartbe | 2024-06-13 07:42:5 | 1 hour 22 minutes     | 1 day      |
| at                 | 1                  |                       |            |
| wp_update_user_cou | 2024-06-13 07:42:5 | 1 hour 22 minutes     | 12 hours   |
| nts                | 2                  |                       |            |
| amp_monitor_css_tr | 2024-06-13 07:42:5 | 1 hour 22 minutes     | 1 day      |
| ansient_caching    | 4                  |                       |            |
| jetpack_boost_mini | 2024-06-13 07:42:5 | 1 hour 22 minutes     | 1 day      |
| fy_cron_cache_clea | 5                  |                       |            |
| nup                |                    |                       |            |
| akismet_scheduled_ | 2024-06-13 07:43:0 | 1 hour 23 minutes     | 1 day      |
| delete             | 3                  |                       |            |
| jp_purge_transient | 2024-06-13 07:43:0 | 1 hour 23 minutes     | 1 day      |
| s_cron             | 6                  |                       |            |
| grunion_scheduled_ | 2024-06-13 07:43:0 | 1 hour 23 minutes     | 1 day      |
| delete             | 8                  |                       |            |
| delete_expired_tra | 2024-06-13 07:43:1 | 1 hour 23 minutes     | 1 day      |
| nsients            | 3                  |                       |            |
| recovery_mode_clea | 2024-06-13 07:43:1 | 1 hour 23 minutes     | 1 day      |
| n_expired_keys     | 4                  |                       |            |
| wp_delete_temp_upd | 2024-06-19 07:56:0 | 6 days 1 hour         | 1 week     |
| ater_backups       | 6                  |                       |            |
| wp_site_health_sch | 2024-06-19 08:50:0 | 6 days 2 hours        | 1 week     |
| eduled_check       | 6                  |                       |            |
+--------------------+--------------------+-----------------------+------------+

Me resulto curioso que la última entrada de los eventos del cron fuera wp_site_health_scheduled_check y que fuera cuando me metía en Herramientas > Salud del Sitio cuando saltaba el error en WordPress.

La siguiente comprobación que hice, fue ejecutar ese event del cron en línea de comandos con WP-CLI:

wp cron event run wp_site_health_scheduled_check

Y como era de suponer, el evento no era capaz de correr y salía un error como el primero que te he puesto, pero además apareció una línea que me aclaro finalmente por donde estaba teniendo el problema:

Warning: Ignoring incorrectly registered cron event "wp_batch_split_terms".

Dentro del cron tenía un evento llamado wp_batch_split_terms… ¡Pero que no aparece en el listado de eventos!

¿Siguiente paso? Comprobar donde estaba ese evento. Para ello, tienes que acceder a la base de datos de WordPress, concretamente en la tabla wp-options > option_name y buscas «cron» (todo esto lo puedes hacer con Phpmyadmin u otro gestor de bases de datos. En mi caso lo he hecho mediante el módulo correspondiente de Virtualmin). ¿Qué me he encontrado en el campo option_value del cron? Pues el problema que hacía referencia el último Warning. Todos los valores normales dle cron de WordPress y una entrada que es la que está provocando el error:

s:20:"wp_batch_split_terms";a:33:{
    i:1440855346;a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:2:{s:8:"schedule";b:0;s:4:"args";a:0:{}}}
    i:1440855349;a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:2:{s:8:"schedule";b:0;s:4:"args";a:0:{}}}
    i:1440855351;a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:2:{s:8:"schedule";b:0;s:4:"args";a:0:{}}}
}

¿Puedes borrarla en la base datos? Pues es la primera cosa que he hecho y ha vuelto a aparecer. También he borrado todo el campo option_value del cron y WordPress lo ha vuelto a generar… ¿Qué es lo que pasa? Pues da la sensación de que el evento wp_batch_split_terms está en más sitios y no los he localizado.

¿Siguiente paso? Pues afortunadamente he encontrado un hilo del foro de WordPress en el que se comenta un viejo error de WordPress High CPU Load After Update to v4.3, donde se habla de que se produjo un aumento tremendo de CPU al generarse eventos raros provocados por… ¡wp_batch_split_terms! Se supone que el error se arregló con una actualización de WordPress.

¿Por qué me pasa a mí? Pues la verdad es que no lo he averiguado. Puede que se quedara desactualizado en la base de datos en mi blog, que ya estaba online en esa versión. Lo bueno, es que la solución temporal al error que se propuso en este hilo de WordPress, me ha servido a mi para reparar el fallo al entrar a la Salud del Sitio en mi instalación. Te cuento lo que he hecho.

Cómo solucionar un error al entrar en Salud del Sitio en WordPress por culpa de un evento del cron llamado wp_batch_split_terms

Tienes que crear un archivo php con un editor de texto (el creador es Samuel Wood (Otto)). Llámalo como quieras, por ejemplo fixcron.php:

<?php
function clear_bad_cron_entries() {
	// Fix incorrect cron entries for term splitting
	$cron_array = _get_cron_array();
	if ( isset( $cron_array['wp_batch_split_terms'] ) ) {
		unset( $cron_array['wp_batch_split_terms'] );
	        _set_cron_array( $cron_array );
	}
}
clear_bad_cron_entries();

Y luego lo subes a la carpeta de WordPress, wp-content/mu-plugins (si no tienes este directorio lo creas). En este directorio se ponen los plugins que el core de WordPress siempre tiene en cuenta y que se tienen que ejecutar sí o sí con cada solicitud.

Después de hacerlo, visita tu página una vez y deja pasar unos minutos. Este código PHP se va a encargar de quitar automáticamente estos eventos. El problema en el cron se debería haber solucionado: habrán desaparecido para siempre los eventos wp_batch_split_terms y podrás entrar de nuevo en https://tupaginaweb.com/wp-admin/site-health.php sin que se cuelgue WordPress. Si compruebas la base de datos, verás que ya no hay valores de wp_batch_split_terms ¡Viva!

Finalmente, borrar el archivo fixcron.php de wp-content/mu-plugins. Ya está todo arreglado y no lo necesitas más.


Descubre más desde algoentremanos.com

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Foto del autor

Ivan Benito

Apasionado de la lectura y los viajes, experto en tecnología e informática y fan de la privacidad online. Desde el año 2007 me he dedicado al SEO, a escribir y a crear páginas web con WordPress sobre todo tipo de temáticas. Si tienes alguna duda y necesitas ayuda... ¡Pregúntame!

Si tienes preguntas, quieres que hagamos una review de una app, programa o producto, simplemente mándanos un e-mail mediante nuestro formulario de contacto. Te contestaremos en el menor tiempo posible. ¡Muchas gracias y salU2! Algoentremanos realiza reviews de manera profesional y en muchas ocasiones recibimos compensación de las compañías cuyos productos revisamos. Probamos cada producto a fondo y otorgamos altas calificaciones solo a los mejores. La propiedad de Algoentremanos.com es independiente y las opiniones expresadas aquí son solo nuestras. Algunos enlaces del artículo son afiliados: pueden generar un beneficio a algoentremanos.com. Saber más.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.