Wordpress jQuery ajax GET 请求到 php 函数,该函数在每个 php 任务完成时逐步发回多个响应

Posted

技术标签:

【中文标题】Wordpress jQuery ajax GET 请求到 php 函数,该函数在每个 php 任务完成时逐步发回多个响应【英文标题】:Wordpress jQuery ajax GET request to php function which sends back multiple responses progressively as each php task is completed 【发布时间】:2021-12-25 06:08:54 【问题描述】:

我正在寻找术语或相关问题的链接,以了解我在这里想要实现的目标......

我一直在 wordpress 中使用 jquery ajax,但是是否可以在运行 php 函数的中途将数据发送回我的 jquery ajax 函数?

我的目标是创建一个前端进度条,显示正在运行的 ajax php 函数任务的状态。

所以我尝试在每个完成的后循环输出中的 ajax 触发 php 函数中使用 wp_send_json_success()...但似乎 wp_send_json_success() 返回而不是继续。所以 js ajax 成功响应只会返回第一个发送的 wp 成功响应数据...

$.ajax(
    cache: false,
    timeout: 300000, // 5 hours
    url: admin_ajax_url,
    type: 'GET',
    data: 
        action : 'test',
    ,
    success: function (response) 

        console.log(response);

    
);
<?php

class Test 

    public function __construct() 

        add_action('wp_ajax_nopriv_test', [$this, 'ajax_test'], 20);
        add_action('wp_ajax_test', [$this, 'ajax_test'], 20);

    

    public function ajax_test() 

        $args = [
            'post_type'         => 'product',
            'post_status'       => 'publish',
            'posts_per_page'    => -1,
            'order'             => 'ASC',
            'orderby'           => 'ID',
        ];

        $products = new WP_Query($args);

        if($products->have_posts()) :

            while($products->have_posts()): $products->the_post();

                global $post;

                // i want to send data back to my js ajax every time this is hit
                // but wp_send_json_success returns first time it is hit (see my console.log below...) 
                wp_send_json_success([
                    $post->ID => true
                ]);

            endwhile;

        endif;

        die();

    



new Test();

上述代码的 JS 控制台日志响应...

wp_send_json_success() 返回(不继续)并且响应在第一次在 php 函数中被命中时退出。

是否可以将多个间歇性数据响应发送回我的 jquery ajax 函数,直到 php 函数完成 (.done)?

任何指向问题或术语的链接,供我研究解决方案...(如果可以使用 jquery ajax)...将不胜感激,谢谢!

如果不可能,还有什么替代方案?...为每个要执行的任务发送一个新的 ajax 请求?...这听起来很沉重、不可靠和不合逻辑。

提前感谢您的任何建议!

【问题讨论】:

【参考方案1】:

我不认为您可以发送单个请求并接收多个响应,就像您在流式传输数据时那样。请参阅此线程,jQuery read AJAX stream incrementally?。

对于您的用例,我认为最好在单个请求中接收所有发布信息,因为这样可以避免信息在不同时间输出到 DOM,这可能会显得有点笨拙。

我会将 wp_send_json_success() 函数移到 post 循环之外,这样您就可以在一个响应中从查询中获取所有信息。

public function ajax_test() 

    $args = [
        'post_type'         => 'product',
        'post_status'       => 'publish',
        'posts_per_page'    => -1,
        'order'             => 'ASC',
        'orderby'           => 'ID',
    ];

    $products = new WP_Query($args);

    if($products->have_posts()) :

        //Variable to store all the results from the query
        $response_data = [];

        while($products->have_posts()): $products->the_post();

            global $post;

            $response_data[] = [ $post->ID => true ];

        endwhile;

    endif;

    //Send response back to front end
    wp_send_json_reponse($reponse_data);      

    die();


您可以通过包含所需数量的帖子作为帖子数据来更改输出的帖子数量,如下所示;

$.ajax(
cache: false,
timeout: 300000, // 5 hours
url: admin_ajax_url,
type: 'GET',
data: 
    action : 'test',
    posts_per_page : 3 //Maximum number of posts that can be returned 
,
success: function (response) 

    console.log(response);


);

然后在 $args 数组中实现该数据;

'posts_per_page'    => $_POST['posts_per_page'],

【讨论】:

感谢您的回答和时间,但我想问是否可以多次将 php 响应发送回我的 jquery ajax 函数。所以我可以计算一个进度条来显示正在运行的名为 php.ini 的 ajax 的进度状态。如果我在循环之后运行wp_send_json_reponse(),那么当ajax_test 完成时,进度数据将显示为 100%...这意味着我的进度条将从 0% 开始并在一次点击中以 100% 结束(无论多长时间 php需要运行)。我想在每个循环的 php 帖子之后发回 ajax 响应,所以我可以通过进度条以 % 显示进度。 我更新了我的问题标题,因为它可能含糊不清,但我认为我的问题很清楚,如果我的问题没有意义,请告诉我。 是的,我不认为这是可能的。我认为单个请求会收到单个响应。我认为您希望通过套接字传输数据,而通过 AJAX (***.com/questions/7740646/…) 是不可能的。我认为这个线程可能是您正在寻找的,***.com/questions/6475238/…。 最后一个链接是我正在寻找的非常感谢您的帮助

以上是关于Wordpress jQuery ajax GET 请求到 php 函数,该函数在每个 php 任务完成时逐步发回多个响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在 wordpress 中通过 jQuery/Ajax 上传图片

jsonp、json、jquery、ajax 和 wordpress 刷新页面! :S

JavaScript 使用jQuery的WordPress AJAX分页

如何使用 JQuery.ajax 从每个 WordPress 帖子中获取缩略图附件?

ajax在WordPress中加载页面后如何触发jquery插件?

JavaScript 使用ajax / jquery解析wordpress RSS feed