# ==========================================
# CONFIG — edit these before running
# ==========================================
SITE_URL="https://frozenmotorsports.com"
SITE_TITLE="Frozen Motorsports"
SITE_TAGLINE="Off-Road. Overland. Filmed."
ADMIN_USER="chris"
ADMIN_EMAIL="chris@frozenmotorsports.com"
ADMIN_PASSWORD=""   # Leave blank to be prompted, or set here
BUSINESS_ADDRESS_CITY="Huntington"
BUSINESS_ADDRESS_STATE="IN"
BUSINESS_ADDRESS_COUNTRY="US"
CURRENCY="USD"
 
# Theme to activate (must be uploaded to wp-content/themes/ first)
THEME_SLUG="frozen-motorsports"
 
# ==========================================
# Helper functions
# ==========================================
log() { echo -e "\033[1;36m[FZN]\033[0m $*"; }
ok()  { echo -e "\033[1;32m [✓]\033[0m $*"; }
warn(){ echo -e "\033[1;33m [!]\033[0m $*"; }
die() { echo -e "\033[1;31m [✗]\033[0m $*" >&2; exit 1; }
 
# ==========================================
# Preflight checks
# ==========================================
log "Preflight checks..."
 
command -v wp >/dev/null || die "WP-CLI not found. Install it or run commands manually via WP admin."
wp core is-installed --quiet || die "WordPress is not installed yet. Run 'wp core install' first or install via your host's installer."
 
ok "WP-CLI found: $(wp --version)"
ok "WordPress installed: $(wp core version)"
 
# ==========================================
# Core settings
# ==========================================
log "Configuring core settings..."
 
wp option update blogname "$SITE_TITLE"
wp option update blogdescription "$SITE_TAGLINE"
wp option update admin_email "$ADMIN_EMAIL"
wp option update siteurl "$SITE_URL"
wp option update home "$SITE_URL"
wp option update timezone_string "America/Indiana/Indianapolis"
wp option update date_format "F j, Y"
wp option update time_format "g:i a"
wp option update start_of_week 1
 
# Permalinks: post name (pretty URLs)
wp rewrite structure '/%postname%/' --hard
wp rewrite flush --hard
 
ok "Core settings configured"
 
# ==========================================
# Clean up default content
# ==========================================
log "Removing default WordPress clutter..."
 
# Delete "Hello world!" post
wp post delete 1 --force 2>/dev/null || true
# Delete "Sample Page"
wp post delete 2 --force 2>/dev/null || true
# Delete "Privacy Policy" template (we'll make our own)
wp post delete 3 --force 2>/dev/null || true
# Delete default comment
wp comment delete 1 --force 2>/dev/null || true
# Remove "Uncategorized" content? Keep the category, but rename.
wp term update category 1 --name="General" --slug="general" 2>/dev/null || true
 
# Disable comments globally by default (blog posts can re-enable)
wp option update default_comment_status closed
wp option update default_ping_status closed
 
# Disable pingbacks (spam vector)
wp option update default_pingback_flag 0
 
ok "Defaults cleaned"
 
# ==========================================
# Install & activate plugins
# ==========================================
log "Installing essential plugins..."
 
PLUGINS=(
    "woocommerce"                         # Commerce engine
    "wordpress-seo"                        # Yoast SEO
    "wp-mail-smtp"                         # Reliable transactional email
    "wordfence"                            # Security / firewall
    "w3-total-cache"                       # Page caching
    "contact-form-7"                       # Contact forms
    "mailchimp-for-wp"                     # Email capture (or swap for Klaviyo plugin)
    "updraftplus"                          # Backups
    "redirection"                          # 301/302 redirects
    "wp-super-cache"                       # Backup cache option if w3tc conflicts
)
 
# Install but don't activate security/cache plugins yet — they'll ask questions
for plugin in "${PLUGINS[@]}"; do
    if wp plugin is-installed "$plugin"; then
        ok "Already installed: $plugin"
    else
        log "Installing: $plugin"
        wp plugin install "$plugin" --quiet
    fi
done
 
# Activate the essential ones immediately
wp plugin activate woocommerce wordpress-seo wp-mail-smtp contact-form-7 mailchimp-for-wp redirection
 
ok "Plugins installed. Activate security/cache after initial setup to avoid config headaches."
 
# ==========================================
# Remove plugins WordPress pre-installs that you don't want
# ==========================================
log "Removing default plugins..."
wp plugin delete akismet hello 2>/dev/null || true
ok "Bloat removed"
 
# ==========================================
# WooCommerce configuration
# ==========================================
log "Configuring WooCommerce..."
 
