【问题标题】:WooCommerce how to check if the product is in stockWooCommerce 如何检查产品是否有货
【发布时间】:2021-12-04 01:10:21
【问题描述】:

我认为有一个相当简单的解决方案:

在 WooCommerce 中,我想将我的交货时间过滤器应用于单个产品,但前提是它是 available/in stock。在检查任何形式的产品库存时,我都会遇到错误。

function filter_woocommerce_germanized_delivery_time_html( $str_replace, $html ) { 
    
    global $product;
if( $product->is_in_stock() ) {

        echo '<p class="wc-gzd-additional-info delivery-time-info">';
        echo $str_replace;
        echo '</p>'; 
    echo '<p class="wc-gzd-additional-info"><a href="https://xyz.at/info/lieferzeiten/" target="_blank"><i class="fas fa-shipping-fast"></i> EU-Lieferzeiten</a></p></span>';
    
}
    
}   
         
// add the filter 
add_filter( 'woocommerce_germanized_delivery_time_html', 'filter_woocommerce_germanized_delivery_time_html', 10, 2 );

我也试过了:

if($product->get_stock_quantity()>0) 

但类似的错误如下:

“未捕获的错误:在 null 上调用成员函数 is_in_stock()..”

感谢您的帮助!

问候, 费利克斯

【问题讨论】:

    标签: php wordpress woocommerce woocommerce-theming


    【解决方案1】:

    错误是告诉您您在 null 值上使用了您的函数,这意味着它找不到 $product 变量。

    不确定这个woocommerce_germanized_delivery_time_html 过滤钩子来自哪里以及您在哪里使用global $product,但您可以使用以下sn-p 来获取产品。

    global $post;
    $product = wc_get_product($post->ID);
    

    现在您的整个代码将是这样的:

    add_filter( 'woocommerce_germanized_delivery_time_html', 'filter_woocommerce_germanized_delivery_time_html', 10, 2 );
    
    function filter_woocommerce_germanized_delivery_time_html($str_replace, $html)
    {
    
        global $post;
    
        $product = wc_get_product($post->ID);
    
        if ($product->is_in_stock()) {
    
            echo '<p class="wc-gzd-additional-info delivery-time-info">';
            echo $str_replace;
            echo '</p>';
            echo '<p class="wc-gzd-additional-info">';
            echo '<a href="https://xyz.at/info/lieferzeiten/" target="_blank"><i class="fas fa-shipping-fast"></i> EU-Lieferzeiten</a>';
            echo '</p>';
        } else{
           return $str_replace;
        }
    
    }
    

    或者你可以像这样得到库存数量:

    add_filter( 'woocommerce_germanized_delivery_time_html', 'filter_woocommerce_germanized_delivery_time_html', 10, 2 );
    
    function filter_woocommerce_germanized_delivery_time_html($str_replace, $html)
    {
    
        global $post;
    
        $stock_quantity = get_post_meta($post->ID, '_stock', true);
    
        if ($stock_quantity > 0) {
    
            echo '<p class="wc-gzd-additional-info delivery-time-info">';
            echo $str_replace;
            echo '</p>';
            echo '<p class="wc-gzd-additional-info">';
            echo '<a href="https://xyz.at/info/lieferzeiten/" target="_blank"><i class="fas fa-shipping-fast"></i> EU-Lieferzeiten</a>';
            echo '</p>';
        } else {
           return $str_replace;
        }
    
    }
    

    让我知道你是否可以让它工作!

    【讨论】:

    • 谢谢你到目前为止的帮助 Ruvee,你的第一个 sn-p 也让我出错,第二个在我将 if ($stock_quantity) 更改为 if ($stock_quantity&gt;0) 后工作,但奇怪的是交货然后时间从购物车视图中的产品中消失。反正我可能把它弄得太复杂了。我从这里hookr.io/filters/woocommerce_germanized_delivery_time_html 得到了钩子,实际上我想做的就是在钩子之后添加一些 html。再次感谢!
    • 嗯,更糟糕的是,我在前端得到了一些奇怪的输出。
    • 没关系,这是意料之中的。这是一个很好的例子,可以在您提出问题时包含尽可能多的信息和上下文。我无法调试我看不到的东西。当你说“一种工作” 不清楚当你说“更打破它”时发生了什么 也不是很清楚,而且太宽泛了。您至少可以提供错误消息吗?或者一些屏幕截图,以便我可以看到发生了什么?
    • 好的,我只是没想到你还想在里面工作,非常感谢!所以用你的第二个 sn-p 我得到这个输出:i.ibb.co/BKfqF13/Bildschirmfoto-2021-10-16-um-15-44-43.png 和卡片中:i.ibb.co/CV0fmvf/Bildschirmfoto-2021-10-16-um-15-44-54.png 但它应该是这样的:i.ibb.co/PjVJQvt/Bildschirmfoto-2021-10-16-um-15-48-35.png (在你以前的版本中一切正常,但在卡片显示的运输消失了) 按照欧盟的规定,必须显示运输时间,包括我到欧盟运输时间的附加链接..
    • 谢谢,这是迄今为止最好的版本,它除了在卡片视图中还可以正常工作,它只是告诉我没有额外的 EU-shipping-link 的常规运输时间(这是有道理的,因为 else { return $str_replace;}部分。我会尝试自己解决剩下的问题,也许会回来找你。非常感谢你的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2014-10-08
    • 1970-01-01
    • 2023-03-30
    • 2017-06-18
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多