Permítanme presentar esto diciendo que casi nunca trabajo con WordPress; de hecho, la última vez que hice un sitio en WordPress fue en 2.2. Ayer hice un desastre de todo y hice varias preguntas aquí tratando de hacer que funcione un complemento de menú básico.
Ahora tengo el complemento completamente funcional y se comporta exactamente como esperaba, así que decidí hacer cambios menores aquí y allá para agregar funcionalidad y compatibilidad, incluido el uso de la API de configuración. Sin embargo, un momento muy breve en la lectura de tutoriales en esta API y me confundí bastante, luego esta confusión solo se profundizó a medida que leía e intentaba implementar los ejemplos, lo que se hizo aún más difícil por el hecho de que mi complemento se implementa como una clase .
A menos que esté haciendo algo mal, por lo que entiendo que usar la API de configuración requiere la creación de una nueva función POR CONFIGURACIÓN. Esto significa 3-5 funciones para el complemento promedio, y hasta cientos para complementos más avanzados. Simplemente parece absurdo escribir tantas funciones (y desarrollar un sistema de nombres para evitar confundirlas) cuando podría importar fácilmente todas las $_POST
variables aplicables en una matriz y renunciar a todo el desastre.
Tal vez soy anticuado, pero a menos que haya algo que ganar, no veo la razón para triplicar o cuadruplicar la cantidad de código que estoy escribiendo. Así es como gestioné las opciones antes de intentar agregar la API de configuración:
function __construct() {
/* constructor stuff */
$this->options = $this->db_options = get_option( 'de-menu-options' );
if( $this->options === false ){
$this->options = $this->defaults;
}
if (is_admin()) {
add_action('admin_menu', array(&$this, 'admin_menu'));
}
/* more stuff */
// When WordPress shuts down we store changes to options
add_action('shutdown', array(&$this, 'update'));
}
public function admin_menu() {
add_options_page('DE Menu Options', 'DE Menu', 'manage_options', 'de-menu-options', array(&$this, 'options'));
add_option('de-menu-options', $this->options);
}
public function options() {
if (!current_user_can('manage_options')) {
wp_die( __('You do not have sufficient permissions to access this page.') );
}
if ( !empty($_POST) && check_admin_referer('de-menu-options') ) {
// These options are saved to the database at shutdown
$this->options = array(
"columns" => $_POST["de-menu-columns"],
"maintenance" => $_POST["de-menu-maintenance"]
);
echo 'DE Menu options saved';
}
?>
<div class="wrap">
<h2>DE Menu Plugin</h2>
<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
<?php settings_fields('de-menu-options'); ?>
<input type="checkbox" name="de-menu-maintenance" />
<label for="de-menu-columns">Columns:</label>
<input type="text" name="de-menu-columns" value="<?php echo $this->options['columns']; ?>" />
<p class="submit">
<input type="submit" name="de-menu-submit" value="Update Options »" />
</p>
</form>
</div>
<?php
}
function update() {
// By storing all changes at the end we avoid multiple database calls
$diff = array_diff( $this->options, $this->db_options );
if( !empty( $diff ) ){
update_option('de-menu-options', $this->options);
}
}
Ahora con la API de configuración tengo algo más parecido a lo siguiente:
function __construct() {
/* constructor stuff */
// Do I load options? Will they be loaded for me? Who knows?
if (is_admin()) {
add_action('admin_menu', array(&$this, 'admin_menu'));
add_action('admin_init', array(&$this, 'admin_init'));
}
/* more stuff */
// Settings API should update options for me... I think
}
public function admin_menu() {
add_options_page('DE Menu Options', 'DE Menu', 'manage_options', 'de-menu-options', array(&$this, 'options'));
add_option('de-menu-options', $this->options);
}
public function admin_init() {
register_setting('de-menu-options','de-menu-options',array(&$this,'validate'));
add_settings_section('de-menu-main-options', 'Main Settings', 'options_section', 'de-menu-options');
add_settings_field('de-menu-maintenance', 'Maintenance Mode', array(&$this,'options_maintenance'), 'de-menu-options', 'de-menu-main-options');
add_settings_field('de-menu-columns', 'Columns', array(&$this,'options_columns'), 'de-menu-options', 'de-menu-main-options');
}
public function options() {
if (!current_user_can('manage_options')) {
wp_die( __('You do not have sufficient permissions to access this page.') );
}
if ( !empty($_POST) && check_admin_referer('de-menu-options') ) {
// These options are saved to the database at shutdown
$this->options = array(
"columns" => $_POST["de-menu-columns"],
"maintenance" => $_POST["de-menu-maintenance"]
);
echo 'DE Menu options saved';
}
?>
<div class="wrap">
<h2>DE Menu Plugin</h2>
<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
<?php settings_fields('de-menu-options'); ?>
<?php do_settings_sections('de-menu-options'); ?>
<p class="submit">
<input type="submit" name="de-menu-submit" value="Update Options »" />
</p>
</form>
</div>
<?php
}
public function options_section() {
echo '<p>' . __('Main description of this section here.','de-menu-lang') . '</p>';
}
public function options_maintenance() {
echo "<input id='de-menu-maintenance' name='options[maintenance]' type='checkbox' />";
}
public function options_columns() {
echo "<input id='de-menu-columns' name='options[columns]' type='checkbox' value=".$this->options['columns']."/>";
}
function validate($options) {
return $options; // I guess?
}
Probablemente sea dolorosamente obvio por las barras de desplazamiento que el código ya es más largo con solo dos opciones. Es obvio por los comentarios que no entiendo completamente lo que estoy haciendo. Luego está la cuestión de tener 5 nuevas funciones (y eliminar solo 1) para lograr todo esto.
Entonces, ¿qué ventaja estoy obteniendo de todo este trabajo extra?
add_settings_section
y add_settings_field
, esas dos funciones agregan hinchazón a tu código más que nada, evítalos y evita la hinchazón ...