--- # WordPress Multisite opt-in. # # Runs only when `services.wordpress.multisite.enabled` is true. # Converts the fresh Single-Site installation into a sub-domain Multisite # network and creates one site per canonical domain beyond the first. # Domain mapping is handled natively by WordPress core since 4.5. # # Idempotent: if the network is already enabled, `wp core multisite-convert` # prints an informative message and exits 1 - we ignore that so re-runs # stay green. Sites that already exist are detected via `wp site list` # before `wp site create` runs. - name: "🌐 Multisite: convert Single-Site to Multisite network (subdomain install)" no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}" shell: > container exec -u {{ WORDPRESS_USER }} {{ WORDPRESS_CONTAINER_ADDRESS }} wp core multisite-convert --subdomains --title="{{ WORDPRESS_TITLE }} Network" --path="{{ WORDPRESS_DOCKER_HTML_PATH }}" register: wp_ms_convert changed_when: wp_ms_convert.rc == 0 failed_when: > wp_ms_convert.rc != 0 and ('already' not in (wp_ms_convert.stderr | lower)) and ('multisite' not in (wp_ms_convert.stderr | lower)) - name: "🔧 Multisite: patch wp-config.php with PHP-literal constants (--raw)" shell: > container exec -u {{ WORDPRESS_USER }} {{ WORDPRESS_CONTAINER_ADDRESS }} wp config set {{ item.key }} {{ item.value }} --raw --type=constant --path={{ WORDPRESS_DOCKER_HTML_PATH }} loop: - { key: "MULTISITE", value: "true" } - { key: "SUBDOMAIN_INSTALL", value: "true" } - { key: "SITE_ID_CURRENT_SITE", value: "1" } - { key: "BLOG_ID_CURRENT_SITE", value: "1" } changed_when: true - name: "🔧 Multisite: patch wp-config.php with PHP-string constants (no --raw)" shell: > container exec -u {{ WORDPRESS_USER }} {{ WORDPRESS_CONTAINER_ADDRESS }} wp config set {{ item.key }} {{ item.value }} --type=constant --path={{ WORDPRESS_DOCKER_HTML_PATH }} loop: - { key: "DOMAIN_CURRENT_SITE", value: "{{ WORDPRESS_DOMAINS | first }}" } - { key: "PATH_CURRENT_SITE", value: "/" } changed_when: true - name: "🌐 Multisite: list the existing sites in the network" shell: > container exec -u {{ WORDPRESS_USER }} {{ WORDPRESS_CONTAINER_ADDRESS }} wp site list --field=url --path={{ WORDPRESS_DOCKER_HTML_PATH }} register: wp_ms_sites changed_when: false - name: "🌐 Multisite: create any missing per-canonical-domain site" no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}" shell: > container exec -u {{ WORDPRESS_USER }} {{ WORDPRESS_CONTAINER_ADDRESS }} wp site create --slug="{{ item }}" --title="{{ item }}" --email="{{ WORDPRESS_ADMIN_EMAIL }}" --path={{ WORDPRESS_DOCKER_HTML_PATH }} loop: "{{ (WORDPRESS_DOMAINS | default([]))[1:] }}" when: - (WORDPRESS_DOMAINS | default([])) | length > 1 - ('https://' ~ item) not in wp_ms_sites.stdout - ('http://' ~ item) not in wp_ms_sites.stdout register: wp_ms_site_create changed_when: wp_ms_site_create.rc == 0 failed_when: > wp_ms_site_create.rc != 0 and ('already exists' not in (wp_ms_site_create.stderr | default('') | lower))