WordPress에서 거의 작업하지 않는다는 말로이 서문을 시작하겠습니다. 실제로 WordPress에서 사이트를 마지막으로 방문했을 때 2.2로 돌아 왔습니다. 어제 나는 모든 것을 엉망으로 만들고 기본 메뉴 플러그인을 작동 시키려고 몇 가지 질문을했습니다.
이제 플러그인이 제대로 작동하고 예상대로 작동하므로 Settings API 사용을 포함하여 기능과 호환성을 추가하기 위해 여기에서 약간 변경하기로 결정했습니다. 그러나이 API에 대한 자습서를 읽는 순간이 매우 혼란스러워서 혼란스러워졌고 예제를 읽고 구현하려고 시도했을 때만 혼란이 심화되었습니다. .
내가 잘못하고 있지 않는 한, 설정 API를 사용하는 것으로 이해하려면 새로운 설정 PER 기능을 만들어야합니다. 이는 평균 플러그인의 경우 3-5 개의 기능을, 고급 플러그인의 경우 최대 수백 가지를 의미합니다. 적용 가능한 모든 $_POST
변수를 배열 로 쉽게 가져 와서 전체 혼란을 포기할 수있을 때이 많은 함수를 작성하고 혼동하지 않도록 명명 시스템을 개발하는 것이 터무니없는 것 같습니다 .
아마도 나는 구식이지만, 얻을 것이 없다면, 내가 쓰고있는 코드의 양을 3 배 또는 4 배로 늘릴 이유를 알지 못합니다. 설정 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
더 무엇보다, 사람들을 피하고 당신이 팽창하지 않도록,이 두 기능은 코드에 부풀게를 추가 ..