¿Debería deshabilitar WP_CRON y activar wp-cron.php desde el servidor?
Parece que WordPress activa innecesariamente WP CRON en cada carga de página. Estoy pensando que, en lugar de que se ejecute en cada visita, ¿por qué no programarlo para que se ejecute cada 5 minutos a través del servidor? ¿Podría simplemente activar wp-cron.php cada cinco minutos y lograr el resultado deseado?
¿Hay alguna desventaja en hacer esto?
No hay desventajas al ejecutar WP CRON utilizando los trabajos cron del servidor. De hecho, esta es la práctica recomendada.
Según el Documento Oficial de Desarrollo de Plugins de WordPress:
WP-Cron no se ejecuta continuamente, lo que puede ser un problema si hay tareas críticas que deben ejecutarse a tiempo. Hay una solución fácil para esto. Simplemente configura el programador de tareas de tu sistema para que se ejecute en los intervalos que desees (o en el momento específico necesario).
Para hacer esto, primero necesitas deshabilitar el comportamiento predeterminado de cron en wp-config.php
:
define('DISABLE_WP_CRON', true);
Luego, programa wp-cron.php
desde tu servidor. Para Linux, eso significa:
crontab -e
Sin embargo, en lugar de ejecutarlo en la Línea de Comandos (CLI), ejecútalo como una solicitud HTTP. Para eso puedes usar wget
:
*/5 * * * * wget -q -O - https://tu-dominio.com/wp-cron.php?doing_wp_cron
WordPress carga todos los archivos principales necesarios, Plugins, etc. en wp-cron.php
con el siguiente CÓDIGO:
if ( !defined('ABSPATH') ) {
/** Configurar el entorno de WordPress */
require_once( dirname( __FILE__ ) . '/wp-load.php' );
}
Así que no te preocupes por WordPress no cargar características importantes.

La documentación de WordPress.org que enlazaste menciona wget http://TU_URL_DEL_SITIO/wp-cron.php
sin la adición de ?doing_wp_cron
. ¿Entonces uno es mejor que el otro? ¿Qué hace la adición de ?doing_wp_cron
que la versión sin ella no hace?

Probablemente solo para que tus registros muestren la cadena de consulta y así sepas con certeza cómo fue llamado.

No estoy de acuerdo con esto para nada. En primer lugar, no es cierto que sea "recomendado". En segundo lugar, este método perjudicará cualquier plugin que use el método realmente recomendado para programar eventos. Creo que este es un consejo realmente malo. Casi nadie debería desactivar el cron a menos que tengas una razón MUY específica para hacerlo. La única razón que se me ocurre es si estás desglosando WordPress para una CDN o algo similar. Esto NO es una práctica normal.

@JohnDee: este método no desactiva realmente el cron, desactiva el método WP Cron que verifica e intenta ejecutar trabajos cron en cada carga de página. define('DISABLE_WP_CRON', true);
desactiva solo esa parte del proceso cron y luego llamar al script cron con código como: */5 * * * * wget -q -O - https://tu-dominio.com/wp-cron.php?doing_wp_cron
en el servidor asegura que los trabajos cron se ejecuten. Cualquier plugin de programación ni siquiera notará la diferencia.

El enlace de documentación de WordPress.org sobre este tema cambió a https://developer.wordpress.org/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/

Existen un par de desventajas: En primer lugar, cuando se utiliza wp-cron.php como CLI, variables como $_SERVER no están configuradas. Los usuarios superan esta limitación haciendo una petición cURL a wp-cron.php en su lugar.
En segundo lugar, dado que WordPress en sí no se carga con wp-cron.php; si utilizas un plugin de correo SMTP, este no se cargará al llamar a wp-cron. Nuevamente, usar una llamada cURL soluciona este problema. cURL parece ser el método más frecuentemente utilizado.
Sin embargo; yo prefiero usar wp-cli después de configurar correctamente los ajustes de correo en postfix y (para nginx) la configuración de php-fpm, además de establecer un crontab como:
*/5 * * * * wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1
(Listar todos los cron con campos específicos en formato CSV - hook siendo el nombre del cron, next_run_relative es el tiempo. Filtrar aquellos que muestren 'now' como próxima ejecución (los que están pendientes ahora) usando AWK, pasar esa lista a xargs para ejecutar wp cron event run $HOOK
en cada cron.)
Usar wp-cli carga WordPress correctamente (elijo omitir plugins al listar los cron, ya que errores de código y advertencias PHP podrían afectar la salida del script; pero no omitirlos al ejecutar el cron con xargs, ya que el cron podría necesitar los plugins cargados)
Espero que esto te dé algunas pautas sobre qué tener en cuenta.

