Pozwólcie, że poprzedzę to stwierdzeniem, że prawie nigdy nie pracuję z WordPress - w rzeczywistości ostatni raz, gdy tworzyłem witrynę w WordPress, powróciłem w wersji 2.2. Wczoraj zepsułem wszystko i zadałem kilka pytań, próbując uruchomić podstawową wtyczkę menu.
Teraz mam wtyczkę w pełni funkcjonalną i zachowuję się dokładnie tak, jak się spodziewam, więc postanowiłem wprowadzić drobne zmiany tu i tam, aby dodać funkcjonalność i kompatybilność - w tym za pomocą interfejsu API ustawień. Jednak bardzo krótka chwila na zapoznanie się z samouczkami na temat tego interfejsu API i poczułem się dość zdezorientowany, potem zamieszanie to pogłębiło się, gdy czytałem dalej i próbowałem zaimplementować przykłady - co było jeszcze trudniejsze, ponieważ moja wtyczka została zaimplementowana jako klasa .
O ile nie zrobię czegoś złego, z tego, co rozumiem, aby korzystać z interfejsu API ustawień, należy utworzyć nową funkcję NA USTAWIENIE. Oznacza to 3-5 funkcji dla przeciętnej wtyczki i do setek dla bardziej zaawansowanych wtyczek. Śmiesznie wydaje się pisanie tak wielu funkcji (i opracowanie systemu nazewnictwa, aby nie pomylić ich), gdy równie łatwo można zaimportować wszystkie odpowiednie $_POST
zmienne do tablicy i zrezygnować z całego bałaganu.
Być może jestem staroświecki, ale chyba że coś z tego zyskam, nie widzę powodu, aby trzykrotnie zwiększyć czterokrotnie ilość pisanego kodu. Oto jak zarządzałem opcjami przed próbą dodania API ustawień:
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);
}
}
Teraz z interfejsem API ustawień mam coś więcej:
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?
}
Prawdopodobnie boleśnie wynika z pasków przewijania, że kod jest już dłuższy z tylko dwiema opcjami. Z komentarzy wynika, że nie do końca rozumiem, co robię. Potem jest kwestia posiadania 5 nowych funkcji (i usunięcia tylko 1), aby to wszystko osiągnąć.
Więc jaką korzyść czerpię z całej tej dodatkowej pracy?
źródło
add_settings_section
aadd_settings_field
te dwie funkcje dodają nadmiar kodu do twojego kodu bardziej niż cokolwiek innego, unikaj go i unikaj wzdęcia.Odpowiedzi:
Moim zdaniem, głównym celem i zaletą interfejsu API ustawień jest struktura .
Pomaga zachować złożone ustawienia ustawień:
Jak w przypadku każdego takiego narzutu strukturalnego, przynosi korzyść bardziej złożonym przypadkom użycia i przynosi korzyści mniej prostym przypadkom.
Możesz więc zaimplementować wszystko, co robi API ustawień bez jego używania. Pytanie brzmi, czy możesz to osiągnąć w sposób tak niezawodny, bezpieczny i rozszerzalny.
źródło
Jeśli prawidłowo używasz wywołań zwrotnych, nie ma potrzeby stosowania całego nadmiarowego kodu. Oto, w jaki sposób implementuję interfejs API ustawień w sposób całkowicie skalowalny .
Zalety (między innymi):
źródło
oenology_get_settings_by_tab()
ioenology_get_default_options
bez ich wcześniejszego definiowania? Myślałem, że było wystarczająco źle przy 209 wierszach kodu (po usunięciu komentarzy i pustych wierszy), ale kiedy te funkcje zostaną zdefiniowane, będzie jeszcze dłużej ... Dla czterech opcji?oenology_get_settings_by_tab()
nie jest tak naprawdę związane z tym, co robisz. Ale ty masz do definiowania znaczników forma-field gdzieś , tak jak ty masz na działania użytkownika validate / zdezynfekować jakoś , więc jeśli robisz to dobrze, trzeba cały ten sam kod, jak również.Dzięki za opublikowanie tego, zastanawiałem się dokładnie nad tym samym. Wiele funkcji.
Aby je zmniejszyć, możesz przechowywać swoje opcje jako tablice. Wordpress serializuje dane za Ciebie. Oszczędza to kod (lub i tak działa), ale pogarsza dane. Na przykład, jeśli chcesz sortować, ręcznie edytować, eksportować itp. Swoje tabele, będą miały te szeregowane wartości. Z drugiej strony wtyczka dodaje mniej pozycji do tabeli opcji i łatwiej je oczyścić.
Więc oto twój kod jest gotowy. Kilka uwag:
<label>
z ułatwień dostępu. Korzystanie z add_settings_error (), settings_error (), które obsługują zarówno komunikaty, jak i błędy. To często jedyny powód posiadania osobnych funkcji sprawdzania poprawności dla każdej opcji. Możesz zobaczyć poniżej validate_w () i validate_h () może być jedną funkcją. Patrzyłem na próbę wyodrębnienia wiadomości, ale nie pamiętam wystarczająco dużo informacji w wywołaniu zwrotnym sprawdzania poprawności. Jak na jakiej dziedzinie pracujesz.Kod:
źródło