Cum să adaugi o opțiune dacă nu există - Ghid WordPress
Am nevoie să verific dacă o opțiune există și, dacă da, să obțin valoarea. Dacă nu există, trebuie să o adaug.
Codex-ul oferă următorul exemplu:
<?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 );
}
Acest cod actualizează opțiunea myhack_extraction_length cu valoarea 255. Dacă opțiunea nu există, atunci folosește add_option și setează autoload la no.
Totuși, mi se pare că a doua parte ar putea fi apelată în două situații: dacă opțiunea nu există SAU dacă noua valoare este egală cu valoarea opțiunii existente.
Este corect acest lucru?
Nu recomand să folosești abordarea if (!(get_option("XXXX"))
pentru a verifica existența
, deoarece eșuează cu valori legitime precum false/null/0/goale
.
Sugerez:
if (!option_exists("XXXX")) {
add_option("XXXX", "valueee");
}
cod:
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");
}
(Am trimis și această funcționalitate ca cerere pentru CORE)

Te rog să adaugi o explicație la răspunsul tău: de ce ar putea rezolva aceasta problema?

Când folosești update_option
: "Dacă opțiunea nu există, atunci aceasta va fi adăugată cu valoarea opțiunii, cu o valoare $autoload de 'da'." - https://developer.wordpress.org/reference/functions/update_option/

Cred că cea mai bună abordare pentru această problemă este să creăm o logică IF-ELSE ca aceasta:
if(get_option('some_option')){
update_option('some_option', 'value_we_want_to_add');
}
else {
add_option('some_option', 'value_we_want_to_add');
}
Logică: get_option() va returna TRUE dacă acea opțiune există. În acest caz, putem pur și simplu actualiza acea opțiune cu o valoare pe care dorim să o adăugăm. Acest lucru se face prin update_option('some_option','value_we_want_to_add')
. Pe de altă parte, dacă some_option nu există, get_option va returna FALSE și va activa blocul ELSE. În interiorul blocului else, am dat instrucțiuni să creăm acest "some_option" și să îi atribuim valoarea pe care o dorim.
Opțional, această logică poate fi modificată pentru a satisface cerințe mai avansate.

Este corect?
Dacă te referi la "când se execută 'if' și când se execută 'else', atunci "Nu". Uită-te la condiție: if ( get_option( $option_name ) != $new_value ) {
Dacă opțiunea nu există -- false != '255'
este true
-- atunci prima parte se execută. De asemenea, se execută dacă opțiunea există și valorile nu se potrivesc -- '123' != '255'
este true
.
else
se execută doar dacă valorile se potrivesc -- '255' != '255'
este false, deci partea else
rulează. Ele se pot potrivi pe orice, numere, șiruri de caractere, booleeni -- adică true sau false

Am avut unele dificultăți cu acest tip de gestionare a opțiunilor și am abordat-o într-un mod diferit...
// creează sau actualizează token-ul în baza de date
switch ( get_option( 'ngitc_token' ) ) {
case false:
echo "<p>Token adăugat în baza de date</p>";
delete_option( 'ngitc_token' ); // get_option() va returna false dacă opțiunea nu există SAU dacă este goală. Așa că nu las nimic la întâmplare, șterg înainte de a adăuga.
add_option( 'ngitc_token', $token->token );
break;
case $token->token:
echo "<p>Nicio modificare în baza de date</p>";
break;
case true:
echo "<p>Token actualizat în baza de date</p>";
update_option( 'ngitc_token', $token->token );
break;
}
@Steve îți răspunde perfect, eu doar adaug o posibilitate de abordare a gestionării opțiunilor.

Logica pentru IF THEN ELSE pare un pic ciudată. Dacă înțeleg corect...
Apelul către get_option( $option_name ) va returna FALSE dacă opțiunea nu există sau dacă nu are nicio valoare.
Deci IF va fi executat:
- când opțiunea nu există și $new_value != FALSE
- opțiunea nu are nicio valoare și $new_value != FALSE
- opțiunea există și are o valoare care este != $new_value
Apelul update_option() va actualiza valoarea sau va crea opțiunea cu $new_value.
ELSE va fi apelat dacă:
- opțiunea există și are aceeași valoare ca $new_value
- opțiunea nu există și $new_value == FALSE

Încearcă Asta
Funcție care verifică dacă $arg / șir de caractere / există în mySQL.
$arg trebuie să fie un șir de caractere / numele opțiunii tale /
Dacă funcția returnează true -> opțiunea există; returnează false -> nu există nicio opțiune cu acest nume.
/** * Verifică Dacă Opțiunea Există; * @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;
}
}
Exemplu:
var_dump( exist_option( 'your_option' ) );
Rezultat:
true / false
Exemplu: ( creează opțiunea dacă nu există ):
if( exist_option( 'your_option' ) == false ) {
add_option( 'your_option', '255', '', true );
}
Și răspunsul tău poate fi:
$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 ) {
// Codul Tău Aici: sau
return;
} else {
update_option( 'myhack_extraction_length', $new_value );
}
}

Vă rugăm să nu doar să aruncați cod, ci să explicați ce faceți și la ce este bun - mulțumesc.
