WordPress admin-ajax.php 400事件票证插件生成错误。。。数据库相关?

WordPress admin-ajax.php 400事件票证插件生成错误。。。数据库相关?,ajax,wordpress,Ajax,Wordpress,我有一个WordPress网站,用于客户端,它使用自定义主题和大量插件组合创建事件日历,登录用户可以在其中购买付费事件的门票,并注册免费RSVP所需事件。为了实现这一点,我将结合使用以下六个插件: 活动日历 活动日历专业版 活动门票 活动门票加 吴哥商业 WooCommerce条带网关 该网站成立于2015年。在过去的4年中,这些插件得到了广泛的更新,因此,在某一点上,我围绕这些插件构建的自定义站点开始遇到弃用问题,尝试升级导致性能失败。咨询支持人员后,有必要将站点的副本拉到开发服务器上,以

我有一个WordPress网站,用于客户端,它使用自定义主题和大量插件组合创建事件日历,登录用户可以在其中购买付费事件的门票,并注册免费RSVP所需事件。为了实现这一点,我将结合使用以下六个插件:

  • 活动日历
  • 活动日历专业版
  • 活动门票
  • 活动门票加
  • 吴哥商业
  • WooCommerce条带网关
该网站成立于2015年。在过去的4年中,这些插件得到了广泛的更新,因此,在某一点上,我围绕这些插件构建的自定义站点开始遇到弃用问题,尝试升级导致性能失败。咨询支持人员后,有必要将站点的副本拉到开发服务器上,以便我可以升级安装,以便所有这些插件的最新版本都可以正常运行和工作

升级工作进展顺利,直到我注意到其中一个插件似乎在Chrome的控制台中生成以下错误:

POST https://pcapolar.codewordserver.com/wp-admin/admin-ajax.php 400 (Bad Request)
send @ jquery.js?ver=1.12.4-wp:4
ajax @ jquery.js?ver=1.12.4-wp:4
n.<computed> @ jquery.js?ver=1.12.4-wp:4
r.length.e.checkAvailability @ frontend-ticket-form.min.js?ver=4.11.1:1
r.length.e.init @ frontend-ticket-form.min.js?ver=4.11.1:1
(anonymous) @ frontend-ticket-form.min.js?ver=4.11.1:1
(anonymous) @ frontend-ticket-form.min.js?ver=4.11.1:1
只有在非常特定的情况下才会发生错误——当单个事件页面显示付费票证的前端表单时。未输出前端已付票证表单时不会发生错误,例如,当有一个注册的RSVP表单没有支付组件时,当事件没有票证组件时,或者,当不是活动成员的用户查看受影响的页面时,通过主题模板文件将有关活动详细信息和购票的所有信息从输出中排除。尽管生成了控制台错误,但ajax似乎工作正常,所有功能都完全按照预期工作。如果你不看控制台,你永远不会知道有问题

为了排除自定义主题的问题或与其他插件的冲突,我激活了默认的Twenty-Twenty主题,并停用了除我列出的6个插件之外的所有其他插件,这些插件是使用Ticked event process所必需的。在这种情况下,错误仍然存在

在与Modern Tribe(插件开发人员)支持台来回交流后,他们报告错误无法复制。所以我试着用一个新的数据库安装WordPress的干净副本,然后在运行默认的Twenty-Twenty主题时只安装这6个插件。我在与开发人员站点相同的cPanel帐户下的同一台服务器上执行了此操作,但出现了错误,只是在不同的子域上。在干净安装上,错误不存在。但是,当我将干净的WordPress安装指向我正在开发的开发站点使用的数据库的副本时,错误再次出现。从这一点上,我只能得出结论,我的数据库中有某种东西导致了这个错误的发生,但现代部落支持告诉我,由于他们无法复制错误,因此他们无法提供任何帮助

重新安装这个网站并不是一个真正的选择,在过去的4年里,我们从购票和会员交易中收集了如此多的数据,我们真的不能丢失。我需要找到错误的数据并清理它,但我在这里感到力不从心。欢迎就如何解决此问题提供任何帮助或建议


编辑以添加:

我通过控制台中的错误消息在javascript文件引用中找到了这段代码。我找对地方了吗

