Last active
March 12, 2026 16:55
-
-
Save danielpost/883af64b4b8111b5f83e0d20bf738ede to your computer and use it in GitHub Desktop.
WordPress local site setup script for Herd
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 | |
| set -euo pipefail | |
| green() { echo -e "\033[32m$1\033[0m"; } | |
| red() { echo -e "\033[31m$1\033[0m"; } | |
| yellow() { echo -e "\033[33m$1\033[0m"; } | |
| bold() { echo -e "\033[1m$1\033[0m"; } | |
| WP_TITLE="" | |
| WP_ADMIN_USER="" | |
| WP_ADMIN_PASSWORD="" | |
| WP_ADMIN_EMAIL="" | |
| usage() { | |
| echo "Usage: $0 [-t <title>] [-u <username>] [-p <password>] [-e <email>]" | |
| echo " -t <title> : Set WordPress site title" | |
| echo " -u <username> : Set admin username" | |
| echo " -p <password> : Set admin password" | |
| echo " -e <email> : Set admin email" | |
| echo " -h, --help : Display this help message" | |
| exit 1 | |
| } | |
| while [[ $# -gt 0 ]]; do | |
| case $1 in | |
| -t) WP_TITLE="$2"; shift 2 ;; | |
| -u) WP_ADMIN_USER="$2"; shift 2 ;; | |
| -p) WP_ADMIN_PASSWORD="$2"; shift 2 ;; | |
| -e) WP_ADMIN_EMAIL="$2"; shift 2 ;; | |
| -h | --help) usage ;; | |
| *) | |
| echo "Unknown option: $1" | |
| usage | |
| ;; | |
| esac | |
| done | |
| prompt_for_value() { | |
| local var_name=$1 | |
| local prompt_text=$2 | |
| if [[ -z "${!var_name}" ]]; then | |
| read -rp "$prompt_text: " value < /dev/tty | |
| printf -v "$var_name" '%s' "$value" | |
| fi | |
| } | |
| prompt_for_value WP_TITLE "Enter WordPress site title" | |
| prompt_for_value WP_ADMIN_USER "Enter admin username" | |
| prompt_for_value WP_ADMIN_PASSWORD "Enter admin password" | |
| prompt_for_value WP_ADMIN_EMAIL "Enter admin email" | |
| while ! echo "$WP_ADMIN_EMAIL" | grep -qE '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'; do | |
| red "Invalid email address. Please provide a valid email." | |
| WP_ADMIN_EMAIL="" | |
| prompt_for_value WP_ADMIN_EMAIL "Enter admin email" | |
| done | |
| for cmd in wp mysql herd; do | |
| if ! command -v "$cmd" &>/dev/null; then | |
| red "$cmd is not installed. Please install it first." | |
| exit 1 | |
| fi | |
| done | |
| DIRS=() | |
| while IFS= read -r line; do | |
| DIRS+=("$line") | |
| done < <(herd paths | jq -r '.[]') | |
| if [[ ${#DIRS[@]} -eq 0 ]]; then | |
| red "No directories found from 'herd paths'. Please check your Herd configuration." | |
| exit 1 | |
| fi | |
| echo "Available directories:" | |
| for i in "${!DIRS[@]}"; do | |
| echo "$((i + 1))) ${DIRS[$i]}" | |
| done | |
| read -rp "Enter the number of the directory you want to use: " DIR_CHOICE < /dev/tty | |
| if [[ ! "$DIR_CHOICE" =~ ^[0-9]+$ ]] || ((DIR_CHOICE < 1 || DIR_CHOICE > ${#DIRS[@]})); then | |
| red "Invalid selection. Exiting." | |
| exit 1 | |
| fi | |
| CHOSEN_DIR="${DIRS[$((DIR_CHOICE - 1))]}" | |
| yellow "You selected: $CHOSEN_DIR" | |
| read -rp "Enter the new site folder name: " SITE_NAME < /dev/tty | |
| if [[ -z "$SITE_NAME" ]]; then | |
| red "Folder name cannot be empty. Exiting." | |
| exit 1 | |
| fi | |
| mkdir -p "$CHOSEN_DIR/$SITE_NAME" && cd "$CHOSEN_DIR/$SITE_NAME" | |
| DB_USER="root" | |
| DB_PASSWORD="" | |
| DB_HOST="127.0.0.1" | |
| WP_URL="$SITE_NAME.test" | |
| DB_NAME="$SITE_NAME" | |
| echo "Using the following values:" | |
| echo "WordPress URL: $(green "$WP_URL")" | |
| echo "Database Name: $(green "$DB_NAME")" | |
| echo "WordPress Title: $(green "$WP_TITLE")" | |
| echo "Admin Username: $(green "$WP_ADMIN_USER")" | |
| echo "Admin Email: $(green "$WP_ADMIN_EMAIL")" | |
| wp core download | |
| wp config create --dbname="$DB_NAME" --dbuser="$DB_USER" --dbpass="$DB_PASSWORD" --dbhost="$DB_HOST" | |
| wp db create | |
| wp core install --url="$WP_URL" --title="$WP_TITLE" --admin_user="$WP_ADMIN_USER" --admin_password="$WP_ADMIN_PASSWORD" --admin_email="$WP_ADMIN_EMAIL" --skip-email | |
| wp site empty --yes | |
| wp search-replace http https | |
| herd secure | |
| wp rewrite structure '/%postname%' | |
| wp config set WP_DEBUG true --raw | |
| wp config set WP_DEBUG_LOG true --raw | |
| wp config set SCRIPT_DEBUG true --raw | |
| wp config set WP_ENVIRONMENT_TYPE local | |
| wp config set WP_DEVELOPMENT_MODE all | |
| echo | |
| bold "$(green "Success: Your new WordPress site on Herd has been created!")" | |
| echo "- Site URL: $(green "$WP_URL")" | |
| echo "- Database Name: $(green "$DB_NAME")" | |
| echo "- Admin username: $(green "$WP_ADMIN_USER")" | |
| echo "- Admin password: $(green "$WP_ADMIN_PASSWORD")" | |
| echo "- Admin email: $(green "$WP_ADMIN_EMAIL")" | |
| echo | |
| echo "Run '$(green "cd $CHOSEN_DIR/$SITE_NAME")' to navigate to the site directory." | |
| read -rp "Would you like to open the site in your browser? (y/n) " -n 1 REPLY < /dev/tty | |
| echo | |
| if [[ $REPLY =~ ^[Yy]$ ]]; then | |
| if [[ "$OSTYPE" == "darwin"* ]]; then | |
| open "https://$WP_URL" | |
| elif [[ "$OSTYPE" == "linux-gnu"* ]]; then | |
| xdg-open "https://$WP_URL" | |
| else | |
| echo "Unable to automatically open the browser on this operating system." | |
| echo "Please visit https://$WP_URL manually." | |
| fi | |
| fi | |
| echo | |
| bold "$(green "Installation complete. Enjoy your new WordPress site!")" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment