Cómo establecer valores por defecto en WP Options API WordPress
Si has llegado aquí es por qué estás buscando una forma de establecer valores por defecto a una o varias opciones en WordPress (Options API), ya sea en un tema o en un plugin. Se te puede pasar por la cabeza utilizar add_option()
o update_option()
con los valores por defecto que quieras poner. Estas funciones añadirán los valores que quieras para tus opciones a la base de datos y, efectivamente, puede hacer el trabajo.
Pero hay una forma mejor. Deja la base de datos para guardar las opciones realmente elegidas por el usuario del tema o plugin y utiliza el parámetro $default
de la función get_option(). En este parámetro puedes elegir el valor a utilizar si la opción de la que intentas obtener el valor no existe:
$logo_default = get_template_directory_uri() . 'img/logo.png';
$logo = get_option( 'site_logo', $logo_default );
Con el código superior, si la opción site_logo
no existe en la base de datos, se utilizará el valor almacenado en $logo_default
. Para opciones que no existen, get_option()
devuelve false
, y es entonces cuándo utiliza el valor pasado en el segundo parámetro. Hay que tener cuidado con dar valores lógicos true|false
. Si das false
como valor válido para una opción, get_option()
devolverá false
pero seguirá utilizando el valor pasado en $default
:
update_option( 'my_option', false );
$my_option = get_option( 'my_option', true );
//$my_option es incorrectamente true
Array para los valores de un option
Es muy común que un determinado tema o plugin almacene los valores de todas sus opciones en una única entrada en la base de datos, en un único option
que tiene, digamos, subopciones:
$values = array(
'opcion1' => 'Valor 1',
'opcion2' => 'Valor 2'
);
update_option( 'cyb_option', $values );
//Entonces se accede a cada opción como array
$options = get_option('cyb_option');
echo $options['opcion1'];
echo $options['opcion2'];
Igual que antes, se puede pasar un array con los valores por defecto que quieras utilizar en get_option()
. Por ejemplo:
$default = array(
'color' => 'blue',
'font_size' => '16px'
);
$options = get_option( 'cyb_option', $default );
//Igual a 'blue', el valor por defecto
echo $options['color'];
//Igual a 16px, no el valor por defecto
echo $options['font_size'];
El problema con el código anterior es que sólo se utilizarán los valores en $default
si cyb_option
no existe en la base de datos, pero resulta que puede existir, por ejemplo, sólo con valor para 'color'
y no para 'font_size'
. En este caso no se utilizaría el valor por defecto para 'font_size'
. Para asegurarnos de que se utilizan los valores por defecto, incluso para subopciones no almacenadas en la base de datos, podemos utilizar wp_parse_args
:
$defaults = array(
'color' => 'blue',
'font_size' => '16px'
);
$options = get_option( 'cyb_option', $defaults );
//Pasar $default de nuevo para subopciones no guardadas en la base de datos
$options = wp_parse_args( $options, $defaults )
Pero vaya coñazo tener que escribir todo eso cada vez que quiera utilizar get_option()
. Solución? Un función propia para obtener el valor de la opción que deseemos dónde metamos todo lo anterior. Por ejemplo:
function cyb_get_option( $option_name = '' ){
$defaults = array(
// option => valor por defecto
'color' => 'blue',
'font_size' => '16px'
)
$options = get_option( 'cyb_option', $defaults );
//Pasar $defaults de nuevo para subopciones no guardadas
$options = wp_parse_args( $options, $defaults );
if( empty($option_name) ) ) {
//return el array completo de subopciones si $option_name = '', false, array()
return $options;
} elseif( !empty($options[$option_name]) ) {
//return la subopción especificada en $option_name
return $options[$option_name];
} else {
//El $option_name dado no existe. return false
return false;
}
}
La función anterior se utilizaría de la siguiente forma:
$color = cyb_get_option('color');
$fontsize = cyb_get_option('font_size');
//U obteniendo el array completo
$options = cyb_get_option();
$color = $options['color'];
$fontsize = $options['font_size'];
Ya tenemos una forma cómoda de establecer valores por defecto para las opciones del tema o plugin que estemos desarrollando utilizando el Options API de WordPress sin tener que tener guardadas en la base de datos opciones que el usuario no ha elegido.
¿Opiniones? ¿Sugerencias?