get_charset_collate(); $prefix = $wpdb->prefix; $sql = []; $sql[] = "CREATE TABLE {$prefix}aiforya_ma_assignments ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, post_id BIGINT UNSIGNED NOT NULL, user_id BIGINT UNSIGNED NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'draft', assigned_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id), KEY post_id (post_id), KEY user_id (user_id), KEY status (status) ) {$charset};"; $sql[] = "CREATE TABLE {$prefix}aiforya_ma_coauthors ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, post_id BIGINT UNSIGNED NOT NULL, user_id BIGINT UNSIGNED NOT NULL, role VARCHAR(20) NOT NULL DEFAULT 'coauthor', created_at DATETIME NOT NULL, PRIMARY KEY (id), KEY post_id (post_id), KEY user_id (user_id) ) {$charset};"; foreach ( $sql as $statement ) { dbDelta( $statement ); } } private static function set_default_options(): void { add_option( 'aiforya_ma_settings', [ 'show_byline' => true, 'notifications_enabled' => true, 'cleanup_on_uninstall' => true, ] ); } private static function register_roles(): void { if ( class_exists( 'Aiforya_Multi_Author_Workflow' ) ) { Aiforya_Multi_Author_Workflow::get_instance()->register_custom_roles(); } } /** * Rejoue la création/mise à jour des tables quand le schéma a changé. * * ⛔ POURQUOI (28/08/2026) : `register_activation_hook` n'est PAS rejoué quand WordPress * MET À JOUR une extension. Cette classe écrivait donc `aiforya_ma_db_version` sans que rien ne * la relise : le jour où une version ajoute une colonne, les sites déjà installés gardent * l'ancienne table, sans la moindre erreur visible — jusqu'à la première requête qui * échoue chez le client. * Relevé du parc ce jour-là : 44 extensions écrivaient cette option, 8 la relisaient. * Le patron ci-dessous est celui de ces 8, pas une invention. * * `dbDelta` est idempotent : rejouer sur un schéma déjà à jour ne coûte qu'une lecture. */ public static function maybe_upgrade(): void { $installed = (string) get_option( 'aiforya_ma_db_version', '' ); if ( $installed === self::DB_VERSION ) { return; } self::install_tables(); update_option( 'aiforya_ma_db_version', self::DB_VERSION, false ); } }