# Store address
wp option update woocommerce_store_address "Huntington, IN"
wp option update woocommerce_store_city "$BUSINESS_ADDRESS_CITY"
wp option update woocommerce_default_country "${BUSINESS_ADDRESS_COUNTRY}:${BUSINESS_ADDRESS_STATE}"
wp option update woocommerce_store_postcode "46750"
 
# Currency
wp option update woocommerce_currency "$CURRENCY"
wp option update woocommerce_currency_pos "left"
wp option update woocommerce_price_thousand_sep ","
wp option update woocommerce_price_decimal_sep "."
wp option update woocommerce_price_num_decimals 2
 
# Weight / dimensions
wp option update woocommerce_weight_unit "lbs"
wp option update woocommerce_dimension_unit "in"
 
# Selling locations — US only to start
wp option update woocommerce_allowed_countries "specific"
wp option update woocommerce_specific_allowed_countries '["US"]'
wp option update woocommerce_ship_to_countries "specific"
wp option update woocommerce_specific_ship_to_countries '["US"]'
 
# Enable reviews, ratings
wp option update woocommerce_enable_reviews "yes"
wp option update woocommerce_review_rating_verification_required "yes"
 
# Calculate taxes
wp option update woocommerce_calc_taxes "yes"
wp option update woocommerce_prices_include_tax "no"
wp option update woocommerce_tax_based_on "shipping"
wp option update woocommerce_tax_round_at_subtotal "no"
wp option update woocommerce_tax_display_shop "excl"
wp option update woocommerce_tax_display_cart "excl"
 
# Skip onboarding wizard
wp option update woocommerce_onboarding_profile '{"completed":true,"skipped":true}' --format=json
wp option update woocommerce_task_list_hidden "yes"
 
ok "WooCommerce configured for US / Indiana / USD"
 
# ==========================================
# Create WooCommerce product categories
# ==========================================
log "Creating product categories..."
 
wp wc product_cat create --name="Apparel" --slug="apparel" --description="Tees, hoodies, hats, and outerwear" --user=$ADMIN_USER 2>/dev/null || ok "Apparel exists"
wp wc product_cat create --name="Stickers & Decals" --slug="stickers" --description="Vinyl decals, sticker packs, window stickers" --user=$ADMIN_USER 2>/dev/null || ok "Stickers exists"
wp wc product_cat create --name="Digital Downloads" --slug="digital" --description="LUTs, presets, trail guides, PDFs" --user=$ADMIN_USER 2>/dev/null || ok "Digital exists"
wp wc product_cat create --name="Gear We Use" --slug="gear-we-use" --description="Curated gear and affiliate picks from our own builds" --user=$ADMIN_USER 2>/dev/null || ok "Gear exists"
 
ok "Product categories created"
 
# ==========================================
# Create starter products (4 placeholders to match the launch plan)
# ==========================================
log "Creating starter products..."
 
# 1. Flagship Tee
wp wc product create \
    --name="Flagship Tee — Ice" \
    --type="simple" \
    --regular_price="32.00" \
    --description="Our flagship tee. Heavyweight cotton, soft hand feel, Frozen Motorsports full-chest print in ice white on a charcoal base. Runs true to size." \
    --short_description="Charcoal heavyweight tee with ice-white front print." \
    --status="publish" \
    --manage_stock=true \
    --stock_quantity=50 \
    --weight="0.5" \
    --categories="[{\"slug\":\"apparel\"}]" \
    --user=$ADMIN_USER || warn "Tee may already exist"
 
# 2. Icicle F Sticker Pack
wp wc product create \
    --name="Icicle F Sticker · 3-Pack" \
    --type="simple" \
    --regular_price="6.00" \
    --description="Three die-cut vinyl stickers of the Frozen Motorsports F monogram. Weatherproof, UV-resistant, 3 inches tall. Throw them on your rig, your laptop, your toolbox." \
    --short_description="3 die-cut vinyl F monograms. Weatherproof." \
    --status="publish" \
    --manage_stock=true \
    --stock_quantity=200 \
    --weight="0.1" \
    --categories="[{\"slug\":\"stickers\"}]" \
    --user=$ADMIN_USER || warn "Stickers may already exist"
 
# 3. FPV LUT Pack
wp wc product create \
    --name="FPV LUT Pack · Trail Edition" \
    --type="simple" \
    --virtual=true \
    --downloadable=true \
    --regular_price="19.00" \
    --description="Twelve color grading LUTs tuned for dirt, snow, and overcast forest light. Compatible with Premiere, DaVinci, Final Cut, and LUMAfusion. Shot and graded on Sven." \
    --short_description="12 LUTs built for trail, snow, and forest footage." \
    --status="publish" \
    --categories="[{\"slug\":\"digital\"}]" \
    --user=$ADMIN_USER || warn "LUT pack may already exist"
 
