---
# 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.
- 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: install the sunrise drop-in mapping siblings to sites"
ansible.builtin.shell: >
container exec -i -u {{ WORDPRESS_USER }} {{ WORDPRESS_CONTAINER_ADDRESS }}
tee {{ WORDPRESS_SUNRISE_PATH }}
> /dev/null
args:
stdin: "{{ lookup('file', [role_path, 'files/mu-plugins/infinito-network-origins.php'] | path_join) }}"
register: wp_ms_sunrise
changed_when: wp_ms_sunrise.rc == 0
- 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" }
- { key: "SUNRISE", value: "true" }
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_SITE_DOMAINS | first }}" }
- { key: "PATH_CURRENT_SITE", value: "/" }
changed_when: true
- name: "π Multisite: create every child site on its own canonical domain"
no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
ansible.builtin.shell:
cmd: >-
container exec -i --user {{ WORDPRESS_USER | quote }}
-e WP_MS_SITE_URLS -e WP_MS_ADMIN_EMAIL
{{ WORDPRESS_CONTAINER_ADDRESS }}
wp eval-file - --path={{ WORDPRESS_DOCKER_HTML_PATH | quote }}
stdin: "{{ lookup('file', 'php/multisite/sites.php') }}"
environment:
WP_MS_SITE_URLS: "{{ WORDPRESS_SITE_URLS[1:] | join(',') }}"
WP_MS_ADMIN_EMAIL: "{{ WORDPRESS_ADMIN_EMAIL }}"
register: wp_ms_site_create
changed_when: "'CHANGED' in wp_ms_site_create.stdout"
when: WORDPRESS_SITE_URLS | length > 1