Last active
September 17, 2023 21:12
-
-
Save bjornjohansen/a00a9fee5475c4dadb56 to your computer and use it in GitHub Desktop.
Run all due cron events for WordPress with WP-CLI. Works with both single sites and multisite networks.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Copyright © 2015 Bjørn Johansen | |
# This work is free. You can redistribute it and/or modify it under the | |
# terms of the Do What The Fuck You Want To Public License, Version 2, | |
# as published by Sam Hocevar. See http://www.wtfpl.net/ for more details. | |
WP_PATH="/path/to/wp" | |
# Check if WP-CLI is available | |
if ! hash wp 2>/dev/null; then | |
echo "WP-CLI is not available" | |
exit | |
fi | |
# If WordPress isn’t installed here, we bail | |
if ! $(wp core is-installed --path="$WP_PATH" --quiet); then | |
echo "WordPress is not installed here: ${WP_PATH}" | |
exit | |
fi | |
# Get a list of site URLs | |
if $(wp core is-installed --path="$WP_PATH" --quiet --network); | |
then | |
SITE_URLS=`wp site list --fields=url --archived=0 --deleted=0 --format=csv --path="$WP_PATH" | sed 1d` | |
else | |
SITE_URLS=(`wp option get siteurl --path="$WP_PATH"`) | |
fi | |
# Loop through all the sites | |
for SITE_URL in $SITE_URLS | |
do | |
# Run all event hooks that are due | |
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" --quiet | |
done | |
done |
###
##For horizontal scaled wp environment use this to divide load on each node equally. I am using crudini to read the environment values
##This script is not perfect. You might have to modify it for you to work.
###
MAXSERVERS=$(crudini --get ../env-vars-dynamic.ini '' MAX_SERVERS_IN_THIS_NETWORK)
THISSERVERIS=$(crudini --get ../env-vars-dynamic.ini '' THIS_SERVER_NODE_NUMBER)
WP_PATH="/path/to/wp"
MAIN_SITE="http://www.domain.tld" # --url="$MAIN_SITE" below, prevents the Undefined index: HTTP_HOST error.
# Check if WP-CLI is available
if ! hash wp 2>/dev/null; then
echo "WP-CLI is not available"
exit
fi
# If WordPress isn’t installed here, we bail
if ! $(wp core is-installed --path="$WP_PATH" --url="$MAIN_SITE" --quiet); then
echo "WordPress is not installed here: ${WP_PATH}"
exit
fi
# Get a list of site URLs
if $(wp core is-installed --path="$WP_PATH" --url="$MAIN_SITE" --quiet --network);
then
SITE_URLS=`wp site list --fields=url --archived=0 --deleted=0 --format=csv --path="$WP_PATH" --url="$MAIN_SITE" | sed 1d`
else
SITE_URLS=`wp option get siteurl --path="$WP_PATH" --url="$MAIN_SITE"`
fi
#run the cron on the main site for once only on 1st node.
if [ $THISSERVERIS == 1 ]; then
printf "Running on Main site\n"
wp cron event run --due-now --path="$WP_PATH"
fi
# Loop through all the sites
for SITE_URL in $SITE_URLS
do
MD5HASH=$(echo -n $SITE_UR | md5sum | cut -c 1-1)
RETURNEDVALUE=$(( ( ($MD5HASH + 1) % $MAXSERVERS) + 1 ))
if [ $RETURNEDVALUE != $THISSERVERIS ]; then
printf "\nSkipping this subsite as it will be processed by another server node: $SITE_UR \n"
continue
fi
# Run all event hooks that are due
wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH"
done
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It would seem that instead of looping through all the jobs and running them even if they weren't due (which this does if i understand correctly), you could just run:
Like answered here: https://wordpress.stackexchange.com/a/184113