2016-02-29 3 views
0

Я пытаюсь изменить функциональность добавления в корзину на странице продукта/магазина на woocommerce на основе настраиваемого поля, используя woocommerce_after_shop_loop_item. Однако, если на странице существует только один элемент с настраиваемым полем, код будет влиять на все продукты, даже те, которые не имеют настраиваемого поля. И я полностью понимаю, почему это происходит. Мой вопрос в том, есть ли способ применить действие только к одному конкретному продукту.Целевой конкретный продукт при вызове woocommerce_after_shop_loop_item

/*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>'); 
} 

} 
+0

является '$ post-> my_custom_field' новый способ получения пользовательское поле? извините ... просто думая, что это неправильно или у вас есть ваша собственная реализация? – Reigel

+0

Не то, чтобы я просто ленился, задавая вопрос. Как я получаю мета-сообщение, это $ myfield = get_post_meta ($ product-> id, 'my_field', true); –

ответ

1

вам не нужно, чтобы удалить woocommerce_template_loop_add_to_cart крючок.
Вместо этого используйте фильтр woocommerce_loop_add_to_cart_link. Этот фильтр содержит кнопку ссылку HTML «добавить в корзину» ... что означает, что вы можете заменить это с 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; 
} 

обновления на основе комментариев ниже ...

Вы знаете, как это сделать для одной страницы продукта?

Вы должны удалить крючок кнопки в 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>'); 
    } 
} 
+0

Спасибо, Рейгель. Это правильный ответ на замену кнопки на странице архива/магазина. И вы также верны в инструкции if. Я обновил утверждение if в вопросе. –

+0

Вы знаете, как это сделать для отдельной страницы продукта? –

+1

Я обновил код ... поиграл, если что-то не хватает ... Я его не тестировал ... – Reigel