03_multisite.ymlΒΆ

---
# 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