私がこれまでWordPressを操作することはほとんどないと言って、その前に説明しましょう。実際、WordPressで最後にサイトを開いたのは2.2の間でした。昨日、私はすべてをかなり混乱させ、基本的なメニュープラグインを動かそうとしてここにいくつかの質問をしました。
これで、プラグインは完全に機能し、期待どおりに動作するようになりました。そこで、設定APIの使用など、機能と互換性を追加するためにあちこちで小さな変更を加えることにしました。しかし、このAPIのチュートリアルを読むことに非常に短い時間がかかり、私は非常に混乱しました、そしてこの混乱は私が読んで例を実装しようとしたときにのみ深まりました。 。
私が何か間違ったことをしているのでなければ、私がSettings APIを使うことを理解しているものから新しい設定PER PERTINGの作成を必要とします。これは、平均的なプラグインでは3〜5の機能、より高度なプラグインでは最大数百の機能があることを意味します。適用可能なすべての$_POST
変数を簡単に配列にインポートして混乱全体を見逃すことができない場合は、このような多くの関数を記述して(そしてそれらを混同しないように命名システムを開発するのが)おかしなことに思えます。
おそらく私は昔ながらのものですが、そこから何か得られるものがない限り、私が書いているコードの量を3倍または4倍にする理由はわかりません。 Settings 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?
}
スクロールバーから、2つのオプションだけでコードがすでに長くなっていることはおそらく痛いほど明白です。私がしていることを完全には理解していないことは、コメントからも同様に明白です。それから、これらすべてを達成するために5つの新しい機能を持つ(そして1つだけを削除する)という問題があります。
それで、私がこの余分な作業のすべてからどのような利点を得ているのでしょうか。
私の考えでは、Settings APIの主な目的と利点は 構造 です。
それは複雑な設定設定を保つのを助けます:
そのような構造的なオーバーヘッドと同様に、それはより複雑なユースケースに利益をもたらし、単純ではないユースケースに利益をもたらします。
それで、あなたはそれを使わずにSettings APIがすることは何でも実装することができます。問題は、信頼性があり、安全で拡張可能な方法でそれを達成できるかどうかです。
コールバックを適切に使用すれば、冗長なコードをすべて用意する必要はありません。 完全にスケーラブルな方法でSettings APIを実装する方法は次のとおりです 。
利点(とりわけ)
これを投稿してくれてありがとう、私はまったく同じことを思っていました。たくさんの機能.
それらを減らすためにあなたは配列としてあなたのオプションを保存することができます。 Wordpressはあなたのためにデータをシリアル化します。これはコード(またはとにかく機能)を節約しますが、データを悪化させます。たとえば、テーブルの並べ替え、手動編集、エクスポートなどを行いたい場合は、これらのシリアル化された値が使用されます。その一方で、あなたのプラグインはオプションテーブルに追加するエントリが少なくなり、それらはクリーンアップするのがより簡単になります。
だからここにあなたのコードをやり直しました。いくつかのメモ:
<label>
の使用。 add_settings_error()、settings_error()を使用して、メッセージとエラーを処理します。多くの場合、これがオプションごとに別々の検証機能を持つ唯一の理由です。下記のvalidate_w()とvalidate_h()が一つの関数になるでしょう。メッセージングを抽象化しようとしましたが、思い出したときに検証コールバックで十分な情報が得られません。あなたが取り組んでいる分野のように。コード:
<?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';
// }
////////////////////////////
?>
<div class="wrap">
<h2>DE Menu Plugin</h2>
<form method="post" action="<?php echo admin_url('options.php'); ?>">
<?php settings_fields('de-menu-settings-group'); ?>
<?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 settings_section_size_render() {
echo '<p>' . __('Main description of this section here.','de-menu-lang') . '</p>';
}
public function w_render() {
$w= esc_attr( get_option('de_w') );
echo "<p><input name='de_w' value='$w'></p>\n";
}
public function h_render() {
$h= esc_attr( get_option('de_h') );
echo "<p><input name='de_h' value='$h'></p>\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 "<p>Width: <input name='de_width_height[width]' value='$width'></p>\n";
echo "<p>Height: <input name='de_width_height[height]' value='$height'></p>\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;
}
}