Eseguire WP-Cron correttamente su reti Multisite?

3 nov 2014, 02:35:41
Visualizzazioni: 15.4K
Voti: 32

Ho un'installazione WordPress Multisite con diversi siti. Ho impostato DISABLE_WP_CRON a true nel mio wp-config.php.

Se configuriamo un task cron con wget o curl abbiamo il limite di 30 secondi per l'esecuzione dello script PHP. È troppo poco per inviare tonnellate di notifiche email e fare altre operazioni (forse il server SMTP remoto è lento, o magari c'è un enorme carico di notifiche email da bbPress o altro).

Forse possiamo usare qualcosa come questo?

php -q wp-cron.php

Ma questo esegue il cron solo per un sito nella rete Multisite (ogni sito ha i propri task cron in diverse tabelle MySQL).

P.S. Nel forum wpmudev.org ho trovato una strana "soluzione" che usa anche Curl.

Altro P.S. WP CLI ha fantastici comandi wp cron ma permettono solo di eseguire manualmente i task cron (sì, possiamo usare l'attributo --url). Per esempio:

wp cron event list --url=multisite.com
wp cron event list --url=subdomain.multisite.com
7
Commenti

Hai dato un'occhiata al codice core di WP-CLI?

kaiser kaiser
3 nov 2014 03:36:32

Sì. Sto esaminando il codice sorgente in questo momento e sto cercando di capire :) Il comando per eseguire tutte le attività (eventi) non esiste, forse potrei crearlo in futuro.

Kolya Korobochkin Kolya Korobochkin
4 nov 2014 15:27:42

Hai wp/WP-CLI nel tuo PATH? Se sì, perché non attivarlo da un file bash eseguito in cron?

kaiser kaiser
4 nov 2014 15:38:31

Sembra fantastico! Ma come eseguire tutte le attività cron da wp cli? Non vedo alcun comando per questo.

Kolya Korobochkin Kolya Korobochkin
15 nov 2014 16:45:07

Esattamente come hai mostrato alla fine della tua domanda?

kaiser kaiser
16 nov 2014 14:38:17

wp cron event list mostra solo l'elenco degli eventi pianificati. Non vedo alcun comando per eseguire le attività. E http://wp-cli.org/commands/cron/event/run/ richiede un hook (argomento).

Kolya Korobochkin Kolya Korobochkin
17 nov 2014 16:07:24

Vale la pena menzionare che se hai solo pochi siti nella tua rete multisite senza piani di espansione, potresti sempre eseguirli individualmente con wp cron event run --due-now --url=mysite1.com && wp cron event run --due-now --url=mysite2.com ecc. ... ma se prevedi di aggiungere siti frequentemente, penso che la risposta di @Anastis funzioni meglio.

squarecandy squarecandy
17 apr 2021 06:49:51
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 6
0
20

Dopo aver aggiunto la costante in wp-config.php

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

WP-CLI

E assumendo che tu abbia il tuo file config.yml configurato correttamente, puoi omettere il flag --path quando chiami cron run.


wp cron event run --due-now

[<hook>…] Uno o più hook da eseguire.

[--due-now] Esegui tutti gli hook scaduti in questo momento.

[--all] Esegui tutti gli hook.


Per eseguire tutte le attività cron scadute in ordine:

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;

Se vuoi eseguirli in modo concorrente (eseguendo prima il cron non specifico del sito):

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;

Vorrai mettere una delle due opzioni in un file eseguibile

chmod +x run_all_wp_cron_events_due_now.sh

aggiungi un'attività crontab

crontab -e

e probabilmente eseguirla ogni minuto

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

Se vuoi eseguire un comando personalizzato da cron, potresti dover specificare i percorsi completi per far funzionare wp-cli.

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

PHP

L'unico motivo per cui dovresti caricare WordPress qui è per raccogliere gli URL dal database piuttosto che usare una lista predefinita. Stiamo solo per pingare quegli URL e non ci interessa realmente quale sia la risposta.

custom-cron.php

<?php

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

// Controlla la versione
global $wp_version;
$gt_4_6 = version_compare( $wp_version, '4.6.0', '>=' );

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

// Esegui Cron su ogni blog
echo "Esecuzione 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 );
}

E aggiungi una singola chiamata al tuo custom-cron.php in un crontab

* * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron
14 set 2016 19:54:09
5
18

Penso che il modo migliore sia usare WP-CLI ma dovresti scrivere uno script bash per farlo. Ecco uno che dovrebbe funzionare per te:

WP_PATH="/percorso/di/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

Dovresti poi aggiungere questo script a crontab e eseguirlo magari ogni minuto se lo desideri

28 gen 2015 07:36:03
Commenti

Hm grazie per la tua opinione ma penso che questa sia una soluzione approssimativa (sporca). Credo sarebbe meglio scrivere qualche addon PHP per wpcli che esegua semplicemente tutte le attività necessarie. Ho bisogno di più tempo per comprendere le funzioni e il codice di WP per farlo.

Kolya Korobochkin Kolya Korobochkin
31 gen 2015 16:15:05

