Supporto » Sviluppare con WordPress » update_option su attivazione multisito

  • Risolto Giuseppe

    (@mociofiletto)


    Buongiorno,
    sto lavorando allo sviluppo di un plugin multisito, e ho un comportamento che non riesco a spiegami nella routine di attivazione.

    Nel file principale del plugin registro una funzione di attivazione che chiama un metodo statico (activate) nella classe di attivazione, trasferendo il parametro $network_wide.

    Codice nel file principale del plugin:

    register_activation_hook( __FILE__, 'activate_plugin' );
    
    function activate_plugin( $network_wide ) {
    	require_once plugin_dir_path( __FILE__ ) . 'includes/class-plugin-activator.php';
    	Plugin_Activator::activate( $network_wide );
    }

    Il metodo activate di Plugin_Activator, fa dei controlli e poi chiama il metodo single_activate che, a sua volta richiama un metodo statico per inserire/aggiornare un’opzione del singolo sito:

    class Plugin_Activator {
    
    	public static function activate( $network_wide ): void {
    		$check_versions = self::plugin_check_minimum_versions();
    		if ( true === $check_versions ) {
    			if ( function_exists( 'is_multisite' ) && is_multisite() && $network_wide ) {
    
    				$blogids = DB::get_blogs_ids(); // return $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
    
    				foreach ( $blogids as $blog_id ) {
    					switch_to_blog( $blog_id );
    					if ( ! is_plugin_active( 'plugin/plugin.php' ) ) {
    						self::single_activate();
    					}
    				}
    				restore_current_blog();
    			} else {
    				self::single_activate();
    			}
    		} else {
    			$error = 'an error';
    			die( esc_html( $error ) );
    		}
    	}

    Il metodo single_activate:

    	public static function single_activate( $network_wide = false ): void {
    		set_time_limit( 360 );
    		DB::db_create(); // crea le tabelle utilizzando dbDelta
    		self::set_an_option();
    	}

    Il problema è con il metodo set_an_option:

    	private static function set_an_option(): void {
    		$plugin_option = array(
    			'option_a' => 0,
    			'option_b' => 0,
    			'option_c' => 0,
    		);
    		update_option( 'my-plugin-option', $plugin_option );
    	}

    Il problema è che, quando attivo il plugin su sito singolo, l’opzione è correttamente creata e i tre valori ricevono il valore 0.
    Quando, invece, lancio l’attivazione a livello di network, l’opzione viene creata, ma tutti i valori assumono valore 1.
    Ho fatto un test e se i tre valori dell’opzione vengono impostati a null nella funzione set_an_option, nell’attivazione network, i tre valori vengono serializzati con 0, mentre nell’attivazione singola viene inserito nel database un valore “N” (letterale).

    Grazie per l’aiuto.

Stai visualizzando 1 risposte (di 1 totali)
  • Chi ha creato la discussione Giuseppe

    (@mociofiletto)

    Trovato:
    l’errore è qui:

    foreach ( $blogids as $blog_id ) {
    	switch_to_blog( $blog_id );
    	if ( ! is_plugin_active( 'plugin/plugin.php' ) ) {
    		self::single_activate();
    	}
    }
    restore_current_blog();

    Deve essere

    foreach ( $blogids as $blog_id ) {
    	switch_to_blog( $blog_id );
    	if ( ! is_plugin_active( 'plugin/plugin.php' ) ) {
    		self::single_activate();
    	}
    	restore_current_blog();
    }

    In pratica non ripristinavo il blog dopo aver fatto lo switch, e questo crea un problema di gestione delle variabili.

Stai visualizzando 1 risposte (di 1 totali)
  • Devi essere collegato per rispondere a questo topic.