【发布时间】: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 插件禁用了它。
【问题讨论】: