Cum să adaugi o opțiune dacă nu există - Ghid WordPress

3 nov. 2012, 12:53:03
Vizualizări: 25.1K
Voturi: 8

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?

0
Toate răspunsurile la întrebare 6
3
17

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)

13 mar. 2014 18:49:55
Comentarii

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

fuxia fuxia
13 mar. 2014 19:57:31

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/

JDandChips JDandChips
25 feb. 2019 09:53:06

După cum am menționat recent pe trac, există cache-uri pe care ar trebui să le folosești și pentru aceasta, și cu siguranță ar trebui să actualizezi cache-urile după ce faci interogarea în baza de date.

Rup Rup
28 iul. 2021 10:05:13
0

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.

13 iun. 2016 06:28:34
0

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

3 nov. 2012 14:11:24
0

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.

12 iul. 2019 16:03:39
0
-1

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:

  1. când opțiunea nu există și $new_value != FALSE
  2. opțiunea nu are nicio valoare și $new_value != FALSE
  3. 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ă:

  1. opțiunea există și are aceeași valoare ca $new_value
  2. opțiunea nu există și $new_value == FALSE
3 nov. 2012 14:11:27
2
-1

Încearcă Asta

  1. Funcție care verifică dacă $arg / șir de caractere / există în mySQL.

  2. $arg trebuie să fie un șir de caractere / numele opțiunii tale /

  3. 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 );
    }
}
20 ian. 2016 15:01:00
Comentarii

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

Nicolai Grossherr Nicolai Grossherr
20 ian. 2016 15:06:45

am votat împotrivă deoarece nu există niciun motiv să interogați direct baza de date. În orice caz, update_option va adăuga opțiunea dacă aceasta nu există, deci întregul cod este inutil.

Mark Kaplun Mark Kaplun
21 ian. 2016 13:51:37