- Adopción sin filtros ni etiquetas: acceso a Perros y Gatos, tarjetas de foto y nombre. - Ficha nueva: galería, vídeo, fecha de nacimiento o edad aproximada, carácter, necesidades, convivencia y hogar que buscamos (textos por idioma, datos compartidos). - Estados disponible / en proceso / adoptado y animales destacados. - Botón «Quiero conocerlo/la» con formulario breve (animal incluido) y confirmación. - Botones para compartir cada ficha (WhatsApp, Facebook, copiar enlace). - Portada corta según la propuesta del cliente; donaciones, cifras, etc. ocultas. - Páginas Acoge y Preguntas frecuentes, menú con submenús, sin hotel. - Aviso de cita previa y lista de ayuda material editables desde el panel. - Plugin núcleo dividido en módulos (i18n, animales, formularios, APIs). - Migración 5 idempotente: respeta las páginas editadas por el cliente. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
187 lines
7.2 KiB
Bash
187 lines
7.2 KiB
Bash
#!/bin/bash
|
|
# Configuración inicial idempotente de WordPress para Gure Ametsa Bi Lagun.
|
|
# Se ejecuta en segundo plano en cada arranque del contenedor.
|
|
set -uo pipefail
|
|
|
|
log() { echo "[ga-setup] $*"; }
|
|
|
|
WP_PATH=/var/www/html
|
|
SRC=/usr/src/gure-ametsa
|
|
export WP_CLI_CACHE_DIR=/tmp/wp-cli-cache
|
|
|
|
wp_() { runuser -u www-data -- wp --path="$WP_PATH" "$@"; }
|
|
|
|
# 1. Esperar a que el entrypoint oficial copie WordPress y genere wp-config.php
|
|
for _ in $(seq 1 120); do
|
|
[[ -f "$WP_PATH/wp-config.php" && -f "$WP_PATH/wp-includes/version.php" ]] && break
|
|
sleep 1
|
|
done
|
|
|
|
# 2. Sincronizar tema y mu-plugins propios (siempre, para que las actualizaciones de imagen se apliquen)
|
|
mkdir -p "$WP_PATH/wp-content/themes" "$WP_PATH/wp-content/mu-plugins" "$WP_PATH/wp-content/uploads"
|
|
rm -rf "$WP_PATH/wp-content/themes/gure-ametsa"
|
|
cp -r "$SRC/themes/gure-ametsa" "$WP_PATH/wp-content/themes/"
|
|
cp -r "$SRC/mu-plugins/." "$WP_PATH/wp-content/mu-plugins/"
|
|
# Polylang: se copia solo si no existe (después se actualiza desde el panel)
|
|
if [[ ! -d "$WP_PATH/wp-content/plugins/polylang" ]]; then
|
|
mkdir -p "$WP_PATH/wp-content/plugins"
|
|
cp -r "$SRC/plugins/polylang" "$WP_PATH/wp-content/plugins/"
|
|
fi
|
|
chown -R www-data:www-data "$WP_PATH/wp-content"
|
|
log "Tema y mu-plugins sincronizados"
|
|
|
|
# .htaccess para enlaces permanentes bonitos
|
|
if [[ ! -f "$WP_PATH/.htaccess" ]]; then
|
|
cat > "$WP_PATH/.htaccess" <<'EOF'
|
|
# BEGIN WordPress
|
|
<IfModule mod_rewrite.c>
|
|
RewriteEngine On
|
|
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
|
|
RewriteBase /
|
|
RewriteRule ^index\.php$ - [L]
|
|
RewriteCond %{REQUEST_FILENAME} !-f
|
|
RewriteCond %{REQUEST_FILENAME} !-d
|
|
RewriteRule . /index.php [L]
|
|
</IfModule>
|
|
# END WordPress
|
|
EOF
|
|
chown www-data:www-data "$WP_PATH/.htaccess"
|
|
fi
|
|
|
|
# 3. Esperar a la base de datos
|
|
for i in $(seq 1 60); do
|
|
if php -r '
|
|
$h = getenv("WORDPRESS_DB_HOST") ?: "db"; $p = 3306;
|
|
if (strpos($h, ":") !== false) { [$h, $p] = explode(":", $h, 2); }
|
|
$m = @new mysqli($h, getenv("WORDPRESS_DB_USER"), getenv("WORDPRESS_DB_PASSWORD"), getenv("WORDPRESS_DB_NAME"), (int) $p);
|
|
exit($m->connect_errno ? 1 : 0);'; then
|
|
break
|
|
fi
|
|
[[ $i -eq 60 ]] && { log "La base de datos no responde; se aborta la configuración"; exit 1; }
|
|
sleep 2
|
|
done
|
|
|
|
# 4. Instalar WordPress si hace falta
|
|
if ! wp_ core is-installed 2>/dev/null; then
|
|
: "${WP_URL:?Falta WP_URL}" "${WP_ADMIN_USER:?Falta WP_ADMIN_USER}" "${WP_ADMIN_PASSWORD:?Falta WP_ADMIN_PASSWORD}" "${WP_ADMIN_EMAIL:?Falta WP_ADMIN_EMAIL}"
|
|
log "Instalando WordPress en $WP_URL"
|
|
wp_ core install \
|
|
--url="$WP_URL" \
|
|
--title="${WP_TITLE:-Gure Ametsa Bi Lagun}" \
|
|
--admin_user="$WP_ADMIN_USER" \
|
|
--admin_password="$WP_ADMIN_PASSWORD" \
|
|
--admin_email="$WP_ADMIN_EMAIL" \
|
|
--skip-email || { log "Fallo en la instalación"; exit 1; }
|
|
fi
|
|
|
|
# 5. Configuración por etapas (cada etapa se ejecuta una sola vez)
|
|
VERSION=$(wp_ option get ga_setup_version 2>/dev/null || echo 0)
|
|
[[ "$VERSION" =~ ^[0-9]+$ ]] || VERSION=0
|
|
|
|
# Etapa 2: idiomas, tema, contenido inicial
|
|
if (( VERSION < 2 )); then
|
|
log "Configurando el sitio por primera vez"
|
|
|
|
# Idiomas, zona horaria y ajustes generales
|
|
{ wp_ language core install es_ES && wp_ site switch-language es_ES; } || log "No se pudo instalar es_ES (¿sin internet?)"
|
|
wp_ language core install eu || log "No se pudo instalar eu (¿sin internet?)"
|
|
wp_ option update blogdescription "Adopta y cambia dos mundos · Hondarribia"
|
|
wp_ option update timezone_string "Europe/Madrid"
|
|
wp_ option update start_of_week 1
|
|
wp_ option update default_comment_status closed
|
|
wp_ option update default_ping_status closed
|
|
wp_ rewrite structure '/%postname%/'
|
|
|
|
wp_ theme activate gure-ametsa
|
|
|
|
# Limpiar contenido de ejemplo y extras
|
|
wp_ post delete 1 2 3 --force 2>/dev/null || true
|
|
wp_ plugin delete hello akismet 2>/dev/null || true
|
|
|
|
# Polylang: web bilingüe castellano / euskera
|
|
wp_ plugin activate polylang || log "No se pudo activar Polylang: la web quedará solo en castellano"
|
|
wp_ language plugin install polylang es_ES eu 2>/dev/null || true
|
|
|
|
# Idiomas, páginas, especies, menús y (opcional) animales de ejemplo
|
|
if ! GA_SEED_MENUS=true wp_ eval-file "$SRC/setup-content.php"; then
|
|
log "Fallo creando el contenido inicial"
|
|
exit 1
|
|
fi
|
|
|
|
wp_ rewrite flush
|
|
wp_ option update ga_setup_version 2
|
|
fi
|
|
|
|
# Etapa 3: plugins recomendados
|
|
if (( VERSION < 3 )); then
|
|
log "Instalando plugins recomendados"
|
|
|
|
# Activos desde el principio
|
|
ACTIVE=(
|
|
wp-mail-smtp # Envío de correo fiable (SMTP)
|
|
updraftplus # Copias de seguridad
|
|
limit-login-attempts-reloaded # Bloqueo de ataques al login
|
|
two-factor # Verificación en dos pasos
|
|
webp-converter-for-media # Fotos más ligeras (WebP)
|
|
wordpress-seo # Yoast SEO
|
|
instagram-feed # Feed de Instagram
|
|
koko-analytics # Estadísticas sin cookies
|
|
kadence-blocks # Bloques visuales: carruseles, pestañas, acordeones…
|
|
)
|
|
# Instalados pero desactivados: se activan cuando se necesiten
|
|
INACTIVE=(
|
|
give # Donaciones online (GiveWP)
|
|
mailpoet # Newsletter
|
|
complianz-gdpr # Aviso de cookies (solo si se añaden cookies de terceros)
|
|
wp-super-cache # Caché de páginas
|
|
)
|
|
|
|
for plugin in "${ACTIVE[@]}"; do
|
|
wp_ plugin install "$plugin" --activate >/dev/null 2>&1 && log " ✓ $plugin" || log " ✗ No se pudo instalar $plugin"
|
|
done
|
|
for plugin in "${INACTIVE[@]}"; do
|
|
wp_ plugin install "$plugin" >/dev/null 2>&1 && log " ✓ $plugin (desactivado)" || log " ✗ No se pudo instalar $plugin"
|
|
done
|
|
wp_ language plugin install --all es_ES eu >/dev/null 2>&1 || true
|
|
# Sin pantallas de bienvenida de los plugins al entrar por primera vez al panel
|
|
wp_ transient delete --all >/dev/null 2>&1 || true
|
|
wp_ option delete sbi_plugin_do_activation_redirect >/dev/null 2>&1 || true
|
|
|
|
# Copias de seguridad: base de datos a diario, archivos cada semana
|
|
wp_ option update updraft_interval weekly
|
|
wp_ option update updraft_interval_database daily
|
|
wp_ option update updraft_retain 4
|
|
wp_ option update updraft_retain_db 14
|
|
|
|
wp_ option update ga_setup_version 3
|
|
fi
|
|
|
|
# Etapa 4: APIs (GraphQL y documentación Swagger de la API REST)
|
|
if (( VERSION < 4 )); then
|
|
log "Instalando APIs: WPGraphQL y Swagger"
|
|
for plugin in wp-graphql wp-api-swaggerui; do
|
|
wp_ plugin install "$plugin" --activate >/dev/null 2>&1 && log " ✓ $plugin" || log " ✗ No se pudo instalar $plugin"
|
|
done
|
|
wp_ option update swagger_api_spec_version 3.0.3 # OpenAPI 3
|
|
wp_ option update swagger_api_expose_contact_email 0 # no publicar el email del administrador
|
|
wp_ option update swagger_api_basepath /wp/v2
|
|
wp_ rewrite flush
|
|
wp_ option update ga_setup_version 4
|
|
fi
|
|
|
|
# Etapa 5: indicaciones del cliente (adopción solo Perros/Gatos, fichas nuevas, sin hotel ni donaciones)
|
|
if (( VERSION < 5 )); then
|
|
log "Migración 5: páginas, menús y fichas nuevas"
|
|
# Crea las páginas nuevas, actualiza solo las que nadie ha editado, retira el hotel y rehace los menús
|
|
if ! GA_SEED_MENUS=true wp_ eval-file "$SRC/setup-content.php"; then
|
|
log "Fallo en la migración 5"
|
|
exit 1
|
|
fi
|
|
# Sin animaciones que distraigan
|
|
wp_ plugin deactivate blocks-animation >/dev/null 2>&1 || true
|
|
wp_ rewrite flush
|
|
wp_ option update ga_setup_version 5
|
|
fi
|
|
|
|
log "Configuración completada"
|