add_role () eseguito una sola volta?


11

Sono stato sorpreso di scoprire che add_role () modifica il database e fallisce se il ruolo esiste già. Ci sono due implicazioni qui, una prima più grave dell'altra: 1) se sei in sviluppo e aggiorni il tuo codice add_role, devi prima rimuovere_role () 2) una volta che hai ragione, non dovresti mai eseguire quel codice ancora.

Quindi in genere ho inserito il mio add_role () all'interno di un hook di azione wp_loaded. E poiché sono in fase di sviluppo, ho anche aggiunto un remove_role () prima del mio add_role in modo da poter essere sicuro che se modifico il mio elenco di maiuscole, avrà effettivamente effetto.

Ma chiaramente questo è ora in esecuzione ogni volta che si accede a una pagina del blog. Va bene, potrei metterlo in un'azione di solo amministratore, o potrei creare una pagina di plugin, magari sotto Utenti o Strumenti in cui questo ruolo può essere creato una volta. Suppongo di sperare che esista una soluzione più semplice ed elegante.

Non immagino che ci sia un tipo di azione run_once?

O è la migliore pratica solo per aggiungere il ruolo e quindi utilizzare add_cap () un sacco di volte? E anche allora immagino che add_cap stia accedendo al db.

Basti pensare in termini del modo migliore per ridurre l'accesso db non necessario. Quali sono le tue migliori pratiche?


Eccezionale! Grazie per questa domanda ... L'aggiunta della remove_role()funzione prima add_role()mi ha aiutato.
beytarovski

Risposte:


10

I ruoli e le funzionalità dell'utente vengono salvati nel database, quindi una volta che hai utilizzato il add_role()suo salvataggio e il caricamento successivo WordPress saprà quel ruolo proprio come i ruoli integrati.

Ora se osservi la funzione in modo add_role()più specifico alla riga 141 , vedrai che salva il ruolo e le capacità nel database solo se var $use_dbè impostato su true (che è per impostazione predefinita), quindi puoi semplicemente cambiarlo prima di chiamare il tuo add_role()funzione e il ruolo non verrà salvato.

provare:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

Aggiornare:

Se si trova in un ambiente di test / sviluppo, non vedo alcun aspetto negativo, ma se ci si trova in un ambiente live, si risparmia il tempo necessario per crearlo sul ruolo ad ogni carico.

Per quanto riguarda la migliore pratica, esegui una volta, se in un plug-in dovessi usare register_activation_hooke per qualsiasi altra cosa io uso una semplice funzione condizionale su misura:

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}

Merda. Lo sapevo anche anche da alcuni precedenti root sulla classe WP_Roles. Riesci a pensare a qualche svantaggio di NON utilizzare il database per i ruoli? E c'è una best practice del WP per fare qualcosa solo una volta?
Tom Auger,

Grazie per l'aggiornamento - Mi piace la semplicità della soluzione update_option
Tom Auger

Non proprio soddisfacente, ma sembra essere la soluzione migliore 👍
Blackbam

Questa funzione run_onceaumenta eccessivamente le operazioni di lettura / scrittura del database su ogni caricamento della pagina. Per favore, non usare questo.
Mayank Dudakiya
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.