Permita-me dizer isso dizendo que quase nunca trabalho com o WordPress - na verdade, a última vez que fiz um site no WordPress estava de volta durante o 2.2. Ontem fiz uma bagunça de tudo e fiz várias perguntas aqui, tentando fazer com que um plugin básico de menu funcionasse.
Agora tenho o plug-in totalmente funcional e funcionando exatamente como eu esperava, então decidi fazer pequenas alterações aqui e ali para adicionar funcionalidade e compatibilidade - incluindo o uso da API de configurações. No entanto, um momento muito curto para ler os tutoriais dessa API e fiquei bastante confuso; essa confusão só se aprofundou enquanto eu lia e tentava implementar os exemplos - o que foi ainda mais difícil pelo fato de meu plug-in ser implementado como uma classe. .
A menos que eu esteja fazendo algo errado, pelo que entendi usar a API de configurações, é necessária a criação de uma nova função POR CONFIGURAÇÃO. Isso significa 3-5 funções para o plug-in médio e até centenas para plug-ins mais avançados. Parece ridículo escrever essas muitas funções (e desenvolver um sistema de nomes para não confundi-las) quando você poderia importar facilmente todas as $_POST
variáveis aplicáveis para uma matriz e renunciar a toda a bagunça.
Talvez eu seja antiquado, mas, a menos que haja algo a ganhar com isso, não vejo motivo para triplicar ou quadruplicar a quantidade de código que estou escrevendo. Veja como eu gerenciei as opções antes de tentar adicionar a API de configurações:
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);
}
}
Agora, com a API de configurações, tenho algo mais como o seguinte:
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?
}
Provavelmente é dolorosamente óbvio pelas barras de rolagem que o código já é mais longo com apenas duas opções. É óbvio, pelos comentários, que eu não entendo completamente o que estou fazendo. Depois, há a questão de ter 5 novas funções (e remover apenas 1) para realizar tudo isso.
Então, que vantagem estou ganhando com todo esse trabalho extra?
fonte
add_settings_section
eadd_settings_field
, essas duas funções adicionam inchaço ao seu código mais do que tudo, evitam-no e evitam o inchaço.Respostas:
Meu ponto de vista é que o principal objetivo e benefício da API de configurações é a estrutura .
Ajuda a manter configurações complexas:
Como em qualquer sobrecarga estrutural, beneficia casos de uso mais complexos e beneficia casos menos simples.
Assim, você pode implementar tudo o que a API de configurações faz sem usá-lo. A questão é se você pode fazer isso da maneira mais confiável, segura e extensível possível.
fonte
Se você usar retornos de chamada corretamente, não haverá necessidade de todo o código redundante. Aqui está como eu implemento a API de configurações, de uma forma que é completamente escalável .
Vantagens (entre outras coisas):
fonte
oenology_get_settings_by_tab()
eoenology_get_default_options
sem defini-las primeiro? Eu pensei que já era ruim o suficiente em 209 linhas de código (depois de remover comentários e linhas em branco), mas uma vez definidas essas funções, será ainda mais ... Para quatro opções?oenology_get_settings_by_tab()
é realmente relevante para o que você está fazendo. Mas você tem de definir a sua forma de campo de marcação em algum lugar , assim como você tem a entrada do usuário validar / sanitize de alguma forma , por isso, se você está fazendo certo, você terá tudo o que mesmo código também.Obrigado por postar isso, eu queria saber exatamente a mesma coisa. Muitas funções.
Para reduzi-los, você pode armazenar suas opções como matrizes. Wordpress serializa os dados para você. Isso economiza código (ou funciona de qualquer maneira), mas gera dados piores. Por exemplo, se você deseja classificar, editar manualmente, exportar etc. suas tabelas, elas terão esses valores serializados. Por outro lado, seu plugin adiciona menos entradas à tabela de opções e é mais fácil de limpar.
Então, aqui está seu código refazer. Algumas notas:
<label>
para acessibilidade. Usando add_settings_error (), settings_error (), que manipula mensagens e também erros. Esse é geralmente o único motivo para ter funções de validação separadas para cada opção. Você pode ver abaixo validate_w () e validate_h () poderia ser uma função. Tentei abstrair as mensagens, mas você não recebe informações suficientes no retorno de chamada de validação, pelo que me lembro. Como em qual campo você está trabalhando.Código:
fonte