调用时定位特定产品 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>');
}
}
我正在尝试使用 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>');
}
}