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?