Hướng dẫn chạy WP Cron với Multisite

Nếu đã sử dụng plugin Cache như WP Rocket… chắc hẳn bạn đã được khuyến nghị vô hiệu hóa Cron mặc định của wp và chạy nó ở cấp sever.

Đối với website bình thường thì cứ làm theo hướng dẫn của plugin là được. Tuy nhiên, đối với WP Multisite thì phải biến đổi một chút. Sau đây là phương pháp của tác giả Slavi Marinov , hoạt động dựa trên WP-CLI. Phương pháp này mình cũng đã test và nó hoạt động tốt nhé. Tiến hành thôi nhỉ?

Vô hiệu hóa WP Cron mặc định

Mở wp-config.php thêm mã sau nếu chưa có

define('DISABLE_WP_CRON', true);

Cài đặt Multisite Cron

Tạo file multi_cron.php trong thư mục gốc với nội dung:

<?php
// This tool uses wp-cli to trigger WP cron jobs for all sites in a WP multisite/network.
// Slavi Marinov | https://orbisius.com
// blog post: https://orbisius.com/4400
//
// Installation:
// Add this in the wp install dir as: zzz_cron.php
// Call this script via linux cron
// add this to wp-config.php define('DISABLE_WP_CRON', 'true');
// With some hostings (cPanel based?) we need to use full paths for php and wp-cli
// To trigger it manually open this in your browser http://example.com/zzz_cron.php?go

if (!isset($_REQUEST['go'])) {
    if (php_sapi_name() != "cli") {
        return;
    }
}

// We want to see all errors
error_reporting(E_ALL);
ini_set('display_errors', 1);
 
header( 'Content-type: text/plain; charset=utf-8' );
 
ignore_user_abort(true);
set_time_limit(30 * 60);
 
$php_cmd = 'php';
$php_cli_options = array(
    '/usr/local/bin/php',
    '/usr/bin/php',
);
 
foreach ($php_cli_options as $php_bin_opt) {
    if (@is_file($php_bin)) {
        $php_cmd = $php_bin_opt;
        break;
    }
}
 
$wp_cli_options = array(
    '/usr/local/bin/wp',
    '/usr/bin/wp',
    './wp-cli.phar',
);
 
$wp_cmd = $wp_cli_options[0];
 
foreach ($wp_cli_options as $wp_cli_option) {
    if (@is_file($wp_cli_option)) {
        $wp_cmd = $wp_cli_option;
        break;
    }
}
 
if (preg_match('#win#si', PHP_OS)) { // on windows we call wp directly
    $main_cmd = $wp_cmd;
} else {
    $main_cmd = "$php_cmd $wp_cmd";
}
 
$cmd = "$main_cmd site list --field=url --archived=0 --deleted=0 --skip-packages --skip-plugins --skip-themes --format=json";
$json_str = trim(`$cmd`);
 
$blogs = empty($json_str) ? array() : json_decode($json_str, true);
$blogs = empty($blogs) ? array() : $blogs;
$total = count($blogs);
 
echo "<pre>";
echo "Starting at " . date('r') . "\n";
 
foreach ($blogs as $idx => $url) {
    $cur = $idx + 1;
    echo "$cur of $total) Processing: [$url]\n";
    $url_esc = escapeshellarg($url);
    $cmd = "$main_cmd cron event run --due-now --url=$url_esc";
    $cmd_res = trim(`$cmd`);
    echo "cron: [$cmd_res]\n";
    echo "\n<br/>";
 
    // Output stuff every X few showers
    if ($idx % 5 == 0) {
        flush();
        ob_flush();
    }
}
 
echo "Finished at " . date('r') . "\n";
echo "</pre>";
 
exit(0);

Thiết lập Cron job trên server

ssh vào server và chạy lệnh:

crontab -e

Thêm vào

*/15 * * * * wget -q -O - https://domain.com/multi_cron.php?go &>/dev/null 2>&1

Lưu ý: thay domain.com bằng tên miền chính của mạng, 15 là số phút thực hiện cron – có thể đặt tùy bạn.

Để lưu lại, nhấn Ctrl + X,YEnter . Đừng quên khởi động lại nginx nhé.
nginx -s reload