Дозвольте мені передмовити це, сказавши, що я навряд чи коли-небудь працюю з WordPress - насправді, востаннє, коли я робив сайт у WordPress, повертався протягом 2.2. Вчора я заплутався у всьому, і задав тут кілька запитань, намагаючись зробити базовий плагін меню робочим.
Тепер у мене плагін повністю функціонує і поводиться точно так, як я очікував, тому я вирішив внести незначні зміни тут і там, щоб додати функціональність та сумісність - включаючи використання API налаштувань. Однак дуже короткий момент, коли я читав підручники з цього API, і я дуже заплутався, тоді ця плутанина лише поглибилась, коли я читав і намагався реалізувати приклади - що було ще складніше через те, що мій плагін реалізований як клас .
Якщо я не роблю щось не так, з того, що я розумію, використовувати API Settings, потрібно створити нову функцію PER SETTING. Це означає 3-5 функцій для середнього плагіна і до сотні для більш розвинених плагінів. Дуже смішно писати це багато функцій (і розробити систему імен, щоб не заплутати їх), коли ви могли так само легко імпортувати всі застосовні $_POST
змінні в масив і відмовитися від усього безладу.
Можливо, я старомодний, але, якщо від цього є що отримати, я не бачу приводу втричі чи вчетверо, скільки коду я пишу. Ось як я керував параметрами перед спробою додати API налаштувань:
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);
}
}
Тепер у API налаштувань у мене є щось на кшталт наступного:
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?
}
З прокрутки, мабуть, болісно очевидно, що код вже довший із лише двома варіантами. З коментарів це очевидно, що я не зовсім розумію, що роблю. Тоді справа в тому, щоб мати 5 нових функцій (і видалити лише 1) для виконання всього цього.
Тож яку перевагу я отримую від усієї цієї додаткової роботи?
add_settings_section
і add_settings_field
ці дві функції додають коду до вашого коду більше, ніж нічого, уникайте цих, і ви уникаєте роздуття ..