对WordPress的AJAX递归调用返回函数作用域以外的应答

时间:2018-03-14 作者:Victor Bini

我在使用ajax函数时遇到了一个问题:

window.setInterval(liveDrop, 2000);
这会每隔2秒触发我的ajax调用,并检查是否需要更新站点中的某些内容。

这个函数运行得很好,但是当我打开类似的东西时functions.php(不仅如此,而且作为示例)

 echo \'TEST\';
我的ajax请求已运行window.setInterval 开始打印此“测试”,然后echo teste 实际上超出了ajax请求中“action:my\\u function”的函数范围。

我的问题是,我在ajax调用中接收到外部命令。

其他信息:-我正在使用wp_die(), wp_send_json_success.. etc-我在正确的挂钩中注册了我的函数(如果没有echo \'test\' 或任何admin_init_hook)

有人见过这种情况吗?

更新时间:

我的ajax代码:

function liveDrop(){
    last_drop = parseInt($(\'.item-drop-area\').first().data(\'id\'));

    $.ajax({
        url: ajax_request.ajax_url,
        type: \'GET\',
        data: {
            \'action\': \'live_drop\',
            \'last_item\': last_drop
        },
    })
    .done(function(response) {


        if( typeof response.data.has_new_live_drop != \'undefined\' && response.data.has_new_live_drop === true ){
            $(\'.dropped-area\').prepend(response.data.item_droped);
            $(\'.drop-item-inserted\').show(\'slow\');

            last_drop += 1;

            $(\'.item-drop-area\').last().remove();

        }



    });
}

window.setInterval(liveDrop, 2000);
我的php函数:

public function __construct( ){

        add_action(\'wp_ajax_live_drop\', array($this, \'live_drop\'));
        add_action(\'wp_ajax_nopriv_live_drop\', array($this,\'live_drop\'));

    }


    public function live_drop(){

        global $wpdb;

        $table_name = $wpdb->prefix . \'sorted_items\';

        $next_item = intval($_GET[\'last_item\']) + 1;

        $new_items_check = $wpdb->get_results("SELECT id,user_id, item_id, crate_id FROM $table_name WHERE id = $next_item AND TIME_TO_SEC(TIMEDIFF(current_timestamp, date)) > 15 LIMIT 1");

        if(!empty($new_items_check)){

            $html = \'\';

            foreach ($new_items_check as $item) { 

                $crate_img    = get_the_post_thumbnail_url( $item->crate_id , \'medium\' );
                $item_img     = get_the_post_thumbnail( $item->item_id, \'live-drop\', [\'class\' => \'item-image-livedrop\'] );
                $item_name    = get_the_title( $item->item_id );
                $user_avatar  = get_user_meta( $item->user_id, \'steam_avatar\', true );
                $username     = get_user_meta( $item->user_id, \'steam_personaname\', true);
                $steam_id     = get_user_meta( $item->user_id, \'steam_steamid\', true);
                $profile_link = home_url() . \'/member/\' . $steam_id;

                $html .= \'<div class="item-drop-area drop-item-inserted"  data-id="\' .  $item->id .  \'">\';
                $html .= \'<div class="item-live-droped">\';
                $html .= \'<a class="see-user-profile" href="\' .  $profile_link . \'">\';
                $html .= \'<img class="crate-image-livedrop" src="\' . $crate_img . \'" />\';
                $html .= $item_img;
                $html .= \'<img class="user-avatar-livedrop" src="\' . $user_avatar . \'"/>\';
                $html .= \'<p class="drop-item-name">\' . $item_name . \'</p>\';
                $html .= \'<div class="item-live-dropped-hover">\';
                $html .= \'<p class="user-live-drop">\' .   $username . \'</p>\';
                $html .= \'</div>\';
                $html .= \'</a>\';
                $html .= \'</div>\';
                $html .= \'</div>\';


            }


            $data = array(
                \'has_new_live_drop\' => true,
                \'item_droped\'       => $html
            );

            wp_send_json_success( $data, 200 );

        }

        wp_send_json_error( false, 200 );

    }
这段代码工作得很好,但如果我对函数进行了“echo teste”。php,这段代码会出现在这个ajax请求的响应上,这就是问题所在,每隔2秒他不会显示函数的答案,他会显示函数外部的信息,就像一条echo语句。

1 个回复
SO网友:Jacob Peattie

插件和主题会加载到每个请求中,包括AJAX,所以其中的任何代码都会被解析。它们必须能够找到并执行任何AJAX挂钩。

不过,大多数代码都没有执行,因为它位于与AJAX请求期间未执行的挂钩挂钩的函数中。不过,有些是这样。如果您正在筛选pre_get_posts() 在主题或插件中,您可能希望在AJAX请求中的任何查询期间运行该过滤器。因此,插件和主题需要全部加载才能做到这一点。

但是,如果您在主题的函数文件中的函数之外运行代码,那么将在加载主题后立即执行,因此它将在前端和AJAX请求中输出。但问题是:您不应该在函数中编写代码。不在函数中的php。只是加载函数。php不应导致任何输出。

结束

相关推荐

使用加载了AJAX的ACF表单初始化JS

我正在使用acf\\U表单用ajax编辑我的WP帖子。我已经做好了设置,工作正常,我可以编辑帖子并提交新数据,而无需刷新页面。成功完成后,我还可以加载新内容,而无需刷新页面。但是,acf表单中的任何JS在重新加载后都无法工作。我怎样才能让它工作呢,这是我目前所拥有的(function($) { //// This saves without reloading the page var pathtopage = window.location.pathname;