Achei a resposta fornecida por @toscho muito útil, mas como eu tinha mais de uma opção para adicionar, alterei um pouco o código, de modo que tudo o que preciso fazer é criar uma classe estendida simples com algumas opções.
Também achei inconveniente adicionar as opções simplesmente ao final da lista. Por isso, adicionei um argumento de 'posição' que permite selecionar qualquer uma dessas opções -
'first'
- Antes da primeira configuração (atualmente Posição)
'last'
- Após a última configuração (cor de fundo atual)
Integer position
- O número da linha para inserir a configuração antes (deve ser um número inteiro)
Aqui está o código -
add_action('load-appearance_page_custom-background', array('PS_Background_Setting_Random', 'get_instance'));
add_action('load-appearance_page_custom-background', array('PS_Background_Setting_Position_Y', 'get_instance'));
add_action('load-appearance_page_custom-background', array('PS_Background_Setting_Size', 'get_instance'));
/**
* Add a new 'Random Background' setting to the Customise Background admin page
*/
final class PS_Background_Setting_Random extends PS_Background_Setting{
/**
* The main instance
*
* @var object|null
*/
protected static $instance = null;
/**
* Return an instance of this class
*
* @return object An instance of this class
*/
public static function get_instance(){
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
/**
* Constructor
*/
public function __construct(){
$args = array(
'mod' => 'ps_background_random',
'default' => 'yes',
'label' => __('Random Background', 'djg_photo_show'),
'position' => 'first',
'options' => array(
'yes' => __('Yes', 'djg_photo_show'),
'no' => __('No', 'djg_photo_show')
)
);
parent::__construct($args);
}
}
/**
* Add a new 'Background Position (Y)' setting to the Customise Background admin page
*/
final class PS_Background_Setting_Position_Y extends PS_Background_Setting{
/**
* The main instance
*
* @var object|null
*/
protected static $instance = null;
/**
* Return an instance of this class
*
* @return object An instance of this class
*/
public static function get_instance(){
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
/**
* Constructor
*/
public function __construct(){
$args = array(
'mod' => 'ps_background_position_y',
'default' => 'cover',
'label' => __('Position (Y)', 'djg_photo_show'),
'position' => 3,
'options' => array(
'top' => __('Top', 'djg_photo_show'),
'center' => __('Centre', 'djg_photo_show'),
'bottom' => __('Bottom', 'djg_photo_show')
)
);
parent::__construct($args);
}
}
/**
* Add a new 'Background Size' setting to the Customise Background admin page
*/
final class PS_Background_Setting_Size extends PS_Background_Setting{
/**
* The main instance
*
* @var object|null
*/
protected static $instance = null;
/**
* Return an instance of this class
*
* @return object An instance of this class
*/
public static function get_instance(){
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
/**
* Constructor
*/
public function __construct(){
$args = array(
'mod' => 'ps_background_size',
'default' => 'cover',
'label' => __('Size', 'djg_photo_show'),
'position' => 6,
'options' => array(
'auto' => __('Auto', 'djg_photo_show'),
'contain' => __('Contain', 'djg_photo_show'),
'cover' => __('Cover', 'djg_photo_show')
)
);
parent::__construct($args);
}
}
/**
* Add a new setting to the Customise Background admin page
*/
class PS_Background_Setting{
/**
* The name for the theme modification option
*
* @var string
*/
private $mod = '';
/**
* The default value to return if $mod is not yet set
*
* @var mixed
*/
private $default = false;
/**
* The label for the additional setting
*
* @var string
*/
private $label = '';
/**
* The options to use for creating the fields for the additional setting
*
* @var array
*/
private $options = array();
/**
* The nonce for the additional setting
*
* @var string
*/
private $nonce;
/**
* The HTML fields for all of the options for the additional setting
*
* @var string
*/
private $fields;
/**
* The position in which to insert the option
*
* @var string
*/
private $position = 'last';
/**
* Constructor
*/
public function __construct($args = array()){
/** Map the args to this object */
foreach($args as $key => $value) :
$this->$key = $value;
endforeach;
/** Ensure that all of the required $args are valid */
if(!$this->is_valid_args()) :
return;
endif;
add_action('admin_footer-appearance_page_custom-background', array($this, 'output_additional_setting'));
/** Check to see if there is an option to save */
if(!empty($_POST[$this->mod])):
/** Check the nonce is valid and save the updated setting */
check_admin_referer($this->mod, "_ps_nonce-$this->mod");
set_theme_mod($this->mod, $_POST[$this->mod]);
endif;
}
/**
* Ensure that all of the required $args are valid
*/
private function is_valid_args(){
return (empty($this->mod) || empty($this->label) || empty($this->options)) ? false : true;
}
/**
* Output the additional custom fields to the custom backgrounds page
*/
public function output_additional_setting(){
$this->nonce = wp_nonce_field( // Create a nonce for each settings so that it can be checked when the user saves
$this->mod, // The nonce $action
"_ps_nonce-$this->mod", // The nonce $name
true, // Also create a referer nonce
false // Do not echo
);
$this->set_fields(); // Set up the fields for this setting
$this->print_script(); // Print the jQuery that will insert the setting into the DOM
}
/**
* Create the HTML fileds for all of the options required for the additional setting
*
* @return string The fields for the additional setting
*/
private function set_fields(){
$saved_value = get_theme_mod($this->mod, $this->default);
foreach($this->options as $value => $description) :
$checked = ($value === $saved_value) ? 'checked="true"' : false;
$fields[] = sprintf(
'<label>'.
'<input type="radio" id="%1$s" name="%2$s" value="%3$s" %4$s>'.
'%5$s</label> ',
"$this->mod-$key", /** %1$s - The option ID */
$this->mod, /** %2$s - The option name */
$value, /** %3$s - The option vale */
$checked, /** %4$s - Whether or not the option should be checked */
$description /** %5$s - The option description */
);
endforeach;
$this->fields = join('', $fields);
}
/**
* Create the $row to insert in to the DOM and the jQuery function to carry out the insertion
*/
private function print_script(){
$row = sprintf(
'<tr>'.
'<th scope="row">%1$s</th>'.
'<td><fieldset>'.
'<legend class="screen-reader-text"><span>Background %1$s</span></legend>'.
'%2$s%3$s</fieldset></td></tr>',
$this->label, /** %1$s - The setting label */
$this->nonce, /** %2$s - The nonce field for this setting */
$this->fields /** %3$s - The setting fields */
);
if(!is_int($this->position)) :
$this->position = (in_array($this->position, array('first', 'last'))) ? $this->position : 'last';
endif;
?>
<script id="custom-background-mod-<?php echo $this->mod; ?>">jQuery(function <?php echo $this->mod; ?>($){
/** Insert the '<?php echo $this->mod; ?>' setting option in to the Custom Background admin page */
var row = '<?php echo $row; ?>';
var rows = $('.form-table:last tr');
<?php if(is_int($this->position)) : ?>
var position = parseInt('<?php echo $this->position; ?>');
if(position < 0){
rows.first().before(row);
}
else if(position > rows.length){
rows.last().after(row);
}
else{
rows.eq(position - 1).before(row);
}
<?php elseif($this->position === 'first') : ?>
$('.form-table:last tr:first').before(row);
<?php else : ?>
$('.form-table:last tr:last').after(row);
<?php endif; ?>
});</script>
<?php
}
}