# 4. Recovery Kit Bundle (affiliate placeholder — external product linking out)
wp wc product create \
    --name="Recovery Kit Bundle" \
    --type="external" \
    --regular_price="189.00" \
    --external_url="https://frozenmotorsports.com/the-build/#recovery" \
    --button_text="View the Build" \
    --description="The recovery kit we actually use on Sven. Soft shackles, kinetic rope, winch line extension, tree saver, gloves. Affiliate links — we earn a small commission if you buy through these." \
    --short_description="Our real-world trail recovery kit. Affiliate links." \
    --status="publish" \
    --categories="[{\"slug\":\"gear-we-use\"}]" \
    --user=$ADMIN_USER || warn "Recovery Kit may already exist"
 
ok "Starter products created (4)"
 
# ==========================================
# Create starter pages
# ==========================================
log "Creating site pages..."
 
create_page() {
    local title="$1"
    local slug="$2"
    local content="$3"
    local template="${4:-}"
 
    local existing=$(wp post list --post_type=page --name="$slug" --field=ID --format=ids)
    if [ -n "$existing" ]; then
        ok "Page '$title' exists (ID $existing)"
        return
    fi
 
    local args=(--post_type=page --post_status=publish --post_title="$title" --post_name="$slug" --post_author="$(wp user get $ADMIN_USER --field=ID)" --post_content="$content")
    if [ -n "$template" ]; then
        local id=$(wp post create "${args[@]}" --porcelain)
        wp post meta update "$id" _wp_page_template "$template"
    else
        wp post create "${args[@]}" --porcelain >/dev/null
    fi
    ok "Created: $title"
}
 
create_page "Home" "home" "<!-- Homepage content is rendered by the front-page.php template in the Frozen Motorsports theme. -->"
create_page "The Builds" "the-builds" "<h2>Meet Sven</h2><p>Our flagship build. Spec sheet, mod journal, and every affiliate link we use.</p><p><em>Edit this page in the WordPress admin to add the build spec sheet and journal entries.</em></p>"
create_page "Watch" "watch" "<h2>Latest Content</h2><p>YouTube, Instagram, TikTok — everything we're putting out. Embed the latest video below by pasting its URL on a new line.</p>"
create_page "Services" "services" "<h2>Work With Us</h2><h3>FPV Drone Cinematography</h3><p>From \$850 / half-day. Cinematic aerial and FPV work for dealerships, events, brands, and fellow creators.</p><h3>Build Consultation</h3><p>\$125 / session. 45-minute video call, recorded. Platform specs, realistic use case, vendor shortlist.</p><h3>Brand Partnerships</h3><p>By inquiry. Integrated content, dedicated video, event coverage, or full cross-brand build series. <a href='/media-kit/'>Request the media kit.</a></p>"
create_page "Media Kit" "media-kit" "<h2>Media Kit</h2><p>Audience metrics, rate card, and past collaborations. <a href='/contact/'>Request the PDF.</a></p>"
create_page "Trail Reports" "trail-reports" "<h2>Trail Reports</h2><p>Long-form write-ups of trails we've run, product reviews, and how-tos.</p>"
create_page "About" "about" "<h2>About Frozen Motorsports</h2><p>Huntington, Indiana. One Bronco named Sven. Too much coffee. A full garage. Our full story here.</p>"
create_page "Contact" "contact" "<h2>Contact</h2><p>Paste your Contact Form 7 shortcode below, or use the block editor's form block.</p>[contact-form-7 id=\"replace-me\" title=\"Contact\"]"
 
# ==========================================
# Set homepage and blog page
# ==========================================
log "Setting homepage and blog page..."
 
HOME_ID=$(wp post list --post_type=page --name=home --field=ID --format=ids)
if [ -n "$HOME_ID" ]; then
    wp option update show_on_front "page"
    wp option update page_on_front "$HOME_ID"
    ok "Homepage set to 'Home' (ID $HOME_ID)"
fi
 
# Create and assign Trail Reports as posts page
BLOG_ID=$(wp post list --post_type=page --name=trail-reports --field=ID --format=ids)
if [ -n "$BLOG_ID" ]; then
    wp option update page_for_posts "$BLOG_ID"
    ok "Blog page set to 'Trail Reports' (ID $BLOG_ID)"
fi
 
# ==========================================
# Main navigation menu
# ==========================================
log "Building navigation menu..."
 
