【问题标题】:Woocommerce Uncaught Error: Call to a member function get_stock_quantity() on nullWoocommerce 未捕获的错误:在 null 上调用成员函数 get_stock_quantity()
【发布时间】:2021-11-28 01:25:35
【问题描述】:

我收到了来自 WordPress 的关于致命错误的消息。它与 WPML 字符串翻译插件后端中的特定页面相关。我想一个特别的翻译:

访问发现错误的页面 (xxxxxxxx/wp-admin/admin.php?page=wpml-translation-management%2Fmenu%2Ftranslations-queue.php&return_url=%2Fwp-admin%2Fpost.php%3Fpost%3D117195%26action%3Dedit%26lang%3Den%26message% 3D6&job_id=3741&update_needed=1&trid=129987&language_code=fr)

它也说

错误详情 ============= 文件第 259 行出现 E_ERROR 类型的错误 /nas/content/live/mywebsite/wp-content/themes/babasouk/functions.php。 错误消息:未捕获的错误:调用成员函数 get_stock_quantity() on null in /nas/content/live/mywebsite/wp-content/themes/mytheme/functions.php:259 堆栈跟踪: #0 /nas/content/live/mywebsite/wp-includes/class-wp-hook.php(303): bbloomer_custom_get_availability_text('100 in stock', NULL)

#1 /nas/content/live/mywebsite/wp-includes/plugin.php(189): WP_Hook->apply_filters('100 in stock', Array)

#2 /nas/content/live/mywebsite/wp-content/plugins/woocommerce/includes/abstracts/abstract-wc-product.php(2082): apply_filters('woocommerce_get...', '100 现货', 对象(WC_Product_Variation))

#3 /nas/content/live/mywebsite/wp-content/plugins/woocommerce/includes/abstracts/abstract-wc-product.php(2058): WC_Product->get_availability_text()

#4 /nas/content/live/mywebsite/wp-content/plugins/woocommerce/includes/wc-template-functions.php(3512): WC_Product->get_availability()

#5 /nas/content/live/mywebsite/wp-content/plugins/woocommerce/includes/class-wc-product-variable.php(367): wc_get_stock_html(对象(W

在我的 PHP 中,我回显 get_stock_quantity() 并返回一个值。我还尝试了 $product 的 echo 并返回了所有内容。我禁用了它,因为它信息太多。 网站在这里。 https://babasoukstage.wpengine.com/shop/product-category/decor/moroccan-kilim-pillows/

问题可能是我声明要翻译的“空值”吗? __( '', '巴巴苏克' );

我的 PHP 是

function bbloomer_show_stock_shop() {
  global $product;
  echo wc_get_stock_html( $product );
}
// CHANGE STOCK MESSAGES
add_filter( 'woocommerce_get_availability_text', 'bbloomer_custom_get_availability_text', 99, 2 );

function bbloomer_custom_get_availability_text( $availability, $product ) {
  global $product; // TO MAKE CATEGORY AVAILABLE
  $stock = $product->get_stock_quantity(); //THIS IS LINE 259
    //echo $product; does echo all product details when active
    echo $stock;//test to see if stock quantity returned. Does display on category and product pages.
  // OUTSIDE THE CATEGORY EXCLUSION SO THEY APPLY TO ALL 
  if ( !$product->is_in_stock() )$availability = __( 'Sorry, I am sold out!', 'babasouk' ); //OUT OF STOCK MESSAGE
    if ( $product->is_in_stock() && ( $stock >= 2 ) )$availability = __( '', 'babasouk' ); //NO MESSAGE IF STOCK OVER 1
  //EXCLUDE THESE CATEGORIES FOR 1 ITEM LEFT MESSAGE. IF THESE CATEGORIES MESSAGE IS BLANK.
  if ( has_term( array( 'ORIGINAL ARTWORKS', 'OEUVRES ORIGINALES' ), 'product_cat' ) ) {
    if ( $product->is_in_stock() && ( $stock == 1 ) )$availability = __( '', 'babasouk' ); //
  } //IF NOT EXCLUDED CATEGORIES MESSAGE IS 'Only 1 Available!'
  else if ( $product->is_in_stock() && ( $stock == 1 ) )$availability = __( 'Only 1 Available!', 'babasouk' );
  return $availability;
}

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

    您的代码中有错误,并且日志也会告诉您问题所在。由于您位于functions.php 文件中,因此没有可用的global $product。因此,您会得到一个空指针,因为您什么都没有覆盖可用的产品变量。当我检查您从中获取的页面上的 sn-p 时,也没有使用 global $product - 只是想知道......

    当你检查钩子时,你可以看到有产品已经传递给函数。就用它吧:

    add_filter( 'woocommerce_get_availability_text', 'bbloomer_custom_get_availability_text', 99, 2 );
    function bbloomer_custom_get_availability_text( $availability, WC_Product $product ) {
        $stock = $product->get_stock_quantity(); //THIS IS LINE 259
        //echo $product; does echo all product details when active
        error_log( $stock );//test to see if stock quantity returned. Does display on category and product pages.
        // OUTSIDE THE CATEGORY EXCLUSION SO THEY APPLY TO ALL
        if ( $product->is_in_stock() ) {
            if ( $stock > 1 ) {
                $availability = __( '', 'babasouk' );
            }
    
            if ( $stock === 1 ) {
                if ( has_term( [ 'ORIGINAL ARTWORKS', 'OEUVRES ORIGINALES' ], 'product_cat', $product ) ) {
                    $availability = __( '', 'babasouk' );
                } else {
                    $availability = __( 'Only 1 Available!', 'babasouk' );
                }
            }
        } else {
            $availability = __( 'Sorry, I am sold out!', 'babasouk' );
        }
    
        return $availability;
    }
    

    我还稍微改进了您的代码。最后,您的功能对我来说不是很有意义,但没关系 - 只是为了向您展示一种更好的嵌套方式和速度改进。如果您只调用一次函数而不是多次调用,则可以提高页面速度。

    【讨论】:

    • 非常感谢。显然我的 PHP 技能是有限的。嵌套 if 语句比我所有的 And/Or 代码要干净得多。我有一个问题。 “如果有期限”部分不起作用。列出的 2 个类别仍显示“只有一个可用”消息。这确实适用于我凌乱的代码。 babasoukstage.wpengine.com/shop/product-category/art/…
    • 我添加了一些代码来将类别名称回显到页面以检查我的类别名称是否正确。
    • 澄清一下我在代码中所做的事情。我正在写空白 __( '', 'babasouk' ) 库存消息,因为插件具有默认的库存消息,如果库存为 2 或更高,我不想显示。我在 PHP 7.4 上的 WPEngine 上运行。所以不确定出了什么问题,但它适用于我的更改。
    • 如果 ( has_term( [ 'ORIGINAL ARTWORKS', 'OEUVRES ORIGINALES' ], 'product_cat' ) ) { 有效
    • 好的,但它确实有效。另外,它不能以另一种方式工作。该例外将 2 个类别排除在显示“仅 1 个可用”消息之外,并且该消息适用于所有其他类别。我认为这将适用,但我猜。 if( has_term( 4, 'product_cat' ) ) { // do something if current product in the loop is in product category with ID 4 }
    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2022-12-21
    • 2020-10-04
    • 2016-04-20
    相关资源
    最近更新 更多