缺货时{WooCommerce“联络”按钮

时间:2016-09-28 02:29:56

标签: php wordpress woocommerce

尝试实现一些应该简单的事情,但我尝试了3种具有多种代码变体的方法,但我无法使其工作。我正在尝试创建一个按钮,当项目缺货时,该按钮将代替单个产品页面上的“添加到购物车”按钮。单击该按钮将触发弹出联系表单。

正在以正确的方式在函数中创建一个add动作,还是应该用if语句替换普通按钮?我已经尝试了两种方法,因此非常感谢您对编码的帮助。

3 个答案:

答案 0 :(得分:1)

只需在启用了主题的 functions.php 文件中添加以下代码 reference

add_action('woocommerce_after_shop_loop_item', 'themelocation_change_outofstock_to_contact_us', 1);
// for shop page 
function themelocation_change_outofstock_to_contact_us() {
  global $product;
  if (!$product->is_in_stock()) {
    remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart');
    remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart');
    //change the link to your contact us page
    echo '<a href="/contact"> Contact Us </a>';
  }
}
// for single page
add_filter('woocommerce_get_availability', 'wcs_custom_get_availability', 1, 2);
function wcs_custom_get_availability($availability, $_product) {
  // Change In Stock Text
  if ($_product->is_in_stock()) {
    $availability['availability'] = __('Available!', 'woocommerce');
  }
  // Change Out of Stock Text
  if (!$_product->is_in_stock()) {
    $availability['availability'] = __('<a href="/contact"> Contact Us </a>', 'woocommerce');
  }
  return $availability;
}

答案 1 :(得分:0)

您可以使用woocommerce_loop_add_to_cart_args中的过滤器挂钩functions.php,也可以直接编辑模板文件,将其拉入主题。无论哪种方式都需要一点PHP。

如果在functions.php中执行此操作,它看起来就像这样(未经测试但应该沿着正确的路径发送):

<?php
add_filter( 'woocommerce_loop_add_to_cart_link', 'my_out_of_stock_button' );

function my_out_of_stock_button( $args ){
  global $product;
  if( $product && !$product->is_in_stock() ){
    return '<a href="' . home_url( 'contact' ) . '">Contact us</a>';
  }
  return $args;
}

我不知道您的按钮代码应该是什么样的,或者您需要捕获哪些其他信息,但这就是您可以覆盖&#34;添加到购物车&#34;按钮并在缺货时更换。

更新

LoicTheAztec提出了一个很好的观点 - 提供的过滤器仅影响存档,类别,标签概述页面上的按钮 - 而不是单个产品页面。单个产品页面按钮没有挂钩但您可以copy the templates to your theme and override them

您想要查看templates/single-product/add-to-cart中的文件。使用与上面类似的if语句:

#simple.php
<?php if ( $product->is_in_stock() ) : ?>
  // Standard WooCommerce code
<?php else: ?>
  // Your button code
<?php endif; ?>

答案 2 :(得分:0)

我一直在寻找一种方法来显示定制产品上的联系按钮, @ahwychkchih解决方案效果很好。不过我有一个问题,就是这些产品的架构标记将显示为缺货,而定制产品不是这种情况,因为它们不能立即购买,因此我添加了这个标记以强制对我的产品进行in_stock标记。我知道此解决方案会影响所有产品,因此您随时可以根据需要添加产品ID过滤器

// Force In Stock schema markup
function fix_my_product_offers_schema ($markup_offer, $product) {
  if (!$product->is_in_stock()) {
        $markup_offer['availability'] = 'https://schema.org/InStock';
  }
  return $markup_offer;
}
add_filter('woocommerce_structured_data_product_offer', 'fix_my_product_offers_schema', 1, 2);