Correndo WP Cron em multisite do caminho certo

Tenho WordPress Multisite com vários sites. Eu configurei DISABLE_WP_CRON para true no meu wp-config.php .

Se configurarmos a tarefa do cron com o wget ou a onda, temos uma regra de 30 segundos para executar o script PHP. É tão pequeno enviar toneladas de notifications por e-mail e fazer outras coisas (talvez a conexão remota do servidor SMTP seja lenta, talvez seja um grande número de notifications por e-mail do bbPress ou qualquer coisa).

Talvez possamos usar algo assim?

 php -q wp-cron.php 

Mas é executado apenas cron para um site no Multisite (cada site tem suas próprias tarefas cron em diferentes tabelas MySQL).

PS No wpmudev.org forum encontrei “solução” estranha que também usa Curl.

Outro PS WP CLI tem incríveis comandos do wp cron mas é só permitir executar tarefas do cron manualmente (sim, podemos usar --url attr). Por exemplo:

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

Solutions Collecting From Web of "Correndo WP Cron em multisite do caminho certo"

Eu acho que a melhor maneira é usar o WP-CLI, mas você precisaria escrever um script bash para fazer isso. Aqui está um que deveria fazer isso para você:

 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 

Você precisaria adicionar esse script ao crontab e executá-lo talvez a cada minuto, se você gosta

Depois de adicionar a constante no wp-config.php

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

WP-CLI

E supondo que você tenha config.yml configurado corretamente, você pode omitir o sinalizador --path quando ligar o cron run .


 wp cron event run --due-now 

[…] Um ou mais ganchos para executar.

[--due-now] Execute todos os ganchos devido agora.

[--all] Execute todos os ganchos.


Para executar todas as devidas tarefas cron em ordem:

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 você deseja que eles sejam executados simultaneamente (executando o cron não específico do site primeiro):

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;

Você gostaria de colocar qualquer opção em um arquivo executável

 chmod +x run_all_wp_cron_events_due_now.sh 

adicione uma tarefa crontab

 crontab -e 

e provavelmente executam cada minuto

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

Se você deseja executar um comando personalizado do cron, talvez seja necessário especificar os caminhos completos para que o wp-cli funcione.

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

PHP

A única razão pela qual você precisaria carregar o WordPress aqui é reunir os URLs do database em vez de usar uma lista pré-definida. Nós só vamos fazer ping para esses URLs e nós realmente não nos importa o que é a resposta.

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

E adicione uma única chamada ao seu custom-cron.php em um crontab

 * * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron 

Eu acho que você precisa nos dizer o que você quer dizer com “executar o wp-cron.php do jeito certo” em primeiro lugar. De acordo com o WordPress, não faz sentido que você desabilite o wp-cron e que ainda assim o queira executar … Do ponto de vista do Linux, wget-ing ou / bin / php-ing wp-cron.php estaria correto, mas Parece que seu host particular está limitando seu número de invocações php por razões de segurança? – essa parte não é completamente clara da sua descrição.

Outra pergunta: quantos e-mails são “uma tonelada”? Há excelentes razões pelas quais você não deve tentar enviar muitos e-mails rapidamente.

Talvez você precise repensar seus objectives.

(Eu gostaria de comentar em vez de responder, mas não tenho reputação suficiente no wpstack.)