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?
add_settings_section
und add_settings_field
diese beiden Funktionen hinzufügen aufblasen , um Ihren Code mehr als alles andere, vermeiden diese und Sie die aufblasen vermeiden ..