O retorno de chamada não é chamado em add_settings_field () quando passado como parte de um array, mas reconhece que está lá. É passado de classe para classe usando OOP
Estou construindo um plugin, criei uma nova página de administração e subpágina e, dentro dessa subpágina, quero adicionar algumas configurações. É por isso que os estou construindo usando a API de configurações.
Estou usando o Composer e a Programação Orientada a Objetos. Eu tenho uma pasta chamada SettingsAPI, com a seguinte namespace namespace Blocks\Pages\SettingsAPI;
Dentro dessa pasta, eu tenho três arquivos: AddSettings.php
, Settings.php
e SettingsLayout.php
. Todos os três estão conectados corretamente. Os arquivos têm os nomes das classes que diferenciam maiúsculas de minúsculas. Settings.php
tem uma classe chamada Settings
e assim por diante.

Conteúdo
- Algum contexto para minha estrutura
- O que eu já experimentei
- O que fazer?
Algum contexto para minha estrutura
Dentro Settings.php
, tenho uma função que contém uma variedade de matrizes, dentro dessas matrizes estão os valores que desejo usar para a API de configurações. Isso significa que tenho matrizes que são usadas para register_setting()
, add_settings_section()
e add_settings_field()
.
Dentro AddSettings.php
, tenho as três funções que acabamos de mencionar. Ambos register_settings()
e add_settings_field()
funcionam muito bem. Eu tenho problemas com add_settings_field()
.
Por dentro SettingsLayout.php
tenho um layout bem simples para onde o formulário deve ser impresso, que também é mostrado na Subpágina. Faltam apenas as entradas.
Dentro AddSettings.php
, usei um foreach()
para fazer um loop sobre o array, se necessário. Que é usado para register_setting()
e add_settings_field()
, porque os dois arrays têm arrays dentro deles. Vou mostrar alguns códigos usados para register_setting()
e o foreach()
.
Settings.php
$configs = [ [ // Icon "option_group" => "iw_" . $n,
"option_name" => "iw_icon_" . $n, "args" => $iconConfigs
],
[ // Titel
"option_group" => "iw_" . $n, "option_name" => "iw_title_" . $n,
"args" => $titleConfigs ], [ // Beschreibung "option_group" => "iw_" . $n,
"option_name" => "iw_description_" . $n, "args" => $descriptionConfigs
],
[ // Farbauswahl
"option_group" => "iw_" . $n, "option_name" => "iw_colour_" . $n,
"args" => $colourConfigs
]
];
O array acima está sendo passado, junto com os outros arrays, para a AddSettings
Classe e a próxima função que os processará.
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
setForm()
faz o seguinte com os argumentos.
AddSettings.php
public function setForm( array $configs, array $segments, array $inputs ) {
$this->settings = $configs;
$this->sections = $segments;
$this->fields = $inputs;
return $this;
}
As variáveis $settings
, $sections
e $fields
foram criados no início da classe como matrizes públicas e vazias.
public $settings = array(); public $sections = array();
public $fields = array();
Que então é registrado com a seguinte função:
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
registerForm()
manter todas as funções de API de configurações do WP, aqui está register_setting()
.
foreach( $this->settings as $setting ) { register_setting( $setting["option_group"], $setting["option_name"], isset( $setting["args"] ) ? $setting["args"] : "" );
}
Esta parte funciona muito bem. Também funciona com add_settings_section()
. O que não funciona são as entradas. Que apresentarei agora também:
Settings.php
Dentro desta classe está a função / método setForm( $n = NULL )
, é onde estão todos os arrays, como o que mostrei acima. No momento $n
não tem significado, mas será um número, então posso fazer um loop em todos os arrays e configurações para criar mais formulários. Se eu mantenho em NULL
ou mudo para 1
, não tem efeito no resultado final, a mesma coisa.
Aqui está a matriz dos campos.
$inputs = [
[
"id" => "iw_icon_" . $n, "title" => "Icon Auswahl", "callback" => function() use($n) { return $this->iconInput( $n ); },
"page" => "info_kreis_bearbeiten",
"section" => "iw_item_" . $n, "args" => [ "label_for" => "iw_icon_" . $n ]
],
[
"id" => "iw_title_" . $n, "title" => "Titel", "callback" => function() use($n) { return $this->titleInput( $n ); },
"page" => "info_kreis_bearbeiten",
"section" => "iw_item_" . $n, "args" => [ "label_for" => "iw_title_" . $n ]
],
[
"id" => "iw_description_" . $n, "title" => "Kurz Beschreibung", "callback" => function() use($n) { return $this->descriptionInput( $n ); },
"page" => "info_kreis_bearbeiten",
"section" => "iw_item_" . $n, "args" => [ "label_for" => "iw_description_" . $n
],
[
"id" => "iw_colour_" . $n, "title" => "Farbe auswählen", "callback" => function() use($n) { return $this->colourInput( $n ); },
"page" => "info_kreis_bearbeiten",
"section" => "iw_item_" . $n, "args" => [ "label_for" => "iw_colour_" . $n ]
]
];
Portanto, este é um array com três arrays dentro dele. Este array tem callbacks, e são os callbacks que não funcionam. Não importa onde eu os coloque ou como os escreva, eles não estão sendo ecoados. No final, listarei todas as coisas que tentei.
Assim como os arrays de configurações, eles também são processados assim:
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
AddSettings.php
E depois
public function setForm( array $configs, array $segments, array $inputs ) { $this->settings = $configs; $this->sections = $segments; $this->fields = $inputs; return $this;
}
e
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
Que então é passado registerForm()
com a seguinte função:
foreach( $this->fields as $field) {
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"] : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
}
E então nada. Nenhuma entrada na minha subpágina. Tudo, exceto os campos, está sendo ecoado.

Como você pode ver, o callback usado pela seção funciona e me mostra o título e a descrição. Mas as entradas estão faltando. Para mostrar algum contexto sobre como chamei o retorno de chamada para as seções, aqui está a única linha com o retorno de chamada da matriz de seção, dentro de
Settings.php
:
"callback" => function() use($n) { echo "<p>Bearbeite hier die Info Nummer " . $n . "</p>"; }
E a função add_settings_section()
interna AddSettings.php
, não foreach()
foi usada para este:
add_settings_section( $sections["id"], $sections["title"], isset( $sections["callback"] ) ? $sections["callback"] : "", $sections["page"] );
Ele está sendo chamado da mesma forma que os campos. Mas os campos ainda não ecoam nada. Antes de alguém dizer que estou ecoando dentro da função de retorno de chamada anônima, em vez de retornar outra função:
O que eu já experimentei
Eu tentei algumas coisas. Uma das primeiras coisas que tentei foi editar a maneira como o retorno de chamada é escrito. Portanto, em vez de uma função que retorna outra função, escrevi algo simples.
"callback" => function() { echo "Echo this please."; },
Não funcionou.
"callback" => array( $this, "iconInput" ),
Também não estou funcionando, eu também tentei
"callback" => $this->iconInput( $n ),
Que então chamou a função e ecoou as entradas, mas não na posição certa. Eles estavam no topo da página. E se eu fizer um loop de tudo, todas as entradas estarão no topo, com as seções abaixo na ordem de impressão correta. Portanto, essa também não é a solução.
O que eu também tentei foi mover o callback para AddSettings.php
e chamá-lo assim.
add_settings_field( $field["id"], $field["title"], function() { return $this->iconInput(); }, $field["page"], $field["section"] = 'default', $field["args"] = array() );
Também não funcionou. Quando tentei escrever diretamente a função lá, assim
add_settings_field( $field["id"], $field["title"], function() { echo "Please echo this"; }, $field["page"], $field["section"] = 'default', $field["args"] = array() );
Também não funcionou. Eu também sempre coloco die;
no final, só para ver se está sendo chamado de alguma forma, e não foi. É como se a função não existisse.
Também tentei executar imediatamente a função adicionando ()
a ela:
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"]() : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
O mesmo resultado de antes. Ele ecoou as entradas, mas não na posição certa.
Tentei procurar uma resposta, mas não consegui encontrar uma que fosse semelhante à minha. Encontrei essas questões e soluções, tentei-as e também não funcionou: Como passar argumentos de add_settings_field () para a função de retorno de chamada? e Add_settings_field () parametrizando callback?
E para esclarecimento, minha SettingsLayout.php
construção é assim:
<form method="post" action="options.php" id="iw_form_<?php echo $i?>">
<?php
settings_fields( "iw_" . $i ); do_settings_sections( "info_kreis_bearbeiten" ); submit_button( $text = NULL, $type = "primary", $name = "submit_" . $i );
?>
</form>
$i
é o mesmo que $n
.
O que fazer?
Fiquei sem opções para tentar. Pelo menos das opções que conheço. Se alguém tiver algum tipo de solução, eu ficaria FELIZ em ouvi-los. Eu também me expliquei da melhor maneira que pude.
Editar
O que esqueci de mencionar, dentro do meu foreach()
também ecoa field["id"]
para ver se funciona, e ecoa o ID correto.
Respostas
Pelo que pude ver, o problema não é com o retorno de chamada do campo, mas é o ID da seção em que você está configurando default
- veja $field["section"] = 'default'
abaixo:
// In the foreach in AddSettings.php
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"] : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
Portanto, você só teria que corrigir isso (erro de digitação?) E os campos apareceriam conforme o esperado ou o retorno de chamada do campo seria executado corretamente. E você também deve corrigir o $field["args"] = array()
..