如何处理插件选项页面中的多个提交按钮?

时间:2013-05-11 作者:Diego

我正在为WordPress开发我的第一个插件,我正在掌握整个挂钩系统。我现在被困在一个(可能)小问题上,我可能会绕过这个问题,但我害怕出现一个“黑客”,而不是一个真正的解决方案。

我要做的是在我的选项页面上放置两个提交按钮:

保存草稿他们都必须做一些共同的事情(即保存表单的内容),但是他们应该对这些内容采取不同的操作。到目前为止,我使用以下代码成功地输出了两个按钮:

echo \'<form id="my_plugin_settings_form" method="post" action="options.php">\';
settings_fields(\'my_plugin_settings\');
do_settings_sections(\'my_plugin_settings\');
submit_button(__(\'Save\', \'MyPlugin\'), \'Save\');
submit_button(__(\'Draft\', \'MyPlugin\'), \'secondary\',\'Draft\');
echo \'</form>\';
我还实现了一个validate方法,它可以正确地接收发布的字段:

public function validate_settings($settings) {
  var_dump($settings); // Here I can see all posted fields
}
以上操作很好,所有数据都正确保存在WordPress选项表中。但是,我想“截取”正在保存的数据以对其进行操作。我想在validate_settings() 方法,但单击的按钮为not 包含在作为参数传递的设置中。

我可以简单地分析$_POST 数组来获取它,但我怀疑这种方法有点像黑客,也许我应该在其他地方实现一个合适的钩子。

因此,我的问题是:我应该把代码放在哪里来处理从选项页面发布的数据?是否有我应该使用的特定挂钩?

提前感谢您的回答。

1 个回复
最合适的回答,由SO网友:Ralf912 整理而成

设置API是垃圾。我需要很长一段时间,需要尝试很多次,直到我的工作。我的问题是,我输入的值从未传递给validate回调。

我最终使用了array方法:

<input type="text" name="foo[bar]" value="baz" />
如果要发送公式,请在$_POST$_GET 数组是一个名为foo 包含具有所有值的数组的。因此,我可以访问值,例如。$_POST[\'foo\'][\'bar\']

如果必须使用设置API,则使用第二个参数fomrregister_setting() (选项名称)作为我的输入字段的键。

global $option_name;
$option_group = \'The_Option_Group\';
$option_name = \'The_Option_Name\';
register_setting( $option_group, $option_name );
[...]

function field_callback() {
  global $option_name;
  echo "<input type=\'text\' name=\'{$option_name}[bar]\' value=\'baz\' />";
  echo "<input type=\'submit\' name=\'{$option_name}[submit]\' value=\'Send\' />"
}
通过这种方式,我可以访问选项validate回调中公式中的所有值。

function option_validate( $input ) {
  $bar = $input[\'bar\'];
  $sub = $input[\'submit\'];

  return $input;
}
这篇文章解释得更好Settings API Explained 压码机上

结束

相关推荐

Plugin options autoloading

在《专业WordPress开发》一书中,我发现了以下技巧:根据经验,如果博客的公共部分需要您的选项,请使用自动加载保存它们。如果只在管理区域需要它们,请保存它们而不自动加载如果所有插件开发人员都遵循这个建议,那么这不会导致后端出现许多额外的SQL查询,从而降低管理方面的速度吗?使用插件选项自动加载的好例子是什么?