Hãy để tôi nói trước điều này bằng cách nói rằng tôi hầu như không bao giờ làm việc với WordPress - thực tế, lần cuối cùng tôi làm một trang web trong WordPress đã trở lại trong suốt 2.2. Hôm qua tôi đã làm khá nhiều thứ lộn xộn và hỏi một số câu hỏi ở đây để cố gắng để một plugin menu cơ bản hoạt động.
Bây giờ tôi có plugin đầy đủ chức năng và hoạt động chính xác như tôi mong đợi, vì vậy tôi quyết định thực hiện các thay đổi nhỏ ở đây và ở đó để thêm chức năng và khả năng tương thích - bao gồm sử dụng API Cài đặt. Tuy nhiên, một thời gian rất ngắn để đọc hướng dẫn về API này và tôi đã khá bối rối, sau đó sự nhầm lẫn này chỉ sâu sắc hơn khi tôi đọc và cố gắng thực hiện các ví dụ - điều này thậm chí còn khó khăn hơn bởi thực tế là plugin của tôi được triển khai như một lớp .
Trừ khi tôi đang làm gì đó sai, từ những gì tôi hiểu để sử dụng API Cài đặt yêu cầu tạo ra một chức năng mới PER SETTING. Điều này có nghĩa là 3-5 chức năng cho plugin trung bình và lên đến hàng trăm cho các plugin nâng cao hơn. Việc viết nhiều hàm này có vẻ lố bịch (và phát triển một hệ thống đặt tên để tránh nhầm lẫn chúng) khi bạn có thể dễ dàng nhập tất cả các $_POST
biến có thể vào một mảng và từ bỏ toàn bộ mớ hỗn độn.
Có lẽ tôi đã lỗi thời, nhưng trừ khi có thứ gì đó để kiếm được từ nó, tôi không thấy lý do để tăng gấp ba hoặc gấp bốn lần số lượng mã tôi đang viết. Đây là cách tôi quản lý các tùy chọn trước khi thử thêm API Cài đặt:
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);
}
}
Bây giờ với API cài đặt, tôi có một cái gì đó giống như sau:
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?
}
Có lẽ rất rõ ràng từ các thanh cuộn rằng mã đã dài hơn chỉ với hai tùy chọn. Rõ ràng là rất rõ ràng từ những bình luận rằng tôi hoàn toàn không hiểu những gì tôi đang làm. Sau đó, có vấn đề về việc có 5 chức năng mới (và chỉ loại bỏ 1) để thực hiện tất cả điều này.
Vì vậy, tôi có được lợi thế gì từ tất cả các công việc làm thêm này?
add_settings_section
và add_settings_field
hai chức năng đó thêm mã hóa vào mã của bạn hơn bất cứ điều gì, tránh những điều đó và bạn tránh sự phình to ..