MENU_NAME="Primary"
wp menu delete "$MENU_NAME" 2>/dev/null || true
wp menu create "$MENU_NAME"
 
add_menu_page() {
    local slug="$1"
    local id=$(wp post list --post_type=page --name="$slug" --field=ID --format=ids)
    if [ -n "$id" ]; then
        wp menu item add-post "$MENU_NAME" "$id"
    fi
}
 
add_menu_page "home"
# Add shop (auto-created by WooCommerce)
SHOP_ID=$(wp post list --post_type=page --name=shop --field=ID --format=ids)
[ -n "$SHOP_ID" ] && wp menu item add-post "$MENU_NAME" "$SHOP_ID"
add_menu_page "the-builds"
add_menu_page "watch"
add_menu_page "services"
add_menu_page "contact"
 
# Assign to theme location
wp menu location assign "$MENU_NAME" primary 2>/dev/null || warn "Theme's 'primary' menu location will be available once theme is activated"
 
ok "Primary menu built"
 
# ==========================================
# Footer menu
# ==========================================
log "Building footer menu..."
 
FOOTER_MENU="Footer"
wp menu delete "$FOOTER_MENU" 2>/dev/null || true
wp menu create "$FOOTER_MENU"
 
for slug in "about" "services" "media-kit" "trail-reports" "contact"; do
    id=$(wp post list --post_type=page --name="$slug" --field=ID --format=ids)
    [ -n "$id" ] && wp menu item add-post "$FOOTER_MENU" "$id"
done
 
wp menu location assign "$FOOTER_MENU" footer 2>/dev/null || true
 
ok "Footer menu built"
 
# ==========================================
# Activate the Frozen Motorsports theme
# ==========================================
log "Activating the Frozen Motorsports theme..."
 
if wp theme is-installed "$THEME_SLUG"; then
    wp theme activate "$THEME_SLUG"
    ok "Theme activated: $THEME_SLUG"
else
    warn "Theme '$THEME_SLUG' not found in wp-content/themes/"
    warn "Upload the theme folder there, then run: wp theme activate $THEME_SLUG"
fi
 
# ==========================================
# Remove default themes (keep 1 as fallback)
# ==========================================
log "Cleaning up default themes..."
for theme in "twentytwentytwo" "twentytwentythree" "twentytwentyfour" "twentytwentyfive"; do
    if wp theme is-installed "$theme" && [ "$theme" != "twentytwentyfive" ]; then
        wp theme delete "$theme" 2>/dev/null || true
    fi
done
ok "Kept twentytwentyfive as fallback"
 
# ==========================================
# SEO defaults (Yoast)
# ==========================================
log "Setting Yoast SEO defaults..."
 
wp option patch update wpseo_titles title-home-wpseo "$SITE_TITLE — $SITE_TAGLINE" 2>/dev/null || true
wp option patch update wpseo_titles metadesc-home-wpseo "Off-road, overland, and FPV cinematography from Huntington, IN. One built Bronco named Sven and the gear we actually use." 2>/dev/null || true
 
ok "SEO defaults configured"
 
# ==========================================
# Reading settings
# ==========================================
wp option update posts_per_page 10
wp option update blog_public 1   # Allow search engines
 
# ==========================================
# Done
# ==========================================
echo
log "============================================"
log "  Setup complete."
log "============================================"
echo
ok "Site URL:     $SITE_URL"
ok "Admin:        $SITE_URL/wp-admin"
ok "User:         $ADMIN_USER"
echo
warn "Manual steps remaining (see README.md):"
echo "  1. Configure Shopify Payments... wait, wrong platform. Configure your payment gateway (WooCommerce → Settings → Payments)"
echo "  2. Register for Indiana Sales Tax permit and enter rates"
echo "  3. Upload your logo (Appearance → Customize → Site Identity)"
echo "  4. Upload favicon (same screen)"
echo "  5. Configure WP Mail SMTP with a real sender (Gmail, SendGrid, etc.)"
echo "  6. Activate Wordfence and W3 Total Cache after the theme looks good"
echo "  7. Configure Mailchimp for WP (or swap for your email platform)"
echo "  8. Generate Privacy Policy, Terms, Refund, Shipping policies (WooCommerce → Settings → Advanced → Page setup has starters)"
# ==========================================
# CONFIG — edit these
 before running
# ==========================================
SITE_URL="https://frozenmotorsports.com"
SITE_TITLE="Frozen Motorsports"
SITE_TAGLINE="Off-Road. Overland. Filmed."
ADMIN_USER="chris"
ADMIN_EMAIL="chris@frozenmotorsports.com"
ADMIN_PASSWORD=""   # Leave blank to be prompted, or set here
BUSINESS_ADDRESS_CITY="Huntington"
BUSINESS_ADDRESS_STATE="IN"
BUSINESS_ADDRESS_COUNTRY="US"
CURRENCY="USD"
 
