68 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| # A bash script to replace a local database with one on a server
 | |
| # It relies on wp being installed on both the server and the local machine
 | |
| # - Note, if using xampp, mamp .. you should make sure that mysql and php are
 | |
| #         both in your $PATH
 | |
| # On your local machine, it assumes that WP is in a folder called public_html
 | |
| 
 | |
| # SSH entry from .ssh/config
 | |
| sshKey="$1"
 | |
| # The folder so search for on the remote server
 | |
| # the home folder is grepped for this so public should get public/ and public_html/
 | |
| sshFolder="${2:-public}"
 | |
| 
 | |
| # If the ssh entry isn't given, exit with a warning
 | |
| if [ -z "$sshKey" ]; then
 | |
| 	echo "Add an SSH entry"
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # This command exits with a non-zero exit code if not a multisite
 | |
| wp site list 2>/dev/null >/dev/null
 | |
| if [ $? -eq 0 ]; then
 | |
| 	multisite="true"
 | |
| else
 | |
| 	multisite="false"
 | |
| fi
 | |
| 
 | |
| # Finds the local public_html folder
 | |
| public_html="${PWD%/public_html*}/public_html"
 | |
| # Gets the folder that we should Copy from
 | |
| sshFolder="$(ssh "$sshKey" ls | grep "$sshFolder")"
 | |
| # gets the fell path of the folder for the path replace later on
 | |
| sshFolderPath="$(ssh "$sshKey" "cd $sshFolder; pwd")"
 | |
| if [ "$multisite" == "true" ]; then
 | |
| 	# Gets an array of domains on the remote server
 | |
| 	remoteDomains=($(ssh "$sshKey" "cd $sshFolder; wp site list 2> /dev/null" | cut -f 2 | tail -n +2 | sed -E "s/https?:\/\///g" | sed -E "s/\/$//g"))
 | |
| 	# Gets an array of domains on the local server
 | |
| 	localDomains=($(wp site list 2> /dev/null | cut -f 2 | tail -n +2 | sed -E "s/https?:\/\///g" | sed -E "s/\/$//g"))
 | |
| else
 | |
| 	# puts the site url in an array
 | |
| 	remoteDomains=($(ssh "$sshKey" "cd $sshFolder; wp option get siteurl 2> /dev/null" | sed -E "s/https?:\/\///g" | sed -E "s/\/$//g"))
 | |
| 	# Gets an array of domains on the local server
 | |
| 	localDomains=($(wp option get siteurl 2> /dev/null | sed -E "s/https?:\/\///g" | sed -E "s/\/$//g"))
 | |
| fi
 | |
| 
 | |
| echo "Downloading database"
 | |
| # Dumps the database into our public_html folder
 | |
| ssh "$sshKey" "cd $sshFolder; wp db export -" > "$public_html"/db.dump
 | |
| 
 | |
| # Imports the new database
 | |
| wp db import "$public_html"/db.dump 2> /dev/null > /dev/null
 | |
| 
 | |
| # Loops through the domains and does a search and replace
 | |
| for (( i = 0; i < ${#remoteDomains[@]}; i++ )); do
 | |
| 	echo "${remoteDomains[$i]} -> ${localDomains[$i]}"
 | |
| 	wp search-replace --all-tables --url="${remoteDomains[$i]}" "${remoteDomains[$i]}" "${localDomains[$i]}" 2> /dev/null > /dev/null
 | |
| done
 | |
| 
 | |
| # Searches and replaces the paths
 | |
| echo "$sshFolderPath -> $public_html"
 | |
| wp search-replace --all-tables --url="${localDomains[0]}" "$sshFolderPath" "$public_html" 2> /dev/null > /dev/null
 | |
| 
 | |
| # Removes the db.dump that we created
 | |
| rm "$public_html"/db.dump
 | |
| 
 | |
| #Makes sure everything in the uploads folder on the server is also on the local
 | |
| rsync -ruh --progress "${sshKey}:${sshFolder}/wp-content/uploads/" "${public_html}/wp-content/uploads"
 |