有关访问我的插件中的脚本的基本问题

时间:2022-01-20 作者:agileMike

。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

return message

关于如何让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=

2 个回复
最合适的回答,由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(),
    ]);
});

SO网友:WebElaine

欢迎使用WordPress和WPSE!

插件旨在改变或添加WordPress Core已经提供的功能。它们不能直接访问。例如,一个插件可能会在你网站上的最新帖子的末尾添加链接。

听起来,对你来说,最好的方法是了解更多WordPress的工作原理。这个Plugin Handbook 将在插件方面特别帮助您。Learn WordPress 是学习基本知识的绝佳场所。一旦你有了更坚实的基础,Developer Resources 应提供有关WordPress功能、编辑器、主题等的其他信息。

作为快速概述,WordPress Core创建了两种主要的帖子类型:帖子和页面。帖子经常更改或添加内容,如新闻文章。有内置的类别,您可以对相关类型的帖子进行分组,还有标签,您可以对相关内容进行较小的分组。页面更多的是静态资源——说说你的页面。它们本机不包含类别,但它们是分层的,这意味着一个页面可以是另一个页面的父页面,因此您的“关于”页面可以有一个子页面历史记录,另一个子页面联系我们。

插件通常会将元字段添加到这些现有的帖子类型中,或者创建新的帖子类型,比如公文包、工作或其他各种东西。插件还可以将功能添加到;“后端”这个/wp-admin/ 例如,Google Analytics插件既可以将跟踪代码添加到前端,也可以添加一个仪表板小部件,向登录的用户显示其中的一些统计信息。但所有这些插件数据都是在本地输出的,即wp-admin, 或在岗位内。当您尝试访问浏览器中的插件URL时,它不会直接输出。