# Theme to activate (must be uploaded to wp-content/themes/ first)
THEME_SLUG="frozen-motorsports"
 
# ==========================================
# Helper functions
# ==========================================
log() { echo -e "\033[1;36m[FZN]\033[0m $*"; }
ok()  { echo -e "\033[1;32m [✓]\033[0m $*"; }
warn(){ echo -e "\033[1;33m [!]\033[0m $*"; }
die() { echo -e "\033[1;31m [✗]\033[0m $*" >&2; exit 1; }
 
# ==========================================
# Preflight checks
# ==========================================
log "Preflight checks..."
 
command -v wp >/dev/null || die "WP-CLI not found. Install it or run commands manually via WP admin."
wp core is-installed --quiet || die "WordPress is not installed yet. Run 'wp core install' first or install via your host's installer."
 
ok "WP-CLI found: $(wp --version)"
ok "WordPress installed: $(wp core version)"
 
# ==========================================
# Core settings
# ==========================================
log "Configuring core settings..."
 
wp option update blogname "$SITE_TITLE"
wp option update blogdescription "$SITE_TAGLINE"
wp option update admin_email "$ADMIN_EMAIL"
wp option update siteurl "$SITE_URL"
wp option update home "$SITE_URL"
wp option update timezone_string "America/Indiana/Indianapolis"
wp option update date_format "F j, Y"
wp option update time_format "g:i a"
wp option update start_of_week 1
 
# Permalinks: post name (pretty URLs)
wp rewrite structure '/%postname%/' --hard
wp rewrite flush --hard
 
ok "Core settings configured"
 
# ==========================================
# Clean up default content
# ==========================================
log "Removing default WordPress clutter..."
 
# Delete "Hello world!" post
wp post delete 1 --force 2>/dev/null || true
# Delete "Sample Page"
wp post delete 2 --force 2>/dev/null || true
# Delete "Privacy Policy" template (we'll make our own)
wp post delete 3 --force 2>/dev/null || true
# Delete default comment
wp comment delete 1 --force 2>/dev/null || true
# Remove "Uncategorized" content? Keep the category, but rename.
wp term update category 1 --name="General" --slug="general" 2>/dev/null || true
 
# Disable comments globally by default (blog posts can re-enable)
wp option update default_comment_status closed
wp option update default_ping_status closed
 
# Disable pingbacks (spam vector)
wp option update default_pingback_flag 0
 
ok "Defaults cleaned"
 
# ==========================================
# Install & activate plugins
# ==========================================
log "Installing essential plugins..."
 
PLUGINS=(
    "woocommerce"                         # Commerce engine
    "wordpress-seo"                        # Yoast SEO
    "wp-mail-smtp"                         # Reliable transactional email
    "wordfence"                            # Security / firewall
    "w3-total-cache"                       # Page caching
    "contact-form-7"                       # Contact forms
    "mailchimp-for-wp"                     # Email capture (or swap for Klaviyo plugin)
    "updraftplus"                          # Backups
    "redirection"                          # 301/302 redirects
    "wp-super-cache"                       # Backup cache option if w3tc conflicts
)
 
# Install but don't activate security/cache plugins yet — they'll ask questions
for plugin in "${PLUGINS[@]}"; do
    if wp plugin is-installed "$plugin"; then
        ok "Already installed: $plugin"
    else
        log "Installing: $plugin"
        wp plugin install "$plugin" --quiet
    fi
done
 
# Activate the essential ones immediately
wp plugin activate woocommerce wordpress-seo wp-mail-smtp contact-form-7 mailchimp-for-wp redirection
 
ok "Plugins installed. Activate security/cache after initial setup to avoid config headaches."
 
# ==========================================
# Remove plugins WordPress pre-installs that you don't want
# ==========================================
log "Removing default plugins..."
wp plugin delete akismet hello 2>/dev/null || true
ok "Bloat removed"
 
# ==========================================
# WooCommerce configuration
# ==========================================
log "Configuring WooCommerce..."
 
# Store address
wp option update woocommerce_store_address "Huntington, IN"
wp option update woocommerce_store_city "$BUSINESS_ADDRESS_CITY"
wp option update woocommerce_default_country "${BUSINESS_ADDRESS_COUNTRY}:${BUSINESS_ADDRESS_STATE}"
wp option update woocommerce_store_postcode "46750"
 
