Aggiungere un'opzione se non esiste

3 nov 2012, 12:53:03
Visualizzazioni: 25.1K
Voti: 8

Devo verificare se un'opzione esiste e, se esiste, ottenerne il valore. Se non esiste, devo aggiungerla.

Il Codex fornisce:

<?php
$option_name = 'myhack_extraction_length' ;
$new_value = '255' ;

if ( get_option( $option_name ) != $new_value ) {
    update_option( $option_name, $new_value );
} else {
    $deprecated = ' ';
    $autoload = 'no';
    add_option( $option_name, $new_value, $deprecated, $autoload );
}

Che presumibilmente aggiorna l'opzione myhack_extraction_length con il valore 255. Se l'opzione non esiste, usa add_option e imposta autoload a no.

Tuttavia, mi sembra che la seconda parte potrebbe essere chiamata in due modi: se l'opzione non esiste OPPURE se il nuovo valore è uguale all'opzione

È corretto?

0
Tutte le risposte alla domanda 6
3
17

Non consiglio di utilizzare l'approccio if (!(get_option("XXXX")) per verificare l'esistenza, poiché fallisce con valori legittimi come false/null/0/vuoto.

Suggerisco:

if (!option_exists("XXXX")) {
     add_option("XXXX", "valueee");
}

codice:

public function option_exists($name, $site_wide=false){
    global $wpdb; return $wpdb->query("SELECT * FROM ". ($site_wide ? $wpdb->base_prefix : $wpdb->prefix). "options WHERE option_name ='$name' LIMIT 1");
}

(Ho anche inviato questa funzionalità come richiesta per il CORE)

13 mar 2014 18:49:55
Commenti

Per favore aggiungi una spiegazione alla tua risposta: perché potrebbe risolvere il problema?

fuxia fuxia
13 mar 2014 19:57:31

Quando usi update_option: "Se l'opzione non esiste, verrà aggiunta con il valore dell'opzione, con un valore $autoload impostato su 'yes'." - https://developer.wordpress.org/reference/functions/update_option/

JDandChips JDandChips
25 feb 2019 09:53:06

Come ho appena commentato sul trac, ci sono cache che dovresti usare anche per questo, e dovresti assolutamente aggiornare le cache dopo aver eseguito la query al database.

Rup Rup
28 lug 2021 10:05:13
0

Credo che il miglior approccio a questo problema sia creare una logica IF-ELSE come questa:

   if(get_option('some_option')){
         update_option('some_option', 'valore_che_vogliamo_aggiungere');
    }
    else {
      add_option('some_option', 'valore_che_vogliamo_aggiungere');
    }

Logica: get_option() restituirà TRUE se quell'opzione esiste. In questo caso possiamo semplicemente aggiornare quell'opzione con un valore che vogliamo aggiungere. Questo viene fatto con update_option('some_option','valore_che_vogliamo_aggiungere'). D'altra parte, se some_option non esiste, get_option restituirà FALSE e attiverà il blocco ELSE. All'interno del blocco else abbiamo fornito l'istruzione per creare questa "some_option" e assegnarle il valore che desideriamo.

Facoltativamente, questa logica può essere modificata per soddisfare requisiti più avanzati.

13 giu 2016 06:28:34
0

È corretto?

Se intendi "quando viene eseguito l'if e quando viene eseguito l'else", allora "No". Guarda la condizione: if ( get_option( $option_name ) != $new_value ) {

Se l'opzione non esiste - false != '255' risulta true - allora viene eseguita la prima parte. Viene eseguita anche se l'opzione esiste ma i valori non corrispondono - '123' != '255' risulta true.

Il else viene eseguito solo se i valori corrispondono - '255' != '255' è false, quindi viene eseguita la parte else. Potrebbero corrispondere su qualsiasi cosa, numeri, stringhe, booleani - cioè true o false

3 nov 2012 14:11:24
0

Ho avuto qualche difficoltà con questo tipo di gestione delle opzioni e l'ho affrontato con un approccio diverso...

// crea o aggiorna il token nel database

    switch ( get_option( 'ngitc_token' ) ) {
        case false: 
            echo "<p>Token aggiunto al database</p>";
            delete_option( 'ngitc_token' ); // get_option() restituirà false se l'opzione non esiste OPPURE se è vuota. Quindi per sicurezza la elimino prima di aggiungerla.
            add_option( 'ngitc_token', $token->token );
            break;
        case $token->token:
            echo "<p>Nessuna modifica al database</p>";
            break; 
        case true:
            echo "<p>Token aggiornato nel database</p>";
            update_option( 'ngitc_token', $token->token );  
            break;   

    }

@Steve ti sta rispondendo perfettamente, io sto solo aggiungendo una possibilità su come gestire le opzioni.

12 lug 2019 16:03:39
0
-1

La logica dell'IF THEN ELSE sembra un po' traballante. Se ho capito bene...

La chiamata a get_option( $option_name ) restituirà FALSE se l'opzione non esiste o se non ha alcun valore.

Quindi l'IF verrebbe eseguito:

  1. quando l'opzione non esiste e $new_value != FALSE
  2. l'opzione non ha valore e $new_value != FALSE
  3. l'opzione esiste e ha un valore che è != $new_value

La chiamata update_option() aggiornerebbe quindi il valore o creerebbe l'opzione con $new_value.

L'ELSE verrebbe chiamato se:

  1. l'opzione esiste e ha lo stesso valore di $new_value
  2. l'opzione non esiste e $new_value == FALSE
3 nov 2012 14:11:27
2
-1

Prova Questo

  1. Funzione che verifica se $arg / stringa / esiste in mySQL.

  2. $arg deve essere una stringa / il nome della tua opzione /

  3. Se la funzione restituisce true -> l'opzione esiste; restituisce false -> non esiste un'opzione con questo nome.

/** * Verifica Se l'Opzione Esiste; * @param String * @return boolean; */

function exist_option( $arg ) {

    global $wpdb;
    $prefix = $wpdb->prefix;
    $db_options = $prefix.'options';
    $sql_query = 'SELECT * FROM ' . $db_options . ' WHERE option_name LIKE "' . $arg . '"';

    $results = $wpdb->get_results( $sql_query, OBJECT );

    if ( count( $results ) === 0 ) {
        return false;
    } else {
        return true;
    }
}

Esempio:

var_dump( exist_option( 'your_option' ) );

Risultato:

true / false

Esempio: ( crea l'opzione se non esiste ):

if( exist_option( 'your_option' ) == false ) {
    add_option( 'your_option', '255', '', true );
}

E la tua risposta potrebbe essere:

$new_value = '255';

if( exist_option( 'myhack_extraction_length' ) == false ) {
    add_option( 'myhack_extraction_length', '255', '', true );
} else {
    if ( get_option( 'myhack_extraction_length' ) == $new_value ) {
        // Il Tuo Codice Qui: oppure
        return;
    } else {
        update_option( 'myhack_extraction_length', $new_value );
    }
}
20 gen 2016 15:01:00
Commenti

Per favore non limitarti a copiare il codice, ma spiega cosa stai facendo e a cosa serve - grazie.

Nicolai Grossherr Nicolai Grossherr
20 gen 2016 15:06:45

downvotato poiché non c'è alcun motivo per interrogare direttamente il database. In ogni caso update_option aggiungerà l'opzione se non esiste, quindi l'intero codice è inutile.

Mark Kaplun Mark Kaplun
21 gen 2016 13:51:37