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

Nov 26 2020

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.phpe 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.phptem uma classe chamada Settingse 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.phptenho 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 AddSettingsClasse 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, $sectionse $fieldsforam 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 $nnã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 NULLou 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.phpe 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.phpconstruçã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

1 SallyCJ Nov 26 2020 at 10:39

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()..