Was sind die Vorteile der Einstellungs-API?

Lassen Sie mich das vorwegnehmen, indem ich sage, dass ich fast nie mit WordPress arbeite – tatsächlich war das letzte Mal, dass ich eine Seite in WordPress gemacht habe, während des 2.2. Gestern habe ich alles ziemlich durcheinander gebracht und einige Fragen gestellt, um ein einfaches Menü-Plugin zu bekommen.

Ich habe jetzt das Plugin voll funktionsfähig und benehme mich genau so, wie ich es erwarte, also habe ich beschlossen, hier und da kleinere Änderungen vorzunehmen, um functionalität und Kompatibilität hinzuzufügen – einschließlich der Verwendung der Einstellungs-API. Aber einen sehr kurzen Moment in das Lesen von Tutorials zu dieser API und ich wurde ziemlich verwirrt, dann wurde diese Verwirrung nur vertieft, als ich weiter las und versuchte, die Beispiele zu implementieren – was durch die Tatsache, dass mein Plugin als class implementiert wurde, noch schwieriger wurde .

Sofern ich nicht etwas falsch mache, erfordert das, was ich verstehe, um die Einstellungs-API zu verwenden, die Erstellung einer neuen function PER SETTING. Dies bedeutet 3-5 functionen für das durchschnittliche Plugin und bis zu Hunderten für erweiterte Plugins. Es erscheint nur lächerlich, diese vielen functionen zu schreiben (und ein Benennungssystem zu entwickeln, um sie nicht zu verwirren), wenn Sie ebenso einfach alle anwendbaren $_POST Variablen in ein Array importieren und auf das gesamte Chaos verzichten könnten.

Vielleicht bin ich altmodisch, aber es sei denn, dass etwas davon zu gewinnen ist, sehe ich nicht den Grund, den Code, den ich schreibe, zu verdreifachen oder zu vervierfachen. So habe ich Optionen verwaltet, bevor ich versucht habe, die Einstellungs-API hinzuzufügen:

  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'; } ?> 

DE Menu Plugin

<form method="post" action=""> <input type="text" name="de-menu-columns" value="options['columns']; ?>" />

options, $this->db_options ); if( !empty( $diff ) ){ update_option('de-menu-options', $this->options); } }

Jetzt habe ich mit der Einstellungs-API etwas mehr wie folgt:

  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'; } ?> 

DE Menu Plugin

<form method="post" action="">

