如何在用户单击按钮时使用AJAX调用PHP函数

时间:2018-09-07 作者:ellen

我正在开发一个使用自定义模板/主题的wordpress网站,但我遇到了麻烦。我想使用Ajax在用户单击按钮时调用函数。在一个页面上,我有一个这样的按钮:

<p class=\'form-submit\'>
        <input name=\'message_read\' type=\'submit\' class=\'submit button mark-as-read\' value= \'Mark as read\' />
    </p>
我有这样一个jQuery/Ajax函数:

jQuery(document).ready(function() { 
   jQuery(".mark-as-read").click(function () {
    console.log(\'The function is hooked up\');
    jQuery.ajax({
        type: "POST",
        url: "/wp-admin/admin-ajax.php",
        data: {
            action: \'mark_message_as_read\',
        },
        success: function (output) {
           console.log(output);
        }
        });
    });
});
上述功能位于wp-content/themes/my-theme/js/wp_ajax_calls.js. 我将脚本添加到网站,如下所示:

1) 我将此添加到我的函数中。php文件:

wp_enqueue_script(  \'ajax calls\', get_template_directory_uri() .\'/js/wp_ajax_calls.js\', array(\'jquery\'), \'1.0\', true);
2)我将脚本包含在标题中。

<script type="text/javascript" src="https://mysite//wp-content/themes/twentyfifteen/js/wp_ajax_calls.js"></script>
当我按原样点击按钮时,控制台。日志语句出现。据我所知,我希望我的ajax函数调用一个php函数,该函数将允许我使用$wpdb。我在函数中有这个。php:

function mark_message_as_read() {
    global $wpdb;
    // do stuff. 
}
这就是我感到困惑的地方。我有两个主要问题:

1) I think I am supposed to have some add_action() \'s somewhere, but I don\'t know where to put them and I also don\'t know what hook I should use.

2) Additionally, I want to be able to pass data (the message id) to the php function for my db query. How do I pass an argument to that function?

我不想用这样的东西if( isset($_POST[\'message_whatever\']) ) twentyfifteen_message_whatever(); 因为我设置消息的方式。

如果需要,很乐意提供更多信息。提前感谢您的帮助!!

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

创建子主题,这样就不会弄乱现有主题的代码,因为下次更新主题时,可能会丢失所有更改(请参阅Child Themes)

以下是如何将值传递给ajax请求:

jQuery(document).ready(function() { 
   jQuery(".mark-as-read").click(function () {
    console.log(\'The function is hooked up\');
    jQuery.ajax({
        type: "POST",
        url: "/wp-admin/admin-ajax.php",
        data: {
            action: \'mark_message_as_read\',
            // add your parameters here
            message_id: $(\'.your-selector\').val()
        },
        success: function (output) {
           console.log(output);
        }
        });
    });
});
您也可以对nonce进行一些研究,为您的应用程序添加一个安全层:https://codex.wordpress.org/WordPress_Nonces

最后,处理请求的PHP代码(这里也应该处理实际代码中的nonce):

// register the ajax action for authenticated users
add_action(\'wp_ajax_mark_message_as_read\', \'mark_message_as_read\');

// register the ajax action for unauthenticated users
add_action(\'wp_ajax_nopriv_mark_message_as_read\', \'mark_message_as_read\');

// handle the ajax request
function mark_message_as_read() {
    $message_id = $_REQUEST[\'message_id\'];

    // add your logic here...

    // in the end, returns success json data
    wp_send_json_success([/* some data here */]);

    // or, on error, return error json data
    wp_send_json_error([/* some data here */]);
}

结束

相关推荐

他们有什么办法来扩展WPDB类并覆盖默认的查询函数吗

我试图通过扩展wpdb类并覆盖自定义查询函数来获取带有回溯的查询数据。如果我创建db的符号链接,代码运行良好。php,但如果我尝试在插件文件中执行它,则无法直接工作。代码为:<?php if ( ! defined( \'SAVEQUERIES\' ) ) { define( \'SAVEQUERIES\', true ); } class My_DB extends wpdb { function __construct( $db