Exécuter WP Cron sur plusieurs sites de la bonne façon

15

J'ai WordPress Multisite avec plusieurs sites. J'ai configuré DISABLE_WP_CRON en true dans mon wp-config.php .

Si nous configurons une tâche périodique avec wget ou curl, nous avons une règle de 30 secondes pour exécuter le script PHP. C’est si petit d’envoyer des tonnes de notifications par courrier électronique et d’autres tâches (peut-être que la connexion au serveur SMTP distant est lente, peut-être que c’est vraiment une énorme quantité de notifications par courrier électronique de bbPress ou autre).

Peut-être pourrions-nous utiliser quelque chose comme ça?

php -q wp-cron.php

Mais il n’exécute cron que sur un seul site multisite (chaque site a ses propres tâches cron dans différentes tables MySQL).

P. S. sur le forum wpmudev.org J'ai trouvé une "solution étrange" "qui utilise également Curl.

Un autre PS, WP CLI, possède des commandes wp cron impressionnantes, mais il autorise uniquement les tâches d'exécution cron manuellement (ou peut utiliser --url attr). Par exemple:

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

4 réponses

12

Je pense que le meilleur moyen consiste à utiliser WP-CLI, mais vous devez écrire un script bash pour le faire. En voici un qui devrait le faire pour vous:

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

Vous devez ensuite ajouter ce script à la crontab et l'exécuter peut-être toutes les minutes si vous le souhaitez

    
réponse donnée DiverseAndRemote.com 28.01.2015 - 06:36
9

Après avoir ajouté la constante dans wp-config.php

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

WP-CLI

Et en supposant que votre config.yml soit installé correctement, vous pouvez omettre l'indicateur --path lorsque vous appelez cron run .

wp cron event run --due-now
  

[<hook>…]   Un ou plusieurs crochets à exécuter.

     

[--due-now]   Exécutez tous les crochets pour le moment.

     

[--all]   Exécutez tous les crochets.

Pour exécuter toutes les tâches cron dues dans l'ordre:

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 vous souhaitez qu'ils s'exécutent simultanément (en exécutant d'abord le cron non spécifique à un site):

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;

Vous voudriez mettre l'une ou l'autre option dans un fichier exécutable

chmod +x run_all_wp_cron_events_due_now.sh

ajouter une tâche crontab

crontab -e

et probablement exécuter chaque minute

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

Si vous souhaitez exécuter une commande personnalisée de cron, vous devrez peut-être spécifier les chemins complets de wp-cli pour fonctionner.

* * * * * 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 seule raison pour laquelle vous auriez besoin de charger WordPress ici est de rassembler les URL de la base de données plutôt que d'utiliser une liste prédéfinie. Nous allons seulement envoyer une requête ping à ces URL et nous ne nous soucions pas vraiment de la réponse.

  

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 );
}

Et ajoutez un seul appel à votre custom-cron.php dans une crontab

* * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron
    
réponse donnée jgraup 14.09.2016 - 18:54
0

Voici ma solution:

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();

Nous appelons cela de crontab, espérons que cela aide

    
réponse donnée Amon-Ra 17.04.2018 - 16:20
-4

Je pense que vous devez nous dire ce que vous entendez par "exécutez wp-cron.php de la bonne manière" en premier lieu. Selon Wordpress, il n’est pas logique de désactiver wp-cron tout en voulant qu’il soit exécuté ... Du point de vue de Linux, wget-ing ou / bin / php-ing, wp-cron.php serait correct, mais il semble que votre hôte limite votre nombre d'invocations php pour des raisons de sécurité? - cette partie ne ressort pas complètement de votre description.

Une autre question: combien d'e-mails sont "une tonne"? Il y a de bonnes raisons pour que vous ne devriez pas essayer d'envoyer trop de courriels aussi rapidement.

Vous devrez peut-être repenser vos objectifs.

(Je voudrais commenter au lieu de répondre mais je n'ai pas assez de réputation sur wpstack.)

    
réponse donnée Jorge Orpinel 13.04.2015 - 22:53

Lire d'autres questions sur les étiquettes