我正在构建一个插件,我创建了一个新的管理页面和子页面,在这个子页面中,我想添加一些设置。这就是我使用设置API构建它们的原因
我正在使用Composer和面向对象编程。我有一个名为SettingsAPI的文件夹,名称空间如下namespace Blocks\\Pages\\SettingsAPI;
在该文件夹中,我有三个文件:AddSettings.php
, Settings.php
和SettingsLayout.php
. 它们三个都正确连接。这些文件具有区分大小写的类名称。Settings.php
有一个名为Settings
, 等等
Content
我的结构内部的一些上下文Settings.php
我有一个保存各种数组的函数,这些数组中有我想用于设置API的值。这意味着我有用于register_setting()
, add_settings_section()
和add_settings_field()
.
内部AddSettings.php
我有刚才提到的三个功能。二者都register_settings()
和add_settings_field()
工作很好。我对add_settings_field()
.
内部SettingsLayout.php
我有一个非常简单的表单打印位置布局,也显示在子页面上。只是缺少输入。
在…内AddSettings.php
我用了一个foreach()
如果需要的话,在阵列上循环。用于两者register_setting()
和add_settings_field()
, 这是因为这两个数组中都有数组。我将显示一些用于register_setting()
以及foreach()
.
设置。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
]
];
上面的数组与其他数组一起传递给
AddSettings
类和将处理它们的下一个函数。
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
setForm()
对参数执行以下操作。
添加设置。php
public function setForm( array $configs, array $segments, array $inputs ) {
$this->settings = $configs;
$this->sections = $segments;
$this->fields = $inputs;
return $this;
}
变量
$settings
,
$sections
和
$fields
已在类的开头创建为公共数组和空数组。
public $settings = array();
public $sections = array();
public $fields = array();
然后使用以下函数注册:
一
三八 保存WP中的所有设置API函数,以下是
register_setting()
.
foreach( $this->settings as $setting ) {
register_setting( $setting["option_group"], $setting["option_name"], isset( $setting["args"] ) ? $setting["args"] : "" );
}
这部分效果很好。它还适用于
add_settings_section()
. 输入不起作用。我现在也将介绍:
设置。这个类中的php是函数/方法setForm( $n = NULL )
, 这就是所有数组的位置,就像我上面展示的那个。马上$n
没有意义,但它将是一个数字,所以我可以在这些数组和设置上循环以创建更多表单。我是否保持在NULL
或者我把它改成1
, 对最终结果没有影响,同样的事情
这是字段的数组。
$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 ]
]
];
这是一个包含三个数组的数组。这个数组有回调,而回调根本不起作用。无论我把它们放在哪里或如何写,它们都不会被回音。在底部,我会列出我尝试过的所有东西
与设置数组一样,它们的处理方式如下:
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
添加设置。php,然后
public function setForm( array $configs, array $segments, array $inputs ) {
$this->settings = $configs;
$this->sections = $segments;
$this->fields = $inputs;
return $this;
}
和
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
然后传递给
registerForm()
具有以下功能:
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() );
}
然后什么都没有。我的子页面上没有输入。所有的一切都在回声中。
如您所见,该部分使用的回调有效,并向我显示标题和描述。但缺少输入。为了展示如何调用节回调的上下文,下面是一行,其中包含节数组中的回调
Settings.php
:
"callback" => function() use($n) { echo "<p>Bearbeite hier die Info Nummer " . $n . "</p>"; }
以及功能
add_settings_section()
在…内
AddSettings.php
, 不
foreach()
用于此项:
add_settings_section( $sections["id"], $sections["title"], isset( $sections["callback"] ) ? $sections["callback"] : "", $sections["page"] );
它的命名方式与fields相同。但这些领域仍然没有任何回应。在任何人说我在匿名回调函数中回音,而不是返回另一个函数之前:
我已经尝试了一些事情。我首先尝试的事情之一是编辑回调的编写方式。因此,我写了一些简单的东西来代替返回另一个函数的函数。
"callback" => function() { echo "Echo this please."; },
不起作用。
"callback" => array( $this, "iconInput" ),
也不起作用我也试过了
"callback" => $this->iconInput( $n ),
然后调用函数并回显输入,但不在正确的位置。他们在页面的最顶端。如果我循环所有内容,所有输入都将位于顶部,下面的部分按正确的打印顺序。所以这也不是解决方案
我还尝试将回调移动到
AddSettings.php
这样称呼它。
add_settings_field( $field["id"], $field["title"], function() { return $this->iconInput(); }, $field["page"], $field["section"] = \'default\', $field["args"] = array() );
也没用。当我试图直接在那里写函数时,就像这样
add_settings_field( $field["id"], $field["title"], function() { echo "Please echo this"; }, $field["page"], $field["section"] = \'default\', $field["args"] = array() );
也没用。我也总是
die;
最后,只是想看看它是否被调用,但它没有被调用。这就像函数不存在一样
我还尝试通过添加
()
收件人:
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"]() : "", $field["page"], $field["section"] = \'default\', $field["args"] = array() );
与之前的结果相同。它回显输入,但不在正确的位置。
我试着寻找一个答案,但实际上找不到一个与我相似的答案。我找到了这些问题和解决方案,尝试了一下,但也没有成功:How to pass arguments from add_settings_field() to the callback function?和Add_settings_field() parameterizing callback?
为了澄清,我的SettingsLayout.php
是这样构建的:
<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
与相同
$n
.
怎么办
我已经没有办法尝试了。至少我知道的几种选择。如果有人有任何解决办法,我很乐意听到他们的意见。我也尽可能地解释了自己。
在我的foreach()
我也回应了field["id"]
看看这是否有效,它确实回显了正确的ID。