<?php } public function options_section() { echo '

' . __('Main description of this section here.','de-menu-lang') . '

'; } public function options_maintenance() { echo ""; } public function options_columns() { echo "options['columns']."/>"; } function validate($options) { return $options; // I guess? }

Es ist wahrscheinlich schmerzhaft aus den Bildlaufleisten, dass der Code bereits länger ist mit nur zwei Optionen. Es ist ebenso offensichtlich aus den Kommentaren, dass ich nicht ganz verstehe, was ich mache. Dann ist es die Frage von 5 neuen functionen (und Entfernen von nur 1), um all dies zu erreichen.

Welchen Vorteil habe ich also von dieser zusätzlichen Arbeit?

Solutions Collecting From Web of "Was sind die Vorteile der Einstellungs-API?"

Mein Standpunkt ist, dass das Hauptziel und der Nutzen der Einstellungs-API die Struktur ist .

Es hilft, komplexe Einstellungen beizubehalten:

  • ordentlich (Logik der Registrierung und Abschnitte);
  • Sicher (Nonces, validationsrückrufe);
  • erweiterbar (Einhängen in eine andere Seite oder Einhängen).

Wie bei jedem strukturellen Mehraufwand profitieren auch komplexere Anwendungsfälle und weniger einfache Vorteile.

Sie können also alles implementieren, was die Einstellungs-API tut, ohne sie zu verwenden. Die Frage ist, ob Sie das auf zuverlässige, sichere und erweiterbare Weise erreichen können.

Wenn Sie callbacke ordnungsgemäß verwenden, ist der gesamte redundante Code nicht erforderlich. So implementiere ich die Einstellungs-API vollständig skalierbar .

Vorteile (unter anderem):

  • Die Einstellungs-API erzwingt die Bereinigung von nicht vertrauenswürdigen Benutzerdaten.
  • Das Settings-API erzwingt die Registrierung von Optionen als Options-Array, was zu einem einzelnen wp_options-DB-Eintrag anstelle von diskreten DB-Einträgen für jede Option führt
  • Die Einstellungs-API erleichtert die Sicherheit des Einstellungsformulars
  • Die Einstellungs-API vereinfacht die Admin-Benutzeroberfläche, die mit der core-Admin-Benutzeroberfläche konsistent ist, was zu einer besseren Benutzerfreundlichkeit führt

Danke, dass du das geschrieben hast, ich habe mich genau gefragt. Viele functionen.

Um sie zu reduzieren, können Sie Ihre Optionen als Arrays speichern. WordPress serialisiert die Daten für Sie. Dies spart Code (oder funktioniert sowieso), macht aber schlechtere Daten. Wenn Sie beispielsweise Ihre Tabellen sortieren, manuell bearbeiten, exportieren usw. möchten, haben sie diese serialisierten Werte. Auf der anderen Seite fügt Ihr Plugin der Optionstabelle weniger Einträge hinzu und sie sind leichter zu bereinigen.

Also hier ist dein Code neu gemacht. Ein paar Anmerkungen:

  • Mein Beispiel zeigt sowohl einfache Optionen (de_w, de_h) als auch eine Array-Option (de_width_height).
  • Bereinigen Sie immer Benutzereingaben. Ich habe Integer im Beispiel verwendet, weil sie einfach zu desinfizieren sind.
  • Sie benötigen $ _POST, nonces, check_admin_referer (), update_option () usw. nicht, wenn Sie die Einstellungs-API verwenden.
  • Das Speichern erfolgt beim nächsten Laden der Seite, nicht beim Herunterfahren. Dann macht WP eine Umleitung zu Ihrer Seite. Also zum Debuggen, drucken Sie einige Ausgaben und rufen Sie wp_die () in einer der validationsfunktionen auf.
  • Die Formularaktion ist immer “options.php”. So funktioniert die Einstellungs-API. Verwenden Sie nichts anderes. Nun, Sie können admin_url (‘options.php’) verwenden, wenn Sie möchten.
  • WP wird die Sicherungsnachricht für Sie ausdrucken.
  • Erweiterungen, die hier nicht enthalten sind: Verwenden von für die Barrierefreiheit. Mit add_settings_error (), settings_error (), die sowohl Nachrichten als auch Fehler behandeln. Dies ist oft der einzige Grund, getrennte validationsfunktionen für jede Option zu verwenden. Sie können unten validate_w () sehen und validate_h () könnte eine function sein. Ich habe versucht, das Messaging zu abstrahieren, aber Sie erhalten nicht genügend Informationen im validations-Callback, soweit ich mich erinnere. Wie in welchem ​​Feld arbeiten Sie?
  • Die validations-Callback-functionen erhalten einen rohen $ _POST-Wert von der Einstellungs-API. Ich mag es, den Parameter als solchen zu nennen, $ rohe. Für die Array-Option erhalten Sie ein Array, wie Magie.
  • Edit: $ das ist besser als & $ this.

Code:

 < ?php $foo= new de_Foo(); class de_Foo { function __construct() { if (is_admin()) { add_action('admin_menu', array($this, 'admin_menu')); add_action('admin_init', array($this, 'admin_init')); } } public function admin_menu() { add_options_page( 'DE Menu Options', 'DE Menu', 'manage_options', 'de-menu-options', array($this,'xoxptions') ); // add_option('de-menu-options', $this->options); } public function admin_init() { register_setting( 'de-menu-settings-group', 'de_w', array($this, 'validate_w') ); register_setting( 'de-menu-settings-group', 'de_h', array($this, 'validate_h') ); register_setting( 'de-menu-settings-group', 'de_width_height', array($this, 'validate_width_height') ); add_settings_section( 'de-menu-settings-section-size', 'Size', array($this, 'settings_section_size_render'), 'de-menu-options' ); add_settings_field( 'de_w', 'W', array($this, 'w_render'), 'de-menu-options', 'de-menu-settings-section-size' ); add_settings_field( 'de_h', 'H', array($this, 'h_render'), 'de-menu-options', 'de-menu-settings-section-size' ); add_settings_field( 'de_width_height', 'Width / Height', array($this, 'width_height_render'), 'de-menu-options', 'de-menu-settings-section-size' ); } public function options() { if (!current_user_can('manage_options')) { wp_die( __('You do not have sufficient permissions to access this page.') ); } //////////////////////////// // no no no //////////////////////////// // 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'; // } //////////////////////////// ?> 

DE Menu Plugin

< ?php settings_fields('de-menu-settings-group'); ?> < ?php do_settings_sections('de-menu-options'); ?>

< ?php } public function settings_section_size_render() { echo '

' . __('Main description of this section here.','de-menu-lang') . ''; } public function w_render() { $w= esc_attr( get_option('de_w') ); echo "

\n"; } public function h_render() { $h= esc_attr( get_option('de_h') ); echo "

\n"; } public function width_height_render() { $width_height= get_option('de_width_height', array()); $width= esc_attr( @$width_height['width'] ); $height= esc_attr( @$width_height['height'] ); echo "

Width:

\n"; echo "

Height:

\n"; } function validate_w($raw) { return (int)$raw; } function validate_h($raw) { return (int)$raw; } function validate_width_height($raw) { is_array($raw) or $raw= array(); $result= array(); $result['width']= (int)@$raw['width']; $result['height']= (int)@$raw['height']; return $result; } }