¿Qué tal configurar: /15 * * * wget -q -O - http://tudominio.com/wp-cron.php?doing_wp_cron como sugiere TomMcFarlin - https://tommcfarlin.com/wordpress-cron-jobs/? Parece funcionar bien. Agradecería tu comentario.

Sí, como mencioné, algunas personas eligen usar curl (wget o cualquier otra llamada http) para activar los crons, y no hay nada malo con ese método. Solo estaba advirtiendo sobre los problemas de llamar directamente al archivo wp-cron.php, que no incluiría los archivos requeridos, y sugiriendo otro método alternativo si quisieras darle un poco más de vida.

Todavía no he encontrado una desventaja real al externalizar wp-cron a un servicio externo. Llevo haciendo esto durante muchos años ya.
Especialmente en el mundo actual donde puedes ejecutar aplicaciones como microservicios.
Yo utilizo contenedores Docker separados para cada componente de WordPress - php, web, db, crontab, redis, etc. Teniendo crontab como un contenedor separado, llamando a wp-cron via HTTP usando la red local, ejecutándose solo cuando lo necesito.
Esto reduce el estrés en los nodos backend y mejora la seguridad al tener una superficie de ataque más pequeña.
Si el desarrollador no puede averiguar cómo hacer las cosas sin tener que llamar a wp-cron en cada carga de página, vaya, esto solo habla de su inexperiencia. "Dejarlo como está" porque no entiendes cómo funcionan las cosas no es una buena razón para mantenerlo.

Hay muchas razones para no desactivar el wp-cron. De hecho, es casi imposible encontrar un caso de uso para hacerlo. No ralentiza tu sitio y se utiliza para cosas de las que quizás no estés al tanto.
Muchos plugins usan el WP-Cron para programar tareas. Pueden comportarse de forma inesperada si desactivas el programador.
Existe una proliferación de tutoriales sobre este tema porque es confuso, y porque no afecta mucho a tu sitio cuando lo desactivas. Lo que sí hará es causar un dolor de cabeza al desarrollador que tenga que solucionar el misterioso problema que creará en seis meses.
Además, el WP Heartbeat se ejecuta cada 15 segundos en el área de administración, resolviendo este problema para el 99% de las personas que creen tenerlo.

Esta es una respuesta terrible - NO están desactivando WP Cron. Simplemente están deshabilitando la invocación de WP Cron al cargar la página y trasladándola al demonio cron del sistema en su lugar. Vaya.

De todos modos, la principal razón para dejarlo como está es que muchos plugins ahora usan el cron para ejecutar tareas en segundo plano prolongadas. Puedes estropear algo que la SIGUIENTE persona está haciendo, porque esperan que el sistema funcione de manera estándar. ¡Buena suerte!

si un plugin está codificado de una manera que se rompe por completo si wp cron está desactivado, entonces significa que ha sido programado por un incompetente, y es mejor desinstalarlo inmediatamente.

Bueno, estos dos comentarios prueban mi punto. Tienes a un desarrollador diciendo "esto no desactiva cron, simplemente lo mueve al cron del SO" - lo cual es una ruptura en WordPress, que es neutral en cuanto al SO. Luego otro desarrollador dice "oye, es responsabilidad del desarrollador del plugin planear para la aniquilación de wp cron". Uh, ok. ¿Así que si quieres funcionalidad cron, deberías PLANEAR para la eliminación del sistema cron? ¿Para qué? ¿El sistema cron de respaldo? Ese comentario no tiene sentido [obviamente].

De cualquier manera, el estado actual es "CONFUSIÓN TOTAL". Ese es el estado actual. La única solución, desde un punto de vista de framework, es decirle a la gente: HAY UNA RAZÓN POR LA QUE EXISTE EL SISTEMA WP-CRON. NO LO DESACTIVEN. La otra opción son 10,000 opiniones diferentes y variadas. Que es lo que tenemos ahora.
