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?
la source
add_settings_section
etadd_settings_field
, ces deux fonctions ajoutent plus que tout à du ballonnement à votre code, évitez celles-ci et vous évitez le ballonnement ..Réponses:
Mon point de vue est que l'objectif principal et l'avantage de l'API Settings est la structure .
Il permet de conserver des configurations de paramètres complexes:
Comme pour tout frais généraux structurels, il bénéficie à des cas d'utilisation plus complexes et à des cas moins simples.
Vous pouvez donc mettre en œuvre tout ce que l'API Settings fait sans l'utiliser. La question est de savoir si vous pouvez accomplir cela de manière aussi fiable, sécurisée et extensible.
la source
Si vous utilisez correctement les rappels, vous n'avez pas besoin de tout le code redondant. Voici comment j'implémente l'API Settings, d'une manière complètement évolutive .
Avantages (entre autres):
la source
oenology_get_settings_by_tab()
etoenology_get_default_options
sans jamais les définir au préalable? Je pensais que c'était assez mauvais à 209 lignes de code (après avoir supprimé les commentaires et les lignes vides), mais une fois ces fonctions définies, ce sera encore plus long ... Pour quatre options?oenology_get_settings_by_tab()
n'est pas vraiment pertinent pour ce que vous faites. Mais vous devez définir votre balisage de champ de formulaire quelque part , tout comme vous devez valider / désinfecter les entrées utilisateur d'une manière ou d' une autre , donc si vous le faites correctement, vous aurez également le même code.Merci d'avoir posté ça, je me demandais exactement la même chose. Beaucoup de fonctions.
Pour les réduire, vous pouvez stocker vos options sous forme de tableaux. Wordpress sérialise les données pour vous. Cela économise du code (ou fonctionne de toute façon), mais aggrave les données. Par exemple, si vous souhaitez trier, modifier manuellement, exporter, etc., vos tables, elles auront ces valeurs sérialisées. D'un autre côté, votre plugin ajoute moins d'entrées au tableau des options et elles sont plus faciles à nettoyer.
Voici donc votre code refait. Quelques notes:
<label>
pour l'accessibilité. Utilisation de add_settings_error (), settings_error (), qui gèrent les messages ainsi que les erreurs. C'est souvent la seule raison d'avoir des fonctions de validation distinctes pour chaque option. Vous pouvez voir ci-dessous validate_w () et validate_h () pourrait être une fonction. J'ai cherché à résumer la messagerie, mais je ne me souviens pas d'avoir suffisamment d'informations dans le rappel de validation. Comme dans quel domaine vous travaillez.Code:
la source