Ejecutar WP Cron en multisitio de la manera correcta

15

Tengo WordPress Multisite con varios sitios. Configuré DISABLE_WP_CRON a true en mi wp-config.php .

Si configuramos la tarea cron con wget o curl, tenemos una regla de 30 segundos para ejecutar el script PHP. Es tan pequeño enviar toneladas de notificaciones por correo electrónico y hacer otras cosas (tal vez la conexión del servidor SMTP remoto sea lenta, tal vez sea realmente una gran cantidad de notificaciones por correo electrónico de bbPress o cualquier otra cosa).

Tal vez podamos usar algo como esto?

php -q wp-cron.php

Pero solo ejecuta cron a un sitio en Multisite (cada sitio tiene sus propias tareas cron en diferentes tablas MySQL).

P. S. En el foro wpmudev.org encontré una "solución extraña" "que también utiliza Curl.

Otro PS WP CLI tiene impresionantes comandos wp cron pero solo permite ejecutar tareas cron manualmente (sí, nosotros puede usar --url attr). Por ejemplo:

wp cron event list --url=multisite.com
wp cron event list --url=subdomain.multisite.com
    
pregunta Kolya Korobochkin 03.11.2014 - 01:35

4 respuestas

12

Creo que la mejor manera es usar WP-CLI pero necesitarías escribir un script de bash para hacer esto. Aquí hay uno que debería hacerlo por ti:

WP_PATH="/path/to/wp"
for SITE_URL in = $(wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}')
do
    for EVENT_HOOK in $(wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_PATH" | grep \"now\"$ | awk -F ',' '{print $1}')
    do
        wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_PATH"
    done
done

Luego deberías agregar este script a crontab y ejecutarlo tal vez cada minuto si lo deseas

    
respondido por el DiverseAndRemote.com 28.01.2015 - 06:36
9

Después de haber agregado la constante en wp-config.php

defined('DISABLE_WP_CRON') or define('DISABLE_WP_CRON', true);

WP-CLI

Y suponiendo que tenga su config.yml correctamente, puede omitir el indicador --path al llamar a cron run .

wp cron event run --due-now
  

[<hook>…]   Uno o más ganchos para ejecutar.

     

[--due-now]   Ejecuta todos los ganchos que se deben en este momento.

     

[--all]   Ejecutar todos los ganchos.

Para ejecutar todas las tareas cron debidas en orden:

function run_crons_due_now_in_order { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL"; done; echo "Done"; }; run_crons_due_now_in_order;

Si desea que se ejecuten simultáneamente (ejecutando primero el cron no específico del sitio):

function run_all_crons_due_now { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL" & done; wait $(jobs -p); echo "Done"; }; run_all_crons_due_now;

Desearía poner cualquiera de las opciones en un archivo ejecutable

chmod +x run_all_wp_cron_events_due_now.sh

agregar una tarea crontab

crontab -e

y probablemente ejecutes cada minuto

* * * * * run_all_wp_cron_events_due_now.sh > /dev/null

Si desea ejecutar un comando personalizado de cron, es posible que deba especificar las rutas completas para wp-cli para trabajar.

* * * * * cd /home/username/public_html; /usr/local/bin/php /home/username/wp-cli.phar your-custom-cron-commands run >/dev/null 2>&1

PHP

La única razón por la que necesitarías cargar WordPress aquí es reunir las URL de la base de datos en lugar de usar una lista predefinida. Solo vamos a hacer ping a esas URL y realmente no nos importa cuál es la respuesta.

  

custom-cron.php

<?php

// Load WP
require_once( dirname( __FILE__ ) . '/wp-load.php' );

// Check Version
global $wp_version;
$gt_4_6 = version_compare( $wp_version, '4.6.0', '>=' );

// Get Blogs
$args  = array( 'archived' => 0, 'deleted' => 0, 'public' => 1 );
$blogs = $gt_4_6 ? get_sites( $args ) : @wp_get_sites( $args ); // >= 4.6

// Run Cron on each blog
echo "Running Crons: " . PHP_EOL;
$agent = 'WordPress/' . $wp_version . '; ' . home_url();
$time  = time();

foreach ( $blogs as $blog ) {
    $domain  = $gt_4_6 ? $blog->domain : $blog['domain'];
    $path    = $gt_4_6 ? $blog->path : $blog['path'];
    $command = "http://" . $domain . ( $path ? $path : '/' ) . 'wp-cron.php?doing_wp_cron=' . $time . '&ver=' . $wp_version;

    $ch = curl_init( $command );
    $rc = curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
    $rc = curl_exec( $ch );
    curl_close( $ch );

    print_r( $rc );
    print_r( "\t✔ " . $command . PHP_EOL );
}

Y agregue una sola llamada a su custom-cron.php en un crontab

* * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron
    
respondido por el jgraup 14.09.2016 - 18:54
0

Esta es mi solución:

global $multisite_hosts;
$multisite_hosts = Array('xxxx.dev.xxx.oondeo.es','x2.dev.xxx.oondeo.es','x3.dev.xxx.oondeo.es');

function run_cron(){
  global $multisite_hosts;
  $host=array_pop($multisite_hosts);
  if (!$host)
    return;
  register_shutdown_function('shutdown');
  if (!isset($_SERVER['HTTP_HOST'])) {
       $_SERVER['HTTP_HOST'] = $host;  // replace with primary host
  }

  require './wp-cron.php';
}

function shutdown()
{
  run_cron();
}
run_cron();

Llamamos a esto desde crontab, espero que ayude

    
respondido por el Amon-Ra 17.04.2018 - 16:20
-4

Creo que necesitas decirnos qué quieres decir con "ejecuta wp-cron.php de la manera correcta", ante todo. De acuerdo con Wordpress, no tiene sentido que deshabilites wp-cron y que quieras que se ejecute ... Desde la perspectiva de Linux, wget-ing o / bin / php-ing wp-cron.php sería correcto, pero Parece que tu host particular está limitando tu número de invocaciones de php por razones de seguridad? - esa parte no está completamente clara a partir de su descripción.

Otra pregunta: ¿cuántos correos electrónicos son "una tonelada"? Hay buenas razones por las que no deberías intentar enviar demasiados correos electrónicos tan rápido.

Es posible que tengas que volver a pensar tus objetivos.

(Me gustaría comentar en lugar de responder, pero no tengo suficiente reputación en wpstack).

    
respondido por el Jorge Orpinel 13.04.2015 - 22:53

Lea otras preguntas en las etiquetas