Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Secondary networks: sunrise queries unregistered scoped tables, and wu_{N}_* tables are never created

Abierto
#2,012 13 comentarios 0 reacciones 1 asignado Ver en GitHub

Los mantenedores suelen responder en 1 día

@superdav42 ya está trabajando en esto.

Desde el 22/10/2026.

  • #2013 de @superdav42 — abierto

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
php, wordpress
Área
backend, database

Línea de trabajo

Start with inc/class-sunrise.php and inc/database/engine/class-table.php, then trace network scoped installation through inc/installers/class-core-installer.php and inc/loaders/class-table-loader.php. Read the table and email manager tests in the Files Scope, and check how setup state, table registration, and upgrade paths interact across secondary networks. Done means every secondary network has its scoped tables, sunrise queries avoid unregistered tables, and default system emails are available once its posts table exists.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug origin:interactive status:in-review

Problem

On a multi-network install, Ultimate Multisite queries network-scoped tables ({base_prefix}wu_{network_id}_*) on secondary networks, but two paths leave those tables unusable:

  1. Sunrise domain mapping queries tables that were never registered. Sunrise::load_domain_mapping() (inc/class-sunrise.php:191-205) starts Domain_Mapping on every network. On a network where Ultimate Multisite returns before setup_tables() (inc/class-wp-ultimo.php, the Requirements::met() === false || Requirements::run_setup() === false early return; run_setup() reads the per-network wu_setup_finished option), no Table object is built for that network. The domain Query still applies the network prefix (Network_Prefix::update_prefix_with_network_id(), inc/database/engine/traits/trait-network-prefix.php:20-25), so it reads $wpdb->wu_{N}_domain_mappings. That property is unset, which gives an empty table name:

    Table '<db>.wu_5_d' doesn't exist for query SELECT  wu_5_d.id FROM  wu_5_d WHERE wu_5_d.blog_id = 323 AND wu_5_d.domain != ...
    

    Note the double space: the table name is empty and only the alias wu_5_d remains. Production logged about 170 of these in 7 hours on one template network.

  2. Secondary-network tables are never created. Table::is_upgradeable() (inc/database/engine/class-table.php:50-57) returns false unless the request is on the main network and main site, so maybe_upgrade() never installs wp_wu_{N}_*. A network ends up with none of these tables, or with only the subset some one-off path created. One network had customers/memberships/payments but no posts, postmeta, webhooks, passkey_credentials, webauthn_challenges, email_otp_attempts or sso_nonces. Addon tables that extend the core Table (e.g. metered-plans' metered_usage) inherit the same gap. A missing posts table also means a network has no system emails (payment_received_*, site_published_*, …).

Expected

  • Every secondary network that Ultimate Multisite serves has its full set of scoped tables, created idempotently when the network is first used or created, and on upgrade.
  • Domain mapping at sunrise never builds a query against an unregistered table. Either register the network's tables (e.g. build the needed Table objects in Sunrise::load_domain_mapping() before Domain_Mapping runs), or fall back to the main network's tables when Ultimate Multisite is not set up on the current network.
  • Default system emails get created for a network once its posts table exists.

Workaround applied on one install (not a fix)

Ran in each affected network's --url context:

  • $t->install() for every Table_Loader::get_instance()->get_tables() entry, plus Metered_Usage_Table, where exists() was false.
  • Email_Manager::get_instance()->create_all_system_emails().
  • For the template network, set the wu_setup_finished network option so Ultimate Multisite completes loading and registers its tables.

Note: Table::exists() caches its result, so in the same process it still reported false right after a successful install(). A fresh process or information_schema showed the tables were present.

Files to modify

  • inc/class-sunrise.php (load_domain_mapping)
  • inc/database/engine/class-table.php (is_upgradeable, and possibly the exists() cache)
  • inc/installers/class-core-installer.php (network-scoped install)
  • inc/loaders/class-table-loader.php
  • inc/managers/class-email-manager.php (create_all_system_emails on new networks)

Verification

On a multi-network test install:

  1. Create a secondary network without running the setup wizard and request one of its mapped domains. There should be no FROM wu_N_ (empty table) errors.
  2. Every get_tables() entry should exists() for that network after creation or upgrade.
  3. wu_get_emails() should return the default system emails on that network.
Files Scope
  • inc/class-sunrise.php
  • inc/database/engine/class-table.php
  • inc/installers/class-core-installer.php
  • inc/loaders/class-table-loader.php
  • inc/managers/class-email-manager.php
  • tests/WP_Ultimo/Database/Engine/Table_Test.php
  • tests/WP_Ultimo/Managers/Email_Manager_Test.php

aidevops.sh v3.39.49 plugin for OpenCode

Lenguaje dominante
PHP
Estrellas
218
Forks
87
Merge medio
1 d 7 h
PR fusionados (30 d)
85

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Ultimate-Multisite/ultimate-multisite

Todos los issues de Ultimate-Multisite/ultimate-multisite

Issues similares

Más issues de PHP

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.