@KolyaKorobochkin Non sono d'accordo. Non è affatto approssimativo dato che WP CLI è stato creato per essere utilizzato dalla linea di comando e in script bash.

DiverseAndRemote.com DiverseAndRemote.com
3 dic 2015 20:15:07

wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH - Secondo la documentazione di run, dovresti utilizzare il flag --due-now. Questo ridurrebbe i lookup e le chiamate individuali agli eventi. Vedi: http://wp-cli.org/commands/cron/event/run/. In ogni caso, sono d'accordo con @OmarJackman - sta utilizzando la linea di comando per usare gli strumenti da riga di comando di WordPress. Complimenti per un esempio pulito di Bash. Potresti completare questa risposta mostrando l'entry crontab.

jgraup jgraup
14 set 2016 19:18:19

Per il beneficio dei lettori futuri, lo script appare quindi così: 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 wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH"; done

puzzlement puzzlement
16 apr 2017 03:44:21

Diversi blogger sembrano aver copiato questa risposta nel corso degli anni senza darti credito, è uno degli snippet più antichi che abbia visto, quindi complimenti!

Jesse Nickles Jesse Nickles
28 mar 2024 12:38:49
4
13

Comando più semplice in una sola riga con meno bash:

wp site list --field=url | xargs -i -n1 wp cron event run --due-now --url="{}"

Puoi eseguirlo manualmente oppure inserirlo in uno script e chiamarlo da cron come nelle altre risposte.

7 ott 2019 15:24:55
Commenti

Esattamente quello che stavo cercando - funziona proprio come descritto, grazie!

kero kero
15 ott 2020 14:19:41

Questo è un utilizzo molto più intelligente degli strumenti disponibili in WP CLI rispetto alle risposte che si sforzano di elaborare i risultati dell'output CSV. Funziona alla grande!

squarecandy squarecandy
17 apr 2021 06:45:50

Questa è la risposta più intelligente. E puoi inserirla direttamente nel tuo crontab.

Edd Edd
31 gen 2024 13:13:17

Molto intelligente! Lo stiamo utilizzando in SlickStack per Multisite ora, quando gli utenti selezionano il metodo wpcli per gestire il loro WP-Cron: https://github.com/littlebizzy/slickstack/blob/master/crons/01-cron-minutely.txt

Jesse Nickles Jesse Nickles
28 mar 2024 13:04:46
0

Questa è la mia soluzione:

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;  // sostituisci con l'host principale
  }

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

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

Chiamiamo questo script da crontab, spero sia utile

17 apr 2018 17:20:48
2

Puoi trovare una guida completa qui su come configurare correttamente il cron job per un sistema WordPress Multisite in modo che venga eseguito su tutti i sottositi e faccia partire i cron job. https://support.shorturl.gg/business-marketing-and-seo-forums/topic/you-are-using-wp-cron-incorrectly-in-wordpress-multisite/

Utilizzare il cron job standard per i siti WordPress standalone non funziona bene perché il cron job WP standard attiverà il cron job solo per il sito principale e di conseguenza nessun cron job verrà eseguito sui sottositi.

13 ott 2022 01:56:29
Commenti

Anche se questo link potrebbe rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link come riferimento. Le risposte che contengono solo link possono diventare non valide se la pagina collegata cambia. - Da Recensione

cjbj cjbj
14 ott 2022 10:22:18

Giusto, ho capito. Era solo più semplice collegarlo. Grazie.

user1554402 user1554402
14 ott 2022 14:47:15
3
-6

Penso che prima di tutto dovresti spiegarci cosa intendi con "eseguire wp-cron.php nel modo giusto". Secondo WordPress, non ha senso disabilitare wp-cron e poi volerlo eseguire... Dal punto di vista Linux, usare wget o /bin/php su wp-cron.php sarebbe corretto, ma sembra che il tuo host specifico stia limitando il numero di invocazioni PHP per ragioni di sicurezza? Questa parte non è del tutto chiara dalla tua descrizione.

Un'altra domanda: quante email sono "un sacco"? Ci sono ottime ragioni per cui non dovresti cercare di inviare troppe email così rapidamente.

Potresti dover ripensare ai tuoi obiettivi.

(Vorrei commentare invece di rispondere, ma non ho abbastanza reputazione su wpstack.)

13 apr 2015 23:53:05
Commenti

Esistono diversi modi per eseguire il cron di WordPress. Il meccanismo integrato viene attivato dalle visualizzazioni delle pagine, ed è pratica comune impostare DISABLE_WP_CRON per disabilitare questo metodo quando si configura invece il più affidabile metodo system cron.

Marcus Downing Marcus Downing
11 lug 2016 17:28:36

La domanda non è perché farlo/se le ragioni sono valide, ma come chiamare correttamente wp-cron.php in un'installazione multisito. Abbastanza chiaro per me ;)

Philipp Philipp
26 ott 2017 23:26:56

Spero ti renda conto che stai commentando una risposta molto vecchia e già nascosta.

Jorge Orpinel Pérez Jorge Orpinel Pérez
28 ott 2017 00:03:45