Permettez-moi de préfacer cela en disant que je ne travaille presque jamais avec WordPress - en fait, la dernière fois que j'ai fait un site dans WordPress était de retour pendant la 2.2. Hier, j'ai tout gâché et j'ai posé plusieurs questions ici pour essayer de faire fonctionner un plugin de menu de base.
J'ai maintenant le plugin entièrement fonctionnel et se comporte exactement comme je m'y attendais, j'ai donc décidé d'apporter des modifications mineures ici et là pour ajouter des fonctionnalités et la compatibilité - y compris en utilisant l'API Settings. Cependant, un très court moment dans la lecture des didacticiels sur cette API et je suis devenu assez confus, puis cette confusion n'a fait que s'approfondir en lisant la suite et en essayant de mettre en œuvre les exemples - ce qui a été rendu encore plus difficile par le fait que mon plugin est implémenté en tant que classe. .
À moins que je ne fasse quelque chose de mal, d'après ce que je comprends, l'utilisation de l'API Paramètres nécessite la création d'une nouvelle fonction PAR RÉGLAGE. Cela signifie 3 à 5 fonctions pour le plugin moyen, et jusqu'à des centaines pour des plugins plus avancés. Il semble tout simplement ridicule d'écrire ces nombreuses fonctions (et de développer un système de nommage pour éviter de les confondre) alors que vous pourriez tout aussi facilement importer toutes les $_POST
variables applicables dans un tableau et renoncer à tout le bordel.
Je suis peut-être démodé, mais à moins qu'il y ait quelque chose à gagner, je ne vois pas la raison de tripler ou quadrupler la quantité de code que j'écris. Voici comment j'ai géré les options avant d'essayer d'ajouter l'API Paramètres:
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);
}
}
Maintenant, avec l'API des paramètres, j'ai quelque chose de plus comme ceci:
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?
}
Il est probablement douloureusement évident à partir des barres de défilement que le code est déjà plus long avec seulement deux options. Il est tout aussi évident, d'après les commentaires, que je ne comprends pas tout à fait ce que je fais. Ensuite, il faut avoir 5 nouvelles fonctions (et n'en supprimer qu'une seule) pour accomplir tout cela.
Alors, quel avantage retirez-vous de tout ce travail supplémentaire?
add_settings_section
et add_settings_field
, ces deux fonctions ajoutent plus que tout à du ballonnement à votre code, évitez celles-ci et vous évitez le ballonnement ..