/**
     * Check tickets availability.
     *
     * @since 4.9
     *
     * @return void
     */
    obj.checkAvailability = function() {
        // We're checking availability for all the tickets at once.
        var params = {
            action  : 'ticket_availability_check',
            tickets : obj.getTickets(),
        };

        $.post(
            TribeTicketOptions.ajaxurl,
            params,
            function( response ) {
                var success = response.success;

                // Bail if we don't get a successful response.
                if ( ! success ) {
                    return;
                }

                // Get the tickets response with availability.
                var tickets = response.data.tickets;

                // Make DOM updates.
                obj.updateAvailability( tickets );

            }
        );

        // Repeat every 60 (filterable via tribe_tickets_availability_check_interval ) seconds
        if ( 0 < TribeTicketOptions.availability_check_interval ) {
            setTimeout( obj.checkAvailability, TribeTicketOptions.availability_check_interval );
        }
    }
奇怪的是,这个函数被归档到一个名为Blocks的文件夹中,这意味着它可以与Gutenberg一起工作,我已经通过经典编辑器插件禁用了它

是的,原谅我,但这太多了,不适合评论

我很抱歉,但这更多的是一个调试过程,而不是一个严格的答案

admin ajax.php
文件只有3种情况返回
400
错误

  • 如果用户已登录,且ajax函数尚未添加到
    wp\u ajax\uu{function\u name}
    操作中。(第164行)
  • 用户未登录,且ajax函数尚未添加到
    wp\u ajax\u nopriv\uu{function\u name}
    操作中。(第179行)
  • 请求中未发送任何
    操作
    。(第32行)
您需要找出其中哪一个是导致错误的原因。如果您不确定如何执行此操作,一个简单的方法是临时编辑
admin ajax.php
文件。在你看到这个之前:

// Require an action parameter
if ( empty( $_REQUEST['action'] ) ) {
    wp_die( '0', 400 );
}
添加以下内容(同样,在上述行之前)

' );取而代之。如果您在提交表单时通过电子邮件将其中任何一个发送给您,您将知道没有添加哪个ajax钩子,而且Modern Tribe可能会在这方面帮助您

还要注意的是,修改核心WP文件通常是不好的做法,调试完成后,应该恢复这些更改。(有很多方法可以挂接到文件中,但为了方便/快速诊断,请继续并临时编辑它,因为这些不是永久性更改,而且它位于开发站点上,所以您不必担心)

除此之外,您可能还需要雇佣一名开发人员。看看它,如果没有直接访问您的数据库和文件的权限,堆栈溢出上的其他人所能做的就不多了

是的,原谅我,但这太多了,不适合评论

我很抱歉,但这更多的是一个调试过程,而不是一个严格的答案

admin ajax.php
文件只有3种情况返回
400
错误

  • 如果用户已登录,且ajax函数尚未添加到
    wp\u ajax\uu{function\u name}
    操作中。(第164行)
  • 用户未登录,且ajax功能尚未启用
    public function ticket_availability( $tickets = array() ) {
    
            $response  = array( 'html' => '' );
            $tickets   = tribe_get_request_var( 'tickets', array() );
    
            // Bail if we receive no tickets
            if ( empty( $tickets ) ) {
                wp_send_json_error( $response );
            }
    
            /** @var Tribe__Tickets__Tickets_Handler $tickets_handler */
            $tickets_handler = tribe( 'tickets.handler' );
    
            /** @var Tribe__Tickets__Editor__Template $tickets_editor */
            $tickets_editor = tribe( 'tickets.editor.template' );
    
            // Parse the tickets and create the array for the response
            foreach ( $tickets as $ticket_id ) {
                $ticket = Tribe__Tickets__Tickets::load_ticket_object( $ticket_id );
    
                if (
                    ! $ticket instanceof Tribe__Tickets__Ticket_Object
                    || empty( $ticket->ID )
                ) {
                    continue;
                }
    
                $available = $tickets_handler->get_ticket_max_purchase( $ticket->ID );
    
                $response['tickets'][ $ticket_id ]['available'] = $available;
    
                // If there are no more available we will send the template part HTML to update the DOM
                if ( 0 === $available ) {
                    $response['tickets'][ $ticket_id ]['unavailable_html'] = $tickets_editor->template( 'blocks/tickets/quantity-unavailable', $ticket, false );
                }
            }
    
            wp_send_json_success( $response );
        }
    
    // Require an action parameter
    if ( empty( $_REQUEST['action'] ) ) {
        wp_die( '0', 400 );
    }
    
    ob_start();
    print( '<pre>'. print_r($_REQUEST, true) .'</pre>' );
    wp_mail( 'your-email@address.com', 'Debug Results', ob_get_clean() );
    
    add_action( 'xxx', tribe_callback( 'tickets.editor.blocks.tickets', 'register' ) );
    do_action( 'xxx' );