# Currency
wp option update woocommerce_currency "$CURRENCY"
wp option update woocommerce_currency_pos "left"
wp option update woocommerce_price_thousand_sep ","
wp option update woocommerce_price_decimal_sep "."
wp option update woocommerce_price_num_decimals 2
 
# Weight / dimensions
wp option update woocommerce_weight_unit "lbs"
wp option update woocommerce_dimension_unit "in"
 
# Selling locations — US only to start
wp option update woocommerce_allowed_countries "specific"
wp option update woocommerce_specific_allowed_countries '["US"]'
wp option update woocommerce_ship_to_countries "specific"
wp option update woocommerce_specific_ship_to_countries '["US"]'
 
# Enable reviews, ratings
wp option update woocommerce_enable_reviews "yes"
wp option update woocommerce_review_rating_verification_required "yes"
 
# Calculate taxes
wp option update woocommerce_calc_taxes "yes"
wp option update woocommerce_prices_include_tax "no"
wp option update woocommerce_tax_based_on "shipping"
wp option update woocommerce_tax_round_at_subtotal "no"
wp option update woocommerce_tax_display_shop "excl"
wp option update woocommerce_tax_display_cart "excl"
 
# Skip onboarding wizard
wp option update woocommerce_onboarding_profile '{"completed":true,"skipped":true}' --format=json
wp option update woocommerce_task_list_hidden "yes"
 
ok "WooCommerce configured for US / Indiana / USD"
 
# ==========================================
# Create WooCommerce product categories
# ==========================================
log "Creating product categories..."
 
wp wc product_cat create --name="Apparel" --slug="apparel" --description="Tees, hoodies, hats, and outerwear" --user=$ADMIN_USER 2>/dev/null || ok "Apparel exists"
wp wc product_cat create --name="Stickers & Decals" --slug="stickers" --description="Vinyl decals, sticker packs, window stickers" --user=$ADMIN_USER 2>/dev/null || ok "Stickers exists"
wp wc product_cat create --name="Digital Downloads" --slug="digital" --description="LUTs, presets, trail guides, PDFs" --user=$ADMIN_USER 2>/dev/null || ok "Digital exists"
wp wc product_cat create --name="Gear We Use" --slug="gear-we-use" --description="Curated gear and affiliate picks from our own builds" --user=$ADMIN_USER 2>/dev/null || ok "Gear exists"
 
ok "Product categories created"
 
# ==========================================
# Create starter products (4 placeholders to match the launch plan)
# ==========================================
log "Creating starter products..."
 
# 1. Flagship Tee
wp wc product create \
    --name="Flagship Tee — Ice" \
    --type="simple" \
    --regular_price="32.00" \
    --description="Our flagship tee. Heavyweight cotton, soft hand feel, Frozen Motorsports full-chest print in ice white on a charcoal base. Runs true to size." \
    --short_description="Charcoal heavyweight tee with ice-white front print." \
    --status="publish" \
    --manage_stock=true \
    --stock_quantity=50 \
    --weight="0.5" \
    --categories="[{\"slug\":\"apparel\"}]" \
    --user=$ADMIN_USER || warn "Tee may already exist"
 
# 2. Icicle F Sticker Pack
wp wc product create \
    --name="Icicle F Sticker · 3-Pack" \
    --type="simple" \
    --regular_price="6.00" \
    --description="Three die-cut vinyl stickers of the Frozen Motorsports F monogram. Weatherproof, UV-resistant, 3 inches tall. Throw them on your rig, your laptop, your toolbox." \
    --short_description="3 die-cut vinyl F monograms. Weatherproof." \
    --status="publish" \
    --manage_stock=true \
    --stock_quantity=200 \
    --weight="0.1" \
    --categories="[{\"slug\":\"stickers\"}]" \
    --user=$ADMIN_USER || warn "Stickers may already exist"
 
# 3. FPV LUT Pack
wp wc product create \
    --name="FPV LUT Pack · Trail Edition" \
    --type="simple" \
    --virtual=true \
    --downloadable=true \
    --regular_price="19.00" \
    --description="Twelve color grading LUTs tuned for dirt, snow, and overcast forest light. Compatible with Premiere, DaVinci, Final Cut, and LUMAfusion. Shot and graded on Sven." \
    --short_description="12 LUTs built for trail, snow, and forest footage." \
    --status="publish" \
    --categories="[{\"slug\":\"digital\"}]" \
    --user=$ADMIN_USER || warn "LUT pack may already exist"
 
