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?
fuente
add_settings_section
yadd_settings_field
, esas dos funciones agregan hinchazón a tu código más que nada, evítalos y evita la hinchazón ...Respuestas:
Mi punto de vista es que el objetivo principal y el beneficio de la API de configuración es la estructura .
Ayuda a mantener configuraciones complejas:
Al igual que con cualquier sobrecarga estructural, beneficia los casos de uso más complejos y los menos simples.
Entonces puede implementar cualquier cosa que haga la API de configuración sin usarla. La pregunta es si puede lograrlo de manera confiable, segura y extensible.
fuente
Si utiliza devoluciones de llamada correctamente, no es necesario todo el código redundante. Así es como implemento la API de configuración, de una manera que es completamente escalable .
Ventajas (entre otras cosas):
fuente
oenology_get_settings_by_tab()
yoenology_get_default_options
sin definirlas primero? Pensé que era lo suficientemente malo en 209 líneas de código (después de eliminar comentarios y líneas en blanco), pero una vez que se definan esas funciones, será aún más largo ... ¿Para cuatro opciones?oenology_get_settings_by_tab()
no es realmente relevante para lo que estás haciendo. Pero usted tiene que definir su forma de campo de marcado algún lugar , tal y como lo tiene para validar la entrada del usuario / desinfectar alguna manera , así que si estás haciendo bien, tendrá todo lo mismo código también.Gracias por publicar esto, me preguntaba exactamente lo mismo. Muchas funciones
Para reducirlos, puede almacenar sus opciones como matrices. Wordpress serializa los datos por usted. Esto ahorra en código (o funciona de todos modos), pero empeora los datos. Por ejemplo, si desea ordenar, editar a mano, exportar, etc., sus tablas, tendrán estos valores serializados. Por otro lado, su complemento agrega menos entradas a la tabla de opciones y son más fáciles de limpiar.
Así que aquí está tu código rehecho. Algunas notas
<label>
para accesibilidad. Usando add_settings_error (), settings_error (), que maneja mensajes y errores. Esa es a menudo la única razón para tener funciones de validación separadas para cada opción. Puede ver a continuación validate_w () y validate_h () podría ser una función. Miré tratando de abstraer el mensaje, pero no recuerdo que reciban suficiente información en la devolución de llamada de validación. Como en qué campo estás trabajando.Código:
fuente