Created a new bash script to update all installations of WordPress server-wide (core, themes and plugins). It works a treat!
#!/bin/sh # Automatically update WordPress based on the local configuration of AUTO_UPDATE in the wp-config.php file of each WordPress installation. # Usage: sh ./wordpress_auto_update.sh <username> (optional) <force> (optional) SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin force=false cd ~; if [ -n "$1" ] && [ "$1" != "" ]; then username="$1" if [ ! -d /home/$username/ ]; then echo "Directory not found: /home/$username/" exit; fi else username='*' fi if [ -n "$2" ] && [ "$2" == "force" ] && [ -n "$1" ]; then force=true fi if [ -n "$username" ]; then userpath="/home/$username/*" else userpath="/home/$username/public_html/" fi echo "Searching for WordPress installations at $userpath" find $userpath -regextype posix-extended -regex '^/home/([a-z]\w+)/(public_html|dev.*)/([a-z]\w+/)?wp-config\.php$' -type f -print0 | while read -d $'\0' file; do path=${file:0:${#file}-14} username=$(sed -r 's#^/home/([^/]+)/.+$#\1#' <<< $path) if [ $force == true ] || [ $(grep -iEl "define\s?[(]\s?['\"]AUTO_UPDATE['\"],\s?['\"]?(1|true|plugins?|themes?|core)['\"]?\s?[)];" "$file") ]; then if [ $force == true ] || [ $(grep -iEl "define\s?[(]\s?['\"]AUTO_UPDATE['\"],\s?['\"]?(1|true)['\"]?\s?[)];" "$file") ]; then echo "Checking WordPress Core, Themes and Plugins $path" wp --allow-root --path=$path core update wp --allow-root --path=$path theme update --all wp --allow-root --path=$path plugin update --all wp --allow-root --path=$path core language update else if [ $(grep -iEl "define\s?[(]\s?['\"]AUTO_UPDATE['\"],\s?['\"]?core['\"]?\s?[)];" "$file") ]; then echo "Checking WordPress Core $path"; wp --allow-root --path=$path core update; wp --allow-root --path=$path core language update; elif [ $(grep -iEl "define\s?[(]\s?['\"]AUTO_UPDATE['\"],\s?['\"]?themes?['\"]?\s?[)];" "$file") ]; then echo "Checking WordPress Themes $path"; wp --allow-root --path=$path core update; else echo "Checking WordPress Plugins at $path"; wp --allow-root --path=$path plugin update --all; fi fi chown -R --quiet --from=root.root $username.$username $path/{wp-*,index.*,license.*,readme.*,xmlrpc.php} fi done;
To activate this, add this to wp-config.php:
/* WordPress Auto-update for core, themes and plugins */ define('AUTO_UPDATE', TRUE); // Accepted: TRUE, 'core', 'themes', 'plugins'
This can be run in shell, as root, with two optional arguments:
sh ./wordpress_auto_update.sh <username> force
This requires the WP CLI. It can run at set times using cron.
If you want your WordPress website installed and updated for free, get in touch.
Last updated on
I’ve updated the script so that it runs with cron.
I’ve updated this to handle core only and plugin only updates.
Modified the script to check and update themes.
Another update to reset the permissions from root to the local user after the WordPress update.
Improved the search for WordPress installations. Now it’s slower, but better.
Suggestions to improve the “find” command are welcome!