【问题标题】:WordPress admin-ajax.php 400 error generated by Event Tickets plugin ... database related?事件门票插件生成的 WordPress admin-ajax.php 400 错误...数据库相关?
【发布时间】:2020-02-28 04:13:11
【问题描述】:

我有一个客户的 WordPress 网站,它使用自定义主题和一些插件组合来创建一个活动日历,登录用户可以在其中购买付费活动的门票并注册免费的 RSVP 要求的活动。为此,我结合使用以下六个插件:

  • 活动日历
  • 活动日历专业版
  • 活动门票
  • 活动门票加价
  • WooCommerce
  • 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

在 Edge 中加载相同的页面会产生以下控制台错误:

HTTP400: BAD REQUEST - The request could not be processed by the server due to invalid syntax
(XHR)POST - https://pcapolar.codewordserver.com/wp-admin/admin-ajax.php

该错误仅在非常特殊的情况下发生 - 当单个活动页面显示付费门票的前端表单时。当没有输出前端付费票表单时不会发生错误,例如当有一个没有支付组件的注册 RSVP 表单时,当没有事件的票组件时,或者当用户不是活动的会员查看受影响的页面,以便通过主题模板文件从输出中排除有关活动和购买门票的详细信息的所有信息。尽管生成了控制台错误,但 ajax 似乎工作正常,并且所有功能都完全按预期工作。如果你不看控制台,你永远不会知道有问题。

为了排除我的自定义主题的问题或与另一个插件的冲突,我激活了默认的二十二十主题并停用了所有其他插件,除了我列出的使用票务活动流程所需的 6 个插件。在这些情况下错误仍然存​​在

在与Modern Tribe(插件开发者)支持台来来回回之后,他们报告错误无法复制。所以我试着自己用一个新的数据库安装一个干净的 WordPress 副本,然后在运行默认的二十二十主题时只安装这 6 个插件。我在与开发站点相同的 cPanel 帐户下的同一台服务器上执行此操作,但出现错误,只是在不同的子域中。在全新安装中,错误不存在。但是,当我将干净的 WordPress 安装指向我正在用于我正在开发的开发站点的数据库的副本时,错误再次出现。由此,我只能得出结论,我的数据库中发生了一些事情导致了这个错误的发生,但是 Modern Tribe 支持告诉我,由于他们无法重现该错误,所以他们无能为力帮助。

从头开始完全安装此网站并不是一个真正的选择,在过去 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 );
        }
    }

编辑添加:

然后我对ticket_availability 进行了字符串搜索,发现以下内容。看起来它可能是相关的,但我在解释方面有点过头了。我是否走在正确的轨道上?

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 );
    }

奇怪的是,这个函数被归档到一个名为 Blocks 的文件夹中,这意味着它可以与 Gutenberg 一起使用,而我已经通过 Classic Editor 插件禁用了它。

【问题讨论】:

    标签: ajax wordpress


    【解决方案1】:

    StackOverflow 的强大功能,请原谅我,但评论太多了。

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

    admin-ajax.php 文件只有 3 个场景会返回 400 错误。

    • 如果用户已登录,并且 ajax 功能尚未添加到 wp_ajax_{function_name} 操作中。 (第 164 行)
    • 用户未登录,wp_ajax_nopriv_{function_name} 操作中未添加 ajax 功能。 (第 179 行)
    • 请求中未发送action。 (第 32 行)

    您需要找出是哪一个导致了您的错误。如果您不确定如何执行此操作,一个简单的方法是临时编辑您的admin-ajax.php 文件。 之前你会看到:

    // 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() );
    

    这将通过电子邮件向您发送(半精美)格式的 $_REQUEST 转储。如果没有action,您会知道由于某种原因没有添加“付费票的前端表单”功能,Modern Tribe 可能会帮助您。

    如果设置了 action,您可以在下面的第 164 或 179 行添加类似的行并重复上述操作,但使用 print( '&lt;pre&gt;'. print_r($action, true) .'&lt;/pre&gt;' ); 代替。如果在您提交表单时通过电子邮件将其中任何一个发送给您,您就会知道哪个 ajax 钩子没有被添加,Modern Tribe 可能会再次为您提供帮助。

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

    除此之外,您可能还需要聘请开发人员来查看它,Stack Overflow 上的人在没有直接访问您的数据库和文件的情况下可以做的事情不多。

    【讨论】:

    • 非常感谢您。我听从了你的指示。第一个建议的结果如下:Array ( [action] =&gt; ticket_availability_check [tickets] =&gt; Array ( [0] =&gt; 6646 ) [woocommerce-login-nonce] =&gt; [_wpnonce] =&gt; [woocommerce-reset-password-nonce] =&gt; ) 第二组建议的结果都回来了ticket_availability_check 所以似乎有一个动作。我不确定是什么问题。
    • 我要补充一点,我不需要实际提交表单来产生错误。只需加载一个页面就会产生错误。但它只发生在这个特定的数据库中。具有相同安装但新数据库没有的全新安装。
    • 由于admin-ajax.php 文件不对400 错误负责,下一步是查看ticket_availablity_check 函数,看看是什么导致它抛出400 错误或否则触发wp_die()
    • 我已经更详细地编辑了原始问题,谢谢。
    • 几乎,但是失败将由 PHP 函数 ticket_availability_check 生成 - 你需要找到它在哪里(很可能是像 function ticket_availability_check(){ 这样的行。JavaScript 文件不是不想生成这些错误,它只是解析来自服务器的响应
    【解决方案2】:

    我遇到了同样的问题,我认为问题是 Tribe__Editor::should_load_blocks 当经典编辑器插件处于活动状态时。

    为了绕过这个错误,我将此代码添加到我的主题 functions.php 文件中

    add_action( 'xxx', tribe_callback( 'tickets.editor.blocks.tickets', 'register' ) );
    do_action( 'xxx' );
    
    

    我希望这对你有用。

    【讨论】:

    • 这确实可以解决控制台错误,但是当启用它并打开调试模式时,我得到以下信息:Notice: wp_register_script was called incorrectly. Scripts and styles should not be registered or enqueued until the wp_enqueue_scripts, admin_enqueue_scripts, or login_enqueue_scripts hooks. Please see Debugging in WordPress for more information. (This message was added in version 3.3.0.) in /home/serveradmin/pcapolar/wp-includes/functions.php on line 49866
    • 调试模式激活时的附加错误:Notice: wp_enqueue_script was called incorrectly. Scripts and styles should not be registered or enqueued until the wp_enqueue_scripts, admin_enqueue_scripts, or login_enqueue_scripts hooks. Please see Debugging in WordPress for more information. (This message was added in version 3.3.0.) in /home/serveradmin/pcapolar/wp-includes/functions.php on line 4986
    • 我还要补充一点,即使经典编辑器插件被禁用,该行为仍然存在。
    【解决方案3】:

    我从插件开发者那里得到的建议是在我的主题的functions.php文件中添加以下内容:

    add_filter( 'tribe_tickets_availability_check_interval', function( $interval) { return 0; } );

    这解决了控制台问题,不会产生额外的错误,并且不会干扰迄今为止执行的所有测试中的任何预期功能。

    【讨论】:

      【解决方案4】:

      想告诉大家,随着 Event Tickets 4.11.4 和 Event Tickets Plus 4.11.3 的发布,这个问题在插件方面已经完全解决了。所以显然这不仅仅是我网站的问题。感谢所有做出贡献的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-09
        • 2020-12-08
        相关资源
        最近更新 更多