繁体   English   中英

无法捕获 WooCommerce REST API 导致 PHP 错误的请求

[英]Unable to capture WooCommerce REST API request which is causing PHP error

我有一个第三方应用程序,它通过 REST API 将产品数据插入到 WooCommerce。第三方应用程序不记录出站 API 请求。

第三方应用程序正在向 WooCommerce 发出请求,这会导致 PHP 错误。

[16-Jan-2023 14:52:23 UTC] PHP Fatal error:  Uncaught TypeError: preg_match(): Argument #2 ($subject) must be of type string, WP_REST_Request given in /home/CENSORED/public_html/wp-includes/formatting.php:1596
Stack trace:
#0 /home/CENSORED/public_html/wp-includes/formatting.php(1596): preg_match('/[\\x80-\\xff]/', Object(WP_REST_Request))
#1 /home/CENSORED/public_html/wp-includes/formatting.php(2207): remove_accents(Object(WP_REST_Request))
#2 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(310): sanitize_title(Object(WP_REST_Request))
#3 /home/CENSORED/public_html/wp-includes/plugin.php(205): WP_Hook->apply_filters(Object(WP_REST_Request), Array)
#4 /home/CENSORED/public_html/wp-includes/taxonomy.php(1751): apply_filters('pre_term_slug', Object(WP_REST_Request), 'pa_colour')
#5 /home/CENSORED/public_html/wp-includes/taxonomy.php(1653): sanitize_term_field('slug', Object(WP_REST_Request), 0, 'pa_colour', 'db')
#6 /home/CENSORED/public_html/wp-includes/taxonomy.php(2385): sanitize_term(Array, 'pa_colour', 'db')
#7 /home/CENSORED/public_html/wp-content/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-terms-controller.php(407): wp_insert_term('DENIM BLUE', 'pa_colour', Array)
#8 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(1171): WC_REST_Terms_Controller->create_item(Object(WP_REST_Request))
#9 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(1018): WP_REST_Server->respond_to_request(Object(WP_REST_Request), '/wc/v2/products...', Array, NULL)
#10 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(442): WP_REST_Server->dispatch(Object(WP_REST_Request))
#11 /home/CENSORED/public_html/wp-includes/rest-api.php(410): WP_REST_Server->serve_request('/wc/v2/products...')
#12 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(308): rest_api_loaded(Object(WP))
#13 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters(NULL, Array)
#14 /home/CENSORED/public_html/wp-includes/plugin.php(565): WP_Hook->do_action(Array)
#15 /home/CENSORED/public_html/wp-includes/class-wp.php(399): do_action_ref_array('parse_request', Array)
#16 /home/CENSORED/public_html/wp-includes/class-wp.php(780): WP->parse_request('')
#17 /home/CENSORED/public_html/wp-includes/functions.php(1332): WP->main('')
#18 /home/CENSORED/public_html/wp-blog-header.php(16): wp()
#19 /home/CENSORED/public_html/index.php(17): require('/home/CENSORED...')
#20 {main}
thrown in /home/CENSORED/public_html/wp-includes/formatting.php on line 1596

我认为 PHP 错误是一个错误,需要报告给 WooCommerce 和/或 WordPress。我无法捕获请求的内容,因此我无法提供重现错误报告的步骤。

我正在测试 WordPress 和 WooCommerce 的完全空白和最新安装,没有其他插件(下面提到的插件除外)。

我努力了:

我如何捕获完整的请求,以便我可以确认这是 WooCommerce 或 WordPress 错误并报告给相应的 github?

我建议:在这种特殊情况下,“通过 printf 调试”或“通过print_r调试”。

编辑/home/CENSORED/public_html/index.php并在第 17 行之前插入:

syslog(LOG_ERROR, print_r($_GET, TRUE));
syslog(LOG_ERROR, print_r($_POST, TRUE));

根据您的插件触发的请求类型,内容应出现在这些日志输出之一中。

您也可以 go 到/home/CENSORED/public_html/wp-includes/formatting.php并在第 1596 行之前插入:

syslog(LOG_ERROR, print_r($text, TRUE));

获取格式错误的字符串变量。

这样做之后,您应该能够通过以下方式在服务器的系统日志中找到日志行:

tail -f /var/log/syslog

如果不幸的是您无法访问服务器机器上的 wp 源代码,您应该通过WiresharkTShark在运行插件的桌面机器上捕获请求。 我不会责怪它矫枉过正。 通过过滤服务器 IP、协议 http 和方法( http.request.method == GEThttp.request.method == POST )的捕获,问题的核心应该很快就会揭示出来(也许你必须从重置请求方案httpshttp )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM