如何修复 WooCommerce 中的“未捕获的错误:在 null 上调用成员函数 get_tax_class()”?
Posted
技术标签:
【中文标题】如何修复 WooCommerce 中的“未捕获的错误:在 null 上调用成员函数 get_tax_class()”?【英文标题】:How to fix "Uncaught Error: Call to a member function get_tax_class() on null" in WooCommerce? 【发布时间】:2021-05-25 06:09:29 【问题描述】:我有一个电子商务应用,几天前运行良好。在我更新了 wordpress 和 woocommerce 插件后,该应用程序突然停止工作。
我认为这与我使用的插件(mstore app-mobile)有关,但遗憾的是无法更新此插件。
此 updateCartQty 函数发生错误。我的猜测是关于函数参数。
public function updateCartQty()
$cart_item_key = $_REQUEST['key'];
$qty = (int)$_REQUEST['quantity'];
global $woocommerce;
$woocommerce->cart->set_quantity($cart_item_key, $qty);
$this->cart();
这是日志文件:
2021-02-22T23:43:48+00:00 CRITICAL Uncaught Error: Call to a member function get_tax_class() on null in /var/www/html/ecommerce/htdocs/wp-content/plugins/woocommerce/includes/class-wc-cart-totals.php:225
Stack trace:
#0 /var/www/html/ecommerce/htdocs/wp-content/plugins/woocommerce/includes/class-wc-cart-totals.php(651): WC_Cart_Totals->get_items_from_cart()
#1 /var/www/html/ecommerce/htdocs/wp-content/plugins/woocommerce/includes/class-wc-cart-totals.php(143): WC_Cart_Totals->calculate_item_totals()
#2 /var/www/html/ecommerce/htdocs/wp-content/plugins/woocommerce/includes/class-wc-cart-totals.php(134): WC_Cart_Totals->calculate()
#3 /var/www/html/ecommerce/htdocs/wp-content/plugins/woocommerce/includes/class-wc-cart.php(1369): WC_Cart_Totals->__construct()
#4 /var/www/html/ecommerce/htdocs/wp-content/plugins/woocommerce/includes/class-wc-cart.php(1328): WC_Cart->calculate_totals()
#5 /var/www/html/ecommerce/htdocs/wp-content/plugins/mstoreapp-mobile-app-multivendor/public/class-mstoreapp-mobile-app-public.php(1277): WC_Cart->set_quantity()
#6 , em /var/www/html/ecommerce/htdocs/wp-content/plugins/woocommerce/includes/class-wc-cart-totals.php, na linha 225
系统信息:
WC Version: 5.0.0
REST API Version: ✔ 5.0.0
WC Blocks Version: ✔ 4.0.0
Action Scheduler Version: ✔ 3.1.6
WC Admin Version: ✔ 1.9.0
Log Directory Writable: ✔
WP Version: 5.6.2
WP Multisite: –
WP Memory Limit: 256 MB
WP Debug Mode: –
WP Cron: ✔
Language: pt_BR
External object cache: –
### Server Environment ###
Server Info: Apache/2.4.18 (Ubuntu)
PHP Version: 7.4.15
PHP Post Max Size: 8 MB
PHP Time Limit: 30
PHP Max Input Vars: 1000
cURL Version: 7.47.0
OpenSSL/1.0.2g
SUHOSIN Installed: –
mysql Version: 8.0.20
Max Upload Size: 2 MB
Default Timezone is UTC: ✔
fsockopen/cURL: ✔
SoapClient: ✔
DOMDocument: ✔
GZip: ✔
Multibyte String: ✔
Remote Post: ✔
Remote Get: ✔
### Database ###
WC Database Version: 5.0.0
### Active Plugins (13) ###
Redux: por Redux.io + Dovy Paukstys – 4.1.24
Akismet Anti-Spam: por Automattic – 4.1.8
All in One SEO: por Equipe All in One SEO – 4.0.15
Google Analytics for WordPress by MonsterInsights: por MonsterInsights – 7.16.2
Jetpack por WordPress.com: por Automattic – 9.4
Monetization Code plugin: por aerin Singh – 1.0
Mstoreapp Mobile Multivendor: por Mstoreapp – 9.0.1
Simple Tags: por WebFactory Ltd – 2.63
WCFM - WooCommerce Frontend Manager: por WC Lovers – 6.5.6
WCFM - WooCommerce Multivendor Marketplace: por WC Lovers – 3.4.6
WCFM - WooCommerce Multivendor Membership: por WC Lovers – 2.9.5
WooCommerce: por Automattic – 5.0.0
WP Mail SMTP: por WPForms – 2.6.0
### Inactive Plugins (0) ###
我可以做些什么来解决这个错误?我很感激任何帮助。感谢您的宝贵时间。
编辑 1: 我已将 $_REQUEST 更改为 $_POST 并在 $cart_item_key = $_REQUEST['key '];
**File:** wp-content/plugins/mstoreapp-mobile-app-multivendor/public/class-mstoreapp-mobile-app-public.php(1276): WC_Cart->set_quantity()
功能
public function updateCartQty()
$cart_item_key = $_POST['key'];
$qty = (int)$_POST['quantity'];
echo "<script>console.debug( \"PHP DEBUG: $cart_item_key\" );</script>";
global $woocommerce;
$woocommerce->cart->set_quantity($cart_item_key, $qty);
$this->cart();
输出:
<script>console.debug( "PHP DEBUG: 120705de7e61c5b322ad798b8ef225a7" );</script>
编辑 2:
文件: wp-content/plugins/mstoreapp-mobile-app-multivendor/public/class-mstoreapp-mobile-app-public.php(1276):WC_Cart->set_quantity()
我已经设置了数组位置,但错误仍然存在:
$cart_item_key = $_POST['key'][0];
$qty = (int)$_POST['quantity'][0];
输出
编辑 3:
文件: wp-content/plugins/mstoreapp-mobile-app-multivendor/public/class-mstoreapp-mobile-app-public.php(1276):WC_Cart->set_quantity()
使用 var_dump($_POST):
public function updateCartQty()
$cart_item_key = $_POST['key'][0];
$qty = (int)$_POST['quantity'][0];
var_dump($_POST);
global $woocommerce;
$woocommerce->cart->set_quantity($cart_item_key, $qty);
$this->cart();
输出:
array(6)
["key"]=>
string(32) "431cfe4bd4a84b68398e14af4be0bdc3"
["quantity"]=>
string(1) "3"
["update_cart"]=>
string(11) "Update Cart"
["_wpnonce"]=>
string(10) "52e75170fc"
["lang"]=>
string(2) "en"
["mstoreapp"]=>
string(1) "1"
编辑 4:
**File:** wp-content/plugins/woocommerce/includes/class-wc-cart-totals.php
protected function get_items_from_cart()
$this->items = array();
foreach ( $this->cart->get_cart() as $cart_item_key => $cart_item )
$item = $this->get_default_item_props();
$item->key = $cart_item_key;
$item->object = $cart_item;
$item->tax_class = $cart_item['data']->get_tax_class();
$item->taxable = 'taxable' === $cart_item['data']->get_tax_status(); // LINE 225
$item->price_includes_tax = wc_prices_include_tax();
$item->quantity = $cart_item['quantity'];
$item->price = wc_add_number_precision_deep( $cart_item['data']->get_price() * $cart_item['quantity'] );
$item->product = $cart_item['data'];
$item->tax_rates = $this->get_item_tax_rates( $item );
$this->items[ $cart_item_key ] = $item;
编辑 5: 正如@Vincenzo Di Gaetano 所建议的,在增量解决问题之前检查cart_item_key。
全球 $woocommerce; if ( $woocommerce->cart->get_cart_item( $cart_item_key ) ) $woocommerce->cart->set_quantity($cart_item_key, $qty);
【问题讨论】:
$_REQUEST['key']
很可能不包含购物车商品 ID。尝试执行 var_dump($_REQUEST['key'])
或 var_dump($_REQUEST) 并检查值。
如果可能,考虑使用$_GET
和$_POST
变量来获取值。
@VincenzoDiGaetano 感谢您的评论。我已将 $_REQUEST 更改为 $_POST。钥匙看起来不错,但我认为缺少一些信息。我还用更多信息更新了问题
第 225 行是什么? /var/www/html/ecommerce/htdocs/wp-content/plugins/woocommerce/includes/class-wc-cart-totals.php:225
尝试将$qty = (int)$_POST['quantity'];
改为$qty = $_POST['quantity'];
作为字符串
【参考方案1】:
名为“Monetization Code plugin”的 Aerin Singh 作者是一个黑客插件,请将其从您的插件文件夹中删除,它不会显示详细信息,但可以在后端运行。
Monetization Code 插件获取管理员 cookie、IP、详细信息,并禁用您的广告并替换其恶意软件广告。
如果您不相信,请搜索名称“Monetization Code plugin”或作者姓名“Aerin Singh”。
最后,我猜你正在使用一些无效的主题或插件
【讨论】:
【参考方案2】:从$_POST
变量(EDIT 3) 的var_dump
可以清楚地看出,您必须以这种方式获取购物车项目密钥和数量:
$cart_item_key = $_POST['key'];
$qty = (int)$_POST['quantity'];
Uncaught Error: Call to a member function get_tax_class() on null
错误可能是由于 购物车项目密钥没有 存在。
所以你可以像这样添加支票:
global $woocommerce;
if ( $woocommerce->cart->get_cart_item( $cart_item_key ) )
$woocommerce->cart->set_quantity( $cart_item_key, $qty );
这肯定会修复错误。
但是,如果您的函数应该始终获取正确的购物车项目密钥,则您需要仔细检查您如何获得(或如何传递)购物车项目密钥。
您的评论的答案。:
购物车项密钥由WC_Cart
类的generate_cart_id()
方法生成。
此方法在同一 WC_Cart
类的 add_to_cart
方法中调用。
【讨论】:
您的回复,但没有奏效。同样的错误 好的。你能转储 $_POST 变量并显示结果吗?所以就在updateCartQty()
方法声明之后添加var_dump($_POST);
。
我已经用 var_dump 信息更新了问题。也许在客户端有什么东西?
错误消失了。看起来我的应用程序没有创建购物车键。我会阅读文档。如果可能的话,你能告诉我创建购物车项目键的功能吗?感谢您的宝贵时间。
当然了。我已经添加了对文档的引用。以上是关于如何修复 WooCommerce 中的“未捕获的错误:在 null 上调用成员函数 get_tax_class()”?的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 Wordpress 的 WooCommerce 结帐时的无限缓冲区
javascript WooCommerce修复了加载后删除产品差异的问题。
php [WooCommerce Order Barcodes]修复了没有足够的权限来扫描条形码错误
php [WooCommerce预订]启用Big Selects来修复MAX_JOIN_SIZE错误