Updating WordPress plugins can be a HUGE hassle. Indeed, most webmasters are only aware of their ability to manually click the “Update” link next to various plugins in their WP Admin control panel, and aren’t even aware of other more automated options such as the free Easy Updates Manager plugin, among others. But there’s an even more direct option that’s “higher up” the server stack, which calls for a Linux shell script to update your WordPress plugins via a cron job.
Now, in most cases, this method is probably overkill. But there are times when it is the perfect solution, such as when you need to make sure a client or website always has the latest version of a plugin installed, say, via the Must-Use plugin directory (which hides the ability to deactivate or delete said plugins from your client).
WARNING: Before trying this script, make sure that you don’t already have the below plugins (etc) installed to your regular
/plugins/ directory as the tutorial below is installing plugins to the
/mu-plugins/ directory (“Must Use” Plugins) which could conflict with a plugin of the same name or function already existing elsewhere. Also keep in mind that several types of WordPress plugins will NOT function properly when installed as Must-Use (a.k.a. Multi-User) plugins.
Note: you must have root access to your server in order to properly configure this cron job script.
First, let’s create a new file i.e.
muplugs-cron in which our bash script is going to reside:
cd /home/example sudo touch /home/example/muplugs-cron sudo nano /home/example/muplugs-cron
Copy and paste the below script into your newly created file (change username accordingly):
Since we are copying plugin files to our
mu-plugins (or plugins) directory, there is no reason to preserve mode (permissions), ownership, or otherwise. The only attributes you may need to preserve are timestamps and symlinks, and even that is debatable. We use the
-d flag to tell our script to preserve symlinks while not “following” them during the copy process.
Important: notice that
sudo is not necessary as we will be adding this shell script to the root user’s crontab. Including
sudo in a shell script requires a user’s password to be stored in plaintext = very bad idea! Also, keep in mind that
unzip is not installed by default on most Linux servers so be sure that your server has that properly installed before activating this script.
Save variables in separate
config file below:
Code last updated 6 August, 2016
#!/bin/bash source config cd /tmp/ wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/autoloader.txt wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/wp-password-bcrypt.txt wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/better-search-replace.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/cloudflare.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/disable-embeds.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/disable-emojis.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/disable-xml-rpc.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/error-log-monitor.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/opcache.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/revision-control.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/stops-core-theme-and-plugin-updates.zip wget --timestamping http://mirrors.littlebizzy.com/mu-plugins/wpstagecoach.zip mv autoloader.txt autoloader.php mv wp-password-bcrypt.txt wp-password-bcrypt.php unzip /tmp/better-search-replace.zip unzip /tmp/cloudflare.zip unzip /tmp/disable-embeds.zip unzip /tmp/disable-emojis.zip unzip /tmp/disable-xml-rpc.zip unzip /tmp/error-log-monitor.zip unzip /tmp/opcache.zip unzip /tmp/revision-control.zip unzip /tmp/stops-core-theme-and-plugin-updates.zip unzip /tmp/wpstagecoach.zip rm -R /home/$user/www/wp-content/mu-plugins/better-search-replace rm -R /home/$user/www/wp-content/mu-plugins/cloudflare rm -R /home/$user/www/wp-content/mu-plugins/disable-embeds rm -R /home/$user/www/wp-content/mu-plugins/disable-emojis rm -R /home/$user/www/wp-content/mu-plugins/disable-xml-rpc rm -R /home/$user/www/wp-content/mu-plugins/error-log-monitor rm -R /home/$user/www/wp-content/mu-plugins/opcache rm -R /home/$user/www/wp-content/mu-plugins/revision-control rm -R /home/$user/www/wp-content/mu-plugins/stops-core-theme-and-plugin-updates rm -R /home/$user/www/wp-content/mu-plugins/wpstagecoach cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/autoloader.php /home/$user/www/wp-content/mu-plugins/autoloader.php cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/wp-password-bcrypt.php /home/$user/www/wp-content/mu-plugins/wp-password-bcrypt.php cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/better-search-replace /home/$user/www/wp-content/mu-plugins/better-search-replace cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/cloudflare /home/$user/www/wp-content/mu-plugins/cloudflare cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/disable-embeds /home/$user/www/wp-content/mu-plugins/disable-embeds cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/disable-emojis /home/$user/www/wp-content/mu-plugins/disable-emojis cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/disable-xml-rpc /home/$user/www/wp-content/mu-plugins/disable-xml-rpc cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/error-log-monitor /home/$user/www/wp-content/mu-plugins/error-log-monitor cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/opcache /home/$user/www/wp-content/mu-plugins/opcache cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/revision-control /home/$user/www/wp-content/mu-plugins/revision-control cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/stops-core-theme-and-plugin-updates /home/$user/www/wp-content/mu-plugins/stops-core-theme-and-plugin-updates cp -R -d --remove-destination --preserve=timestamps --no-preserve=mode,ownership /tmp/wpstagecoach /home/$user/www/wp-content/mu-plugins/wpstagecoach rm -R -f /tmp/autoloader.php rm -R -f /tmp/wp-password-bcrypt.php rm -R -f /tmp/better-search-replace /tmp/better-search-replace.zip rm -R -f /tmp/cloudflare /tmp/cloudflare.zip rm -R -f /tmp/disable-embeds /tmp/disable-embeds.zip rm -R -f /tmp/disable-emojis /tmp/disable-emojis.zip rm -R -f /tmp/disable-xml-rpc /tmp/disable-xml-rpc.zip rm -R -f /tmp/error-log-monitor /tmp/error-log-monitor.zip rm -R -f /tmp/opcache /tmp/opcache.zip rm -R -f /tmp/revision-control /tmp/revision-control.zip rm -R -f /tmp/stops-core-theme-and-plugin-updates /tmp/stops-core-theme-and-plugin-updates.zip rm -R -f /tmp/wpstagecoach /tmp/wpstagecoach.zip source /home/$user/perms
Finish up the script by making sure its executable and owned by the root user:
sudo chmod +x /home/example/muplugs-cron sudo chown root:root /home/example/muplugs-cron
You will notice that our script file is merely named "muplugins" without any file extension, such as .sh or otherwise. This is because we’ve already made the script executable and included a "shebang" line at the top of our script to clarify to the root user which type of script this is (bash), so there is no need for a file extension type.
Lastly, we need to add this script to the root’s crontab file for scheduling:
sudo crontab -e
At the bottom of the crontab file, paste the below code (change username).
/dev/null 2>&1 will prevent any cron reporting attempts being sent via email, which is best in the case that your VPS does not have an active mail server. The below cron job is scheduled to run once every 24 hours, which should be more than enough for most plugins:
0 0 * * * /home/example/muplugs-cron > /dev/null 2>&1
For good measure, test and then restart the Nginx service and then check that the script is working:
sudo nginx -t sudo service nginx restartLast modified: 7 Aug, 2016
"After being hosted on GoDaddy for years, I didn't realize how negatively it was impacting my search traffic. Soon after moving to LittleBizzy, my homepage went from page 3 on Google to #1 world-wide for my target market, and I also reached the top 3 on Google Maps, with no additional SEO work."Juliette S.
"Before moving to LittleBizzy, whenever our news website was featured on the Drudge Report, it often slowed to a crawl or even froze up during big traffic spikes. Now, that never happens anymore, and we've been able to focus on publishing more articles instead of worrying about our web hosting."Tony H.
"The research by Amazon is definitely true, because our slow WooCommerce store was bleeding sales. After LittleBizzy stabilized our performance and moved us closer to our target customers, we saw a measurable improvement in shopping cart checkouts, esp. during holidays... much better!"Mohammed H.
No contracts, free migration, and free SSL forever. What are you waiting for? Order Hosting Now.
WordPress Gossip, Technical SEO News, And Other Goodies.
Free. Unsubscribe anytime.