Agregar opción si no existe en WordPress - Guía práctica

3 nov 2012, 12:53:03
Vistas: 25.1K
Votos: 8

Necesito verificar si una opción existe y, si es así, obtener su valor. Si no existe, necesito agregarla.

El Codex proporciona:

<?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 );
}

Que supuestamente actualiza la opción myhack_extraction_length con el valor 255. Si la opción no existe, entonces usa add_option y establece autoload en no.

Sin embargo, me parece que la segunda parte podría llamarse de dos maneras: si la opción no existe O si el nuevo valor == el valor de la opción

¿Es esto correcto?

0
Todas las respuestas a la pregunta 6
3
17

No recomiendo usar el enfoque if (!(get_option("XXXX")) para verificar la existencia, ya que falla con valores legítimos como false/null/0/vacío.

Sugiero:

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

código:

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");
}

(También he enviado esta característica como solicitud para el CORE)

13 mar 2014 18:49:55
Comentarios

Por favor, agrega una explicación a tu respuesta: ¿por qué podría eso resolver el problema?

fuxia fuxia
13 mar 2014 19:57:31

Cuando usas update_option: "Si la opción no existe, entonces la opción será añadida con el valor de la opción, con un valor $autoload de 'yes'." - https://developer.wordpress.org/reference/functions/update_option/

JDandChips JDandChips
25 feb 2019 09:53:06

Como acabo de comentar en el trac, hay cachés que deberías usar para esto también, y definitivamente deberías actualizar las cachés después de hacer la consulta a la base de datos.

Rup Rup
28 jul 2021 10:05:13
0

Creo que el mejor enfoque para este problema es crear una lógica IF-ELSE como esta:

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

Lógica: get_option() devolverá TRUE si esa opción existe. En este caso, simplemente podemos actualizar esa opción con algún valor que queramos agregar. Esto se hace mediante update_option('some_option','valor_que_queremos_agregar'). Por otro lado, si some_option no existe, get_option devolverá FALSE y activará el bloque ELSE. Dentro del bloque else, dimos la instrucción de crear esta "some_option" y asignarle el valor que queremos.

Opcionalmente, esta lógica se puede modificar para cumplir con requisitos más avanzados.

13 jun 2016 06:28:34
0

¿Es esto correcto?

Si te refieres a "¿cuándo se ejecuta el 'if' y cuándo se ejecuta el 'else'?", entonces "No". Mira la condición: if ( get_option( $option_name ) != $new_value ) {

Si la opción no existe -- false != '255' es true -- entonces se ejecuta la primera parte. También se ejecuta si la opción existe y los valores no coinciden -- '123' != '255' es true.

El else se ejecuta solo si los valores coinciden -- '255' != '255' es false, por lo que se ejecuta la parte del else. Podrían coincidir en cualquier cosa, números, cadenas, booleanos -- es decir, true o false

3 nov 2012 14:11:24
0

Luché un poco con este tipo de gestión de opciones y lo hice con un enfoque diferente...

// crear o actualizar el token en la base de datos

    switch ( get_option( 'ngitc_token' ) ) {
        case false: 
            echo "<p>Token añadido a la base de datos</p>";
            delete_option( 'ngitc_token' ); //get_option() devolverá false si la opción no existe O si está vacía. Así que no me arriesgo, la elimino antes de añadirla.
            add_option( 'ngitc_token', $token->token );
            break;
        case $token->token:
            echo "<p>Sin cambios en la base de datos</p>";
            break; 
        case true:
            echo "<p>Token actualizado en la base de datos</p>";
            update_option( 'ngitc_token', $token->token );  
            break;   

    }

@Steve te está respondiendo perfectamente, solo agrego una posibilidad sobre cómo abordar la gestión de opciones.

12 jul 2019 16:03:39
0
-1

La lógica del IF THEN ELSE parece un poco irregular. Si lo estoy leyendo correctamente...

La llamada a get_option( $option_name ) devolverá FALSE si la opción no existe o si no tiene valor.

Por lo tanto, el IF se ejecutaría:

  1. cuando la opción no existe y $new_value != FALSE
  2. la opción no tiene valor y $new_value != FALSE
  3. la opción existe y tiene un valor que es != $new_value

La llamada update_option() actualizaría entonces el valor o crearía la opción con $new_value.

El ELSE se llamaría si:

  1. la opción existe y tiene el mismo valor que $new_value
  2. la opción no existe y $new_value == FALSE
3 nov 2012 14:11:27
2
-1

Prueba Esto

  1. Función que verifica si $arg / cadena / existe en mySQL.

  2. $arg debe ser una cadena / el nombre de tu opción /

  3. Si la función retorna true -> la opción existe; retorna false -> no hay una opción con este nombre.

/** * Verifica Si la Opción Existe; * @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;
    }
}

Ejemplo:

var_dump( exist_option( 'tu_opcion' ) );

Resultado:

true / false

Ejemplo: ( crear opción si no existe ):

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

Y tu respuesta podría ser:

$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 ) {
        // Tu Código Aquí: o
        return;
    } else {
        update_option( 'myhack_extraction_length', $new_value );
    }
}
20 ene 2016 15:01:00
Comentarios

Por favor, no solo copies el código, sino que explica lo que estás haciendo y para qué sirve - gracias.

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

Voto negativo porque no hay ninguna razón para consultar directamente la base de datos. En cualquier caso, update_option agregará la opción si no existe, por lo que todo el código es innecesario.

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