# 4. Recovery Kit Bundle (affiliate placeholder — external product linking out)
wp wc product create \
    --name="Recovery Kit Bundle" \
    --type="external" \
    --regular_price="189.00" \
    --external_url="https://frozenmotorsports.com/the-build/#recovery" \
    --button_text="View the Build" \
    --description="The recovery kit we actually use on Sven. Soft shackles, kinetic rope, winch line extension, tree saver, gloves. Affiliate links — we earn a small commission if you buy through these." \
    --short_description="Our real-world trail recovery kit. Affiliate links." \
    --status="publish" \
    --categories="[{\"slug\":\"gear-we-use\"}]" \
    --user=$ADMIN_USER || warn "Recovery Kit may already exist"
 
ok "Starter products created (4)"
 
# ==========================================
# Create starter pages
# ==========================================
log "Creating site pages..."
 
create_page() {
    local title="$1"
    local slug="$2"
    local content="$3"
    local template="${4:-}"
 
    local existing=$(wp post list --post_type=page --name="$slug" --field=ID --format=ids)
    if [ -n "$existing" ]; then
        ok "Page '$title' exists (ID $existing)"
        return
    fi
 
    local args=(--post_type=page --post_status=publish --post_title="$title" --post_name="$slug" --post_author="$(wp user get $ADMIN_USER --field=ID)" --post_content="$content")
    if [ -n "$template" ]; then
        local id=$(wp post create "${args[@]}" --porcelain)
        wp post meta update "$id" _wp_page_template "$template"
    else
        wp post create "${args[@]}" --porcelain >/dev/null
    fi
    ok "Created: $title"
}
 
create_page "Home" "home" "<!-- Homepage content is rendered by the front-page.php template in the Frozen Motorsports theme. -->"
create_page "The Builds" "the-builds" "<h2>Meet Sven</h2><p>Our flagship build. Spec sheet, mod journal, and every affiliate link we use.</p><p><em>Edit this page in the WordPress admin to add the build spec sheet and journal entries.</em></p>"
create_page "Watch" "watch" "<h2>Latest Content</h2><p>YouTube, Instagram, TikTok — everything we're putting out. Embed the latest video below by pasting its URL on a new line.</p>"
create_page "Services" "services" "<h2>Work With Us</h2><h3>FPV Drone Cinematography</h3><p>From \$850 / half-day. Cinematic aerial and FPV work for dealerships, events, brands, and fellow creators.</p><h3>Build Consultation</h3><p>\$125 / session. 45-minute video call, recorded. Platform specs, realistic use case, vendor shortlist.</p><h3>Brand Partnerships</h3><p>By inquiry. Integrated content, dedicated video, event coverage, or full cross-brand build series. <a href='/media-kit/'>Request the media kit.</a></p>"
create_page "Media Kit" "media-kit" "<h2>Media Kit</h2><p>Audience metrics, rate card, and past collaborations. <a href='/contact/'>Request the PDF.</a></p>"
create_page "Trail Reports" "trail-reports" "<h2>Trail Reports</h2><p>Long-form write-ups of trails we've run, product reviews, and how-tos.</p>"
create_page "About" "about" "<h2>About Frozen Motorsports</h2><p>Huntington, Indiana. One Bronco named Sven. Too much coffee. A full garage. Our full story here.</p>"
create_page "Contact" "contact" "<h2>Contact</h2><p>Paste your Contact Form 7 shortcode below, or use the block editor's form block.</p>[contact-form-7 id=\"replace-me\" title=\"Contact\"]"
 
# ==========================================
# Set homepage and blog page
# ==========================================
log "Setting homepage and blog page..."
 
HOME_ID=$(wp post list --post_type=page --name=home --field=ID --format=ids)
if [ -n "$HOME_ID" ]; then
    wp option update show_on_front "page"
    wp option update page_on_front "$HOME_ID"
    ok "Homepage set to 'Home' (ID $HOME_ID)"
fi
 
# Create and assign Trail Reports as posts page
BLOG_ID=$(wp post list --post_type=page --name=trail-reports --field=ID --format=ids)
if [ -n "$BLOG_ID" ]; then
    wp option update page_for_posts "$BLOG_ID"
    ok "Blog page set to 'Trail Reports' (ID $BLOG_ID)"
fi
 
# ==========================================
# Main navigation menu
# ==========================================
log "Building navigation menu..."
 
MENU_NAME="Primary"
wp menu delete "$MENU_NAME" 2>/dev/null || true
wp menu create "$MENU_NAME"
 
add_menu_page() {
    local slug="$1"
    local id=$(wp post list --post_type=page --name="$slug" --field=ID --format=ids)
    if [ -n "$id" ]; then
        wp menu item add-post "$MENU_NAME" "$id"
    fi
}
 
