Lassen Sie mich vorwegnehmen, dass ich kaum mit WordPress arbeite - tatsächlich war das letzte Mal, dass ich eine Site in WordPress erstellte, 2.2. Gestern habe ich alles durcheinander gebracht und hier einige Fragen gestellt, um ein einfaches Menü-Plugin zum Laufen zu bringen.
Ich habe jetzt das Plugin voll funktionsfähig und verhalte mich genau so, wie ich es erwartet habe. Daher habe ich mich dazu entschlossen, hier und da kleinere Änderungen vorzunehmen, um Funktionalität und Kompatibilität hinzuzufügen - einschließlich der Verwendung der Einstellungs-API. Ein sehr kurzer Moment, in dem ich Tutorials zu dieser API gelesen hatte, und ich war ziemlich verwirrt, dann wurde diese Verwirrung nur noch größer, als ich weiterlas und versuchte, die Beispiele zu implementieren - was durch die Tatsache, dass mein Plugin als Klasse implementiert ist, noch schwieriger wurde .
Sofern ich nichts falsch mache, muss nach meinem Verständnis für die Verwendung der Einstellungs-API eine neue Funktion PRO EINSTELLUNG erstellt werden. Dies bedeutet 3-5 Funktionen für das durchschnittliche Plugin und bis zu Hunderten für fortgeschrittenere Plugins. Es erscheint einfach lächerlich, so viele Funktionen zu schreiben (und ein Benennungssystem zu entwickeln, um sie nicht zu verwirren), wenn Sie genauso einfach alle anwendbaren $_POST
Variablen in ein Array importieren und auf das gesamte Durcheinander verzichten können.
Vielleicht bin ich altmodisch, aber wenn ich nicht etwas davon habe, sehe ich keinen Grund, wie viel Code ich schreibe, um das Dreifache oder Vierfache zu erhöhen. So verwaltete ich Optionen, bevor ich versuchte, 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';
}
?>
<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);
}
}
Jetzt habe ich mit der Einstellungs-API etwas Ähnliches:
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?
}
An den Bildlaufleisten ist wahrscheinlich schmerzlich zu erkennen, dass der Code mit nur zwei Optionen bereits länger ist. Aus den Kommentaren geht ebenfalls hervor, dass ich nicht ganz verstehe, was ich tue. Dann muss man 5 neue Funktionen haben (und nur 1 entfernen), um all dies zu erreichen.
Welchen Vorteil habe ich von all dieser zusätzlichen Arbeit?
quelle
add_settings_section
undadd_settings_field
diese beiden Funktionen hinzufügen aufblasen , um Ihren Code mehr als alles andere, vermeiden diese und Sie die aufblasen vermeiden ..Antworten:
Meiner Ansicht nach besteht der Hauptzweck und Nutzen der Einstellungs-API in der Struktur .
Es hilft, komplexe Einstellungs-Setups beizubehalten:
Wie bei jedem derartigen strukturellen Aufwand ergeben sich Vorteile für komplexere Anwendungsfälle und für weniger einfache.
Sie können also alles implementieren, was die Einstellungs-API tut, ohne sie zu verwenden. Die Frage ist, ob Sie dies auf zuverlässige, sichere und erweiterbare Weise erreichen können.
quelle
Wenn Sie Rückrufe ordnungsgemäß verwenden, ist nicht der gesamte redundante Code erforderlich. So implementiere ich die Einstellungs-API auf eine Weise, die vollständig skalierbar ist .
Vorteile (unter anderem):
quelle
oenology_get_settings_by_tab()
undoenology_get_default_options
ohne jemals zuerst definieren sie? Bei 209 Codezeilen (nach dem Entfernen von Kommentaren und Leerzeilen) fand ich das schon schlimm genug, aber wenn diese Funktionen erst einmal definiert sind, wird es noch länger dauern ... Für vier Optionen?oenology_get_settings_by_tab()
ist nicht wirklich relevant für das, was du tust. Aber Sie haben Ihr Formular-Feld Markup definieren irgendwo , so wie Sie haben zu validate / sanitize Benutzereingabe irgendwie , also wenn Sie es richtig machen, werden Sie alle am selben Code wie gut.Danke, dass du das gepostet hast, ich habe mich genau das Gleiche gefragt. Viele Funktionen.
Um sie zu reduzieren, können Sie Ihre Optionen als Arrays speichern. Wordpress serialisiert die Daten für Sie. Dies spart Code (oder Funktionen), verschlechtert jedoch die Datenqualität. Wenn Sie beispielsweise Ihre Tabellen sortieren, von Hand 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 einfacher zu bereinigen.
Also hier ist dein Code neu geschrieben. Ein paar Anmerkungen:
<label>
für die Barrierefreiheit. Mit add_settings_error (), settings_error (), die sowohl Nachrichten als auch Fehler behandeln. Dies ist oft der einzige Grund, für jede Option separate Validierungsfunktionen zu haben. Unten sehen Sie, dass validate_w () und validate_h () eine Funktion sein können. Ich habe versucht, die Nachrichten zu abstrahieren, aber ich erinnere mich, dass der Validierungsrückruf nicht genügend Informationen enthält. Zum Beispiel, auf welchem Gebiet Sie gerade arbeiten.Code:
quelle