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

Geschlossen
#2,012 13 Kommentare 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

@superdav42 arbeitet bereits daran.

Seit 22.10.2026.

  • #2013 von @superdav42 — offen

Bewertung

Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Anfängerfreundlichkeit
35/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
php, wordpress
Bereich
backend, database

Rechercherichtung

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.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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

Vorherrschende Sprache
PHP
Sterne
218
Forks
87
Ø Merge
1 T. 3 Std.
Gemergte PRs (30 T.)
101

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus Ultimate-Multisite/ultimate-multisite

Alle Issues in Ultimate-Multisite/ultimate-multisite

Ähnliche Issues

Weitere Issues zu PHP

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.