add_menu_page "home"
# Add shop (auto-created by WooCommerce)
SHOP_ID=$(wp post list --post_type=page --name=shop --field=ID --format=ids)
[ -n "$SHOP_ID" ] && wp menu item add-post "$MENU_NAME" "$SHOP_ID"
add_menu_page "the-builds"
add_menu_page "watch"
add_menu_page "services"
add_menu_page "contact"
 
# Assign to theme location
wp menu location assign "$MENU_NAME" primary 2>/dev/null || warn "Theme's 'primary' menu location will be available once theme is activated"
 
ok "Primary menu built"
 
# ==========================================
# Footer menu
# ==========================================
log "Building footer menu..."
 
FOOTER_MENU="Footer"
wp menu delete "$FOOTER_MENU" 2>/dev/null || true
wp menu create "$FOOTER_MENU"
 
for slug in "about" "services" "media-kit" "trail-reports" "contact"; do
    id=$(wp post list --post_type=page --name="$slug" --field=ID --format=ids)
    [ -n "$id" ] && wp menu item add-post "$FOOTER_MENU" "$id"
done
 
wp menu location assign "$FOOTER_MENU" footer 2>/dev/null || true
 
ok "Footer menu built"
 
# ==========================================
# Activate the Frozen Motorsports theme
# ==========================================
log "Activating the Frozen Motorsports theme..."
 
if wp theme is-installed "$THEME_SLUG"; then
    wp theme activate "$THEME_SLUG"
    ok "Theme activated: $THEME_SLUG"
else
    warn "Theme '$THEME_SLUG' not found in wp-content/themes/"
    warn "Upload the theme folder there, then run: wp theme activate $THEME_SLUG"
fi
 
# ==========================================
# Remove default themes (keep 1 as fallback)
# ==========================================
log "Cleaning up default themes..."
for theme in "twentytwentytwo" "twentytwentythree" "twentytwentyfour" "twentytwentyfive"; do
    if wp theme is-installed "$theme" && [ "$theme" != "twentytwentyfive" ]; then
        wp theme delete "$theme" 2>/dev/null || true
    fi
done
ok "Kept twentytwentyfive as fallback"
 
# ==========================================
# SEO defaults (Yoast)
# ==========================================
log "Setting Yoast SEO defaults..."
 
wp option patch update wpseo_titles title-home-wpseo "$SITE_TITLE — $SITE_TAGLINE" 2>/dev/null || true
wp option patch update wpseo_titles metadesc-home-wpseo "Off-road, overland, and FPV cinematography from Huntington, IN. One built Bronco named Sven and the gear we actually use." 2>/dev/null || true
 
ok "SEO defaults configured"
 
# ==========================================
# Reading settings
# ==========================================
wp option update posts_per_page 10
wp option update blog_public 1   # Allow search engines
 
# ==========================================
# Done
# ==========================================
echo
log "============================================"
log "  Setup complete."
log "============================================"
echo
ok "Site URL:     $SITE_URL"
ok "Admin:        $SITE_URL/wp-admin"
ok "User:         $ADMIN_USER"
echo
warn "Manual steps remaining (see README.md):"
echo "  1. Configure Shopify Payments... wait, wrong platform. Configure your payment gateway (WooCommerce → Settings → Payments)"
echo "  2. Register for Indiana Sales Tax permit and enter rates"
echo "  3. Upload your logo (Appearance → Customize → Site Identity)"
echo "  4. Upload favicon (same screen)"
echo "  5. Configure WP Mail SMTP with a real sender (Gmail, SendGrid, etc.)"
echo "  6. Activate Wordfence and W3 Total Cache after the theme looks good"
echo "  7. Configure Mailchimp for WP (or swap for your email platform)"
echo "  8. Generate Privacy Policy, Terms, Refund, Shipping policies (WooCommerce → Settings → Advanced → Page setup has starters)"
/ 03 Custom Fabrication

Built to order,
built once.

One-off brackets, bumpers, skid plates, and rigs that don’t exist off the shelf. Send me what you’re trying to accomplish and I’ll tell you honestly whether I’m the right shop for the job, ballpark timing, and cost.

What’s been
fabricated.

Dual Battery Tray

3/16″ aluminum, laser-cut and TIG welded. Mounts behind passenger seat with isolation hardware.

JT PLATFORM · 2025

Camera Cage Mount

Picatinny-style overhead rail for GoPro and FPV drone mounting. Clamps to factory sport bar without drilling.

UNIVERSAL · 2025

Mid-Chassis Skid Plate

Custom 1/4″ AR400 plate for a non-Jeep application. Extended coverage for transfer case and rear fuel lines.

FORD RAPTOR · 2024