Agregar opción si no existe en WordPress - Guía práctica
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?
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)

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

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/

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.

¿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 sí 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

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.

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:
- cuando la opción no existe y $new_value != FALSE
- la opción no tiene valor y $new_value != FALSE
- 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:
- la opción existe y tiene el mismo valor que $new_value
- la opción no existe y $new_value == FALSE

Prueba Esto
Función que verifica si $arg / cadena / existe en mySQL.
$arg debe ser una cadena / el nombre de tu opción /
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 );
}
}

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