管理页面上的一个按钮可用,但不能用两个

时间:2020-10-15 作者:Dominic Bender

我正在开发一个插件(用于我自己的网站)。我最近在管理页面上添加了一个按钮,可以生成一些文本,效果很好。这就是我使用的(从示例中窃取):

if (!current_user_can(\'manage_options\'))  {
  wp_die( __(\'You do not have sufficient galooph to access this page.\')    );
}

if ($_POST[\'plugin_button\'] == \'thing\' && check_admin_referer(\'thing_button_clicked\')) {
  plugin_thing_button();
}
echo \'<form action="options-general.php?page=plugin-list" method="post">\';

wp_nonce_field(\'thing_button_clicked\');
echo \'<input type="hidden" value="thing" name="plugin_button" />\';
submit_button(\'Generate new thing\');

echo \'</form>\';
这可以很好地工作,并按其应该的方式调用函数。

现在我想要第二个按钮来做一些完全无关的事情。

以下是我尝试的,基本上是从上面复制的:

if (!current_user_can(\'manage_options\'))  {
  wp_die( __(\'You do not have sufficient galooph to access this page.\')    );
}

if ($_POST[\'plugin_button\'] == \'thing\' && check_admin_referer(\'thing_button_clicked\')) {
  plugin_thing_button();
}
if ($_POST[\'plugin_button2\'] == \'thing2\' && check_admin_referer(\'thing2_button_clicked\')) {
  plugin_thing2_button();
}
echo \'<form action="options-general.php?page=plugin-list" method="post">\';

wp_nonce_field(\'thing_button_clicked\');
echo \'<input type="hidden" value="thing" name="plugin_button" />\';
submit_button(\'Generate new thing\');

wp_nonce_field(\'thing2_button_clicked\');
echo \'<input type="hidden" value="thing2" name="plugin_button2" />\';
submit_button(\'Generate new new thing\');

echo \'</form>\';
2个按钮的代码返回“;您访问的链接已过期"E;对于两个按钮,即单独工作的按钮现在也不工作。

我的错在哪里?提前感谢您!

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

我想我已经解决了这个问题,有两个问题:

您两个按钮都有一个表单,提交意味着提交整个表单,因此两个按钮都已提交。您的临时/推荐人检查似乎不完整。第二项是您出现问题的原因,尽管服务器时间问题也可能是原因之一。

如果我们检查您的nonce并仔细检查:


...

check_admin_referer(\'thing_button_clicked\')

...

wp_nonce_field(\'thing_button_clicked\');
请注意,它们只使用第一个参数,即动作。它们不指定名称。这意味着当您使用wp_nonce_field, 它也将默认_nonce, 导致<input type="hidden" name="_nonce"... 这是一个问题,当你有2个nonce。

因此,请指定第二个参数,或切换到单数nonce

SO网友:Dominic Bender

幸亏Tom J Nowell, 我找到了解决办法。问题是把两个按钮放在同一个位置。这解决了它:

echo \'<form action="options-general.php?page=plugin-list" method="post">\';
wp_nonce_field(\'thing_button_clicked\');
echo \'<input type="hidden" value="thing" name="plugin_button" />\';
submit_button(\'Generate new thing\');
echo \'</form>\';

echo \'<form action="options-general.php?page=plugin-list" method="post">\';
wp_nonce_field(\'thing2_button_clicked\');
echo \'<input type="hidden" value="thing2" name="plugin_button2" />\';
submit_button(\'Generate new new thing\');
echo \'</form>\';
(我希望这是正确的方式!再次感谢你,汤姆!)