调用时定位特定产品 woocommerce_after_shop_loop_item

Target Specific Product when calling woocommerce_after_shop_loop_item

我正在尝试使用 woocommerce_after_shop_loop_item 根据自定义字段更改 woocommerce 上产品 archive/shop 页面上的添加到购物车功能。但是,如果页面上只存在一个带有自定义字段的项目,代码将影响所有产品,即使是没有自定义字段的产品。我完全理解为什么会这样。我的问题是,是否有任何方法可以仅将操作应用于该特定产品。

/*STEP 1 - REMOVE ADD TO CART BUTTON ON PRODUCT ARCHIVE (SHOP) */

function remove_loop_button(){

 global $product;
 $mycustomfield = get_post_meta($product->id, 'my_custom_field', true);

 if($mycustomfield == true)
 {
  remove_action( 'woocommerce_after_shop_loop_item',
 'woocommerce_template_loop_add_to_cart', 10 );
 }

}
add_action('init','remove_loop_button');



/*STEP 2 -ADD NEW BUTTON THAT LINKS TO PRODUCT PAGE FOR EACH PRODUCT */

add_action('woocommerce_after_shop_loop_item','replace_add_to_cart');
function replace_add_to_cart() {

 global $product;
 $mycustomfield = get_post_meta($product->id, 'my_custom_field', true);

 if($mycustomfield == true)
 {
   $link = $product->get_permalink();
   echo do_shortcode('<a href="'.$link.'" class="button addtocartbutton">View Product</a>');
 }

}

您不需要删除 woocommerce_template_loop_add_to_cart 挂钩。
相反,使用 woocommerce_loop_add_to_cart_link 过滤器。此过滤器包含 html 按钮 link "add to cart"... 这意味着您可以将其替换为您的 html 按钮...

add_filter('woocommerce_loop_add_to_cart_link','replace_add_to_cart', 10, 2);
function replace_add_to_cart( $add_to_cart_link, $product ) {

 $buyback = get_post_meta($product->id, 'is_buyback', true);
 if($buyback == true)
 {
   $link = $product->get_permalink();
   $add_to_cart_link = do_shortcode('<a href="'.$link.'" class="button addtocartbutton">View Product</a>');
 }
 return $add_to_cart_link;
}

根据以下评论更新...

Do you know how to do this for a single product page ?

您必须在 woocommerce_init 中删除按钮的挂钩。

add_action('woocommerce_init', 'remove_woocommerce_template_hooks');
function remove_woocommerce_template_hooks(){
    global $product;
    $buyback = get_post_meta($product->id, 'is_buyback', true);
    if($buyback == true) {
        //remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
        remove_action( 'woocommerce_simple_add_to_cart', 'woocommerce_simple_add_to_cart', 30 );
        //remove_action( 'woocommerce_grouped_add_to_cart', 'woocommerce_grouped_add_to_cart', 30 );
        //remove_action( 'woocommerce_variable_add_to_cart', 'woocommerce_variable_add_to_cart', 30 );
        //remove_action( 'woocommerce_external_add_to_cart', 'woocommerce_external_add_to_cart', 30 );
        //remove_action( 'woocommerce_single_variation', 'woocommerce_single_variation', 10 );
        //remove_action( 'woocommerce_single_variation', 'woocommerce_single_variation_add_to_cart_button', 20 );
    }
}

我选择删除 woocommerce_simple_add_to_cart 只是为了举例...
然后添加一个挂钩...

add_action( 'woocommerce_simple_add_to_cart', 'my_woocommerce_simple_add_to_cart', 30 );
//add_action( 'woocommerce_grouped_add_to_cart', 'my_woocommerce_simple_add_to_cart', 30 );
function my_woocommerce_simple_add_to_cart(){
    global $product;
    $buyback = get_post_meta($product->id, 'is_buyback', true);
    if($buyback == true) {
       $link = $product->get_permalink();
       echo do_shortcode('<a href="'.$link.'" class="button addtocartbutton">View Product</a>');
    } 
}