如何使用AJAX onClick刷新仅限会员的WordPress页面内的div来访问定制数据库内容?

时间:2018-09-16 作者:Corpuscular

该用例在一个受登录保护的页面上为用户提供20个不同的按钮,每个按钮都是自定义数据库表中的一个类别,内容显示在按钮onClick事件的textarea元素中。它就像页面上的随机引号按钮,刷新div而不重新加载页面。有点像Hello Dolly插件,带有AJAX按钮。

我编写了一个基本的PHP脚本(main.PHP),它使用对单独PHP页面(getData.PHP)的ajax调用从MySQL数据库中获取一个随机行。数据库凭据在getData页中进行硬编码。这工作正常。

现在,我想把这个功能放在WordPress网站上的仅限成员访问的页面中。然而,我发现很难知道这方面的最佳实践方法是什么。我已经阅读了许多解决这个问题的不同方法,包括构建自己的插件、在函数中加入数据库凭据和SQL。我的主题的php文件(显然是个坏主意)、短代码等。我很困惑。

我想使用WordPress框架,对enqueing和nonce几乎一无所知。并且不知道如何从wp\\uuDatabase中的自定义表中获取数据(如果可以的话)。

我想我已经将问题分解为以下步骤/问题:

1: 如何使用WordPress framework访问自定义数据库表行内容

2: 如何在WordPress中向受保护页面上的按钮添加javascript/AJAX功能

3: 如何通过AJAX刷新受保护页面上的div/元素

4: 将连接1、2和3的PHP函数放在何处

5: 我如何确保一个糟糕的演员不能直接访问这些功能,敲打我的数据库,窃取我的内容

我计划使用WP Members插件来限制对页面的访问,并使用Understrap主题。

如果我能提供更多信息,请告诉我。非常感谢您的帮助。

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

我会使用默认值WP AJAX API 因此,WP可以为您处理所有身份验证。

您需要添加一个函数和一个操作来触发它:

function wpse_314311_get_quote() {
    // get quote from db
    // print json to client
    exit;
}
add_action( \'wp_ajax_get_quote\', \'wpse_314311_get_quote\' );
这样,WP将确保只允许登录用户访问API。如果您还想允许匿名用户,您可以添加

add_action( \'wp_ajax_nopriv_get_quote\', \'wpse_314311_get_quote\' );
在服务器端,您将使用WPDB 要访问WP数据库中的自定义表,请执行以下操作:

global $wpdb;
if($quote = $wpdb->get_row("SELECT * FROM my_quotes_table ORDER BY RAND() LIMIT 0, 1")) {
    print $quote->quote_body . " by " . $quote->quote_author;
}
这可能看起来像

function wpse_314311_get_quote() {
    global $wpdb;
    if($quote = $wpdb->get_row("SELECT * FROM my_quotes_table ORDER BY RAND() LIMIT 0, 1")) {
        print json_encode(array("success" => true, "message" => $quote->quote_body));
    }
    else {
        print json_encode(array("success" => false, "message" => "no quote found"));
    }
    // print json to client
    exit;
}
add_action( \'wp_ajax_get_quote\', \'wpse_314311_get_quote\' );
在前端,您可以通过向API传递action=get\\u quote来访问它(通常为/wp admin/admin-ajax.php,但您可能希望将其放入变量中wp_localize_script):

jQuery(document).ready(function($) {
    $("#myButton").click( function() {
        jQuery.post("/wp-admin/admin-ajax.php", { "action": "get_quote"}, function(response) {
            console.log(response);
            $("#myDiv").text(response.message);
        });
    }
});
将其放入脚本中(在本例中,我假设在您的主题中js 名为的文件中的文件夹quote-refresh.js 并使WP加载wp_enqueue_script. 确保让WP知道您的脚本需要加载jQuery,例如:。

wp_enqueue_script( "quote-refresh", get_template_directory_uri() . "/js/quote-refresh.js", array("jquery") );
你可以把一切都放在你的主题功能中。php假设您使用的是子主题,而不是直接下陷阱(如果您想要自定义主题中的任何内容,并且仍然能够更新原始主题,则应该这样做),或者create a very simple plugin 将其添加到WP。

至于控制访问:这取决于你的偏执狂。保护未经授权的访问很容易,WP将确保请求来自登录用户。确保那些用户不使用自动化来吸取数据库中的所有内容要困难得多——你必须决定哪种行为模式是无聊的人每隔几秒钟点击“刷新”来阅读其他内容,哪种是只想要内容的机器人。

请原谅代码中的拼写错误和bug,我现在没有任何方法来运行它。

结束

相关推荐

使用AJAX的WordPress自定义登录表单

Description:我想创建一个自定义登录表单:用户名、密码和记住字段。这是我的代码:Problem: /wp-admin/admin-ajax.php 503 ()What I\'ve tried:PHP:function normal_login() { if( !isset( $_POST ) ) { return ; } $username = $_POST[ \'username\' ]; $