Aggiungere un'opzione se non esiste
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?
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)

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

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/

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.

È 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

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.

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:
- quando l'opzione non esiste e $new_value != FALSE
- l'opzione non ha valore e $new_value != FALSE
- 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:
- l'opzione esiste e ha lo stesso valore di $new_value
- l'opzione non esiste e $new_value == FALSE

Prova Questo
Funzione che verifica se $arg / stringa / esiste in mySQL.
$arg deve essere una stringa / il nome della tua opzione /
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 );
}
}

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