。Net开发人员正在尝试学习wordpress的一些基础知识。我有一个基本的问题,但我想有太多我不知道,我甚至不能得到一个相关的结果时,搜索这里或通过谷歌。
如果我创建一个插件并激活它,然后运行flush_rewrite_rules();
在我的激活码中,我应该能够将插件中页面的路径放入浏览器的地址栏中,并在插件页面中获得脚本的结果吗?
例如,假设我的插件名为my plugin。我的插件路径当然是wp-content/plugins/my-plugin
. 我创建文件wp-content/plugins/my-plugin/my-page.php
.
我的页面内容。php是:
<?php
if (!isset($returnVal))
$returnVal = new stdClass();
$returnVal->status = "success";
$returnVal->info = "seems to work";
echo json_encode($returnVal);
我是否可以通过在浏览器中输入以下内容来访问:
https://my-site/wp-content/plugins/my-plugin/my-page.php
我在问这张信用证,每次我都会得到404。
我已经为此绞尽脑汁有一段时间了,我得出的结论是,wordpress的工作方式中我缺少了一些东西。
更多详细信息:我正在使用Avada主题(v7.6.1)表单生成器。当用户单击提交按钮时,它可以选择发布到url。我需要它将表单数据发布到插件中的页面。然后我的插件页面需要将成功或错误返回到前端页面。
我想我会从底层开始,然后逐步实现这一点,所以我决定看看是否可以让我的插件返回成功/错误对象。这就是我一直坚持的。
如果我能做到这一点,那么下一步就是将url放在Avada Form Builder选项中我的插件页面上,了解用户单击submit按钮时会发生什么。我还没有到那一点,我被困在上面了。
Here\'s a post on s/o 我从大局出发。
更新:一些进展MADE@kero的评论为我指明了自定义REST端点的方向,我能够在浏览器中发出GET请求,以https://my-site.com/wp-json/my-plugin/v1/my-endpoint 它返回这个:
{"status":"success","info":"seems to work"}
现在我一直在尝试让Avada表单调用该端点。I\'v尝试了以下URL:
wp-json/my-plugin/v1/my-endpointhttps://my-site.com/wp-json/my-plugin/v1/my-endpoint两者1和;2结果如下:
{"status":"error","info":"url_failed"}
#3仅返回a-1
关于如何让Avada表单调用该端点并得到结果,有什么想法吗?
UDPATE:提供的请求详细信息:
以下是我的主插件文件中的REST端点代码:
add_action(\'rest_api_init\', function () {
register_rest_route(\'my-plugin/v1\', \'/my-page\', array(
\'methods\' => \'GET\',
\'callback\' => \'my_awesome_func\',
));
});
function my_awesome_func()
{
if (!isset($returnVal))
$returnVal = new stdClass();
$returnVal->status = "success";
$returnVal->info = "seems to work";
return $returnVal;
}
上面代码段中的方法设置为;获取(&Q);但我也尝试将其设置为;“发布”;Avada表单有一个设置,您可以选择“获取/发布”,我对它进行了双向测试。GET和POST都不适合我。
Avada表单正在发布到wp-admin/admin-ajax.php
使用以下键:值。有趣的是,它从帖子中得到一个200,但仍然返回上面提到的相同值。
action:fusion_form_submit_form_to_url
fusionAction: wp-json/my-plugin/v1/my-page
formData: email=&main_license_number=&credit_card_last_four=&fusion_privacy_store_ip_ua=false&fusion_privacy_expiration_interval=48&privacy_expiration_action=anonymize&fusion-form-nonce-1808=3d676aef78&fusion-fields-hold-private-data=
最合适的回答,由SO网友:kero 整理而成
通常,您不想直接在WordPress中访问PHP文件,因为您会丢失很多;果汁“;,这意味着所有WP功能都必须重新导入(并且可能会中断)。WP的设置方式是将所有发送到CMS的请求路由到索引。php和一些机制然后决定如何处理请求。
从你写的来看,这听起来像custom REST endpoint 可能对你有好处。
将代码扩展到以下位置应该已经显示了一些结果:
add_action(\'rest_api_init\', function () {
register_rest_route(\'my-plugin/v1\', \'/my-page\', [
\'methods\' => [\\Requests::POST],
\'callback\' => \'my_awesome_func\',
]);
});
function my_awesome_func()
{
if (!isset($returnVal))
$returnVal = new stdClass();
$returnVal->status = "success";
$returnVal->info = "seems to work";
return $returnVal;
}
(使用
short array syntax 和)已更改
\'methods\' => \'GET\',
至
\'methods\' => [\\Requests::POST],
其中引用了
Requests\' class const (我喜欢的样式-您也可以使用
\'POST\'
直接)。
很可能您想对表单数据执行某些操作,因此请更改my_awesome_func()
像这样的事情
function my_awesome_func(\\WP_REST_Request $request)
{
if ($request->get_param(\'main_license_number\') !== \'something\') {
return new WP_Error(\'Invalid license number!\');
}
return [
\'status\' => \'success\',
\'info\' => \'hello\',
];
}
现在只剩下一个问题:每个人都可以调用这个端点,他们不必通过表单。您的请求包含
fusion-form-nonce-1808
我假设这可以用来验证它确实是从表单中提交的-但看起来非常Avada/FusionForm/某些第三方插件特定-我不知道,并且不在本网站的范围内。但你应该试着联系他们,询问如何验证,大致如下:
add_action(\'rest_api_init\', function () {
register_rest_route(\'my-plugin/v1\', \'/my-page\', [
\'methods\' => [\\Requests::POST],
\'callback\' => \'my_awesome_func\',
\'permission_callback\' => function () {
return magic_validate_my_nonce_please();
},
]);
});
或使用
fancy arrow function added in PHP 7.4:
add_action(\'rest_api_init\', function () {
register_rest_route(\'my-plugin/v1\', \'/my-page\', [
\'methods\' => [\\Requests::POST],
\'callback\' => \'my_awesome_func\',
\'permission_callback\' => fn () => magic_validate_my_nonce_please(),
]);
});