2017-01-12 67 views
2

我有一個有條件的字段刪除程序,它可以很好地與ids一起工作,但是當我嘗試運行它時,它會在得到結果後停止。Foreach循環在找到單個項目後停止運行

我已經使用這個tutorial作爲引導線:

<?php 
    /*=============Conditional field remover===========*/ 
    //Cart check 
    function wc_ninja_product_is_in_the_cart() { 
     /*p1 products*/ 
     $p1_cat = array('metal', 'wood'); 
     /*p2 products*/ 
     $p2_cat = array('bubblewrap'); 

    // Products currently in the cart 
    $cart_ids = array(); 
    $cart_categories = array(); 
    //Declaring var 
    $p1 = false; 
    $p2 = false; 
    //creating an array 
    foreach(WC()->cart->get_cart() as $cart_item_key => $values) { 
     $cart_product = $values['data']; 
     $cart_ids[] = $cart_product->id; 
    } 
    //filling array 
    foreach($cart_ids as $id) { 
     $products_categories = get_the_terms($id, 'product_cat'); 
    } 
    //filling category 
    foreach ($products_categories as $products_category) { 
     //Check 
     if (in_array($products_category->slug, $p1_cat)) { 
      $p1 = true;//Result 
     } 
     if (in_array($products_category->slug, $p2_cat)) { 
      $p2 = true;//Result 
     } 
     $cart_categories[] = $products_category->slug; 
    } 
    //Returns result to function 
    return array($p1, $p2); 
} 
//Field Remover 
function wc_ninja_remove_checkout_field($fields) { 
    //Gets value from function and places them in the array !PHP 7 reverses order! 
    list($p1, $p2) = wc_ninja_product_is_in_the_cart(); 
    var_dump(wc_ninja_product_is_in_the_cart()); 
    //If check came back false it will remove the field in question 
    if ($p1 == false) { 
     //removes Field domain name 
     unset($fields['billing']['Field_1']); 
    } 
    if ($p2 == false) { 
     //Removes Field office_emails 
     unset($fields['billing']['Field_2']); 
    } 
    //Return unset result 
    return $fields; 
} 
add_filter('woocommerce_checkout_fields' , 'wc_ninja_remove_checkout_field'); 

上面的代碼將導致只顯示Field_1如果兩個乘積相加(在測試情況下,金屬盒貓=>金屬和填料材料cat => bubblewrap,我已經檢查了拼寫,其他的事情是數組var_dump給了我:[0] => string(5)「metal」

我試圖讓數組通過與一個i ++;它確實將位置更改爲[x],其中x是產品數量-1。as我之前提到我做了一個使用ID的版本,在大商店中工作正常並不實用,所以我知道工作返回數組工作正常。

我沒有按照教程點,並過早關閉了一個foreach循環導致只運行一次檢查。它應該是這樣的,但我有一個}上面//填充類別導致切斷循環。

foreach($cart_ids as $id) { 
    $products_categories = get_the_terms($id, 'product_cat'); 
    //filling category 
    foreach ($products_categories as $products_category) { 
+0

小小的更新,現在它只比較數組中的最後一項,它將顯示數組中的所有項目,但只比較最後一項。我所做的只是把$ cart_categories [] = $ products_category-> slug;在填充數組foreach中如果 – Whisper

+0

以上,你重寫var,使用數組而不是 –

+0

Id檢查具有相同的行只是id而不是類別,我試着把它放在一個數組中,但仍然是相同的結果。 – Whisper

回答

1

UPDATE:

此代碼的工作,我已經測試它。
您正在使用哪些代碼創建2個簽出自定義字段?
我認爲這是您的主要問題在這裏。而且你正在使用的教程有點過時並且毫無用處。 Here is the official WooCommerce tutorial for checkout fields

你應該更新你的問題whith那個缺少的代碼,並清楚地告訴你想要做什麼與2結帳自定義字段(並提供一些關於它們的細節)。

爲了讓你的領域卸妝功能的使用類別,你應該使用has_term()功能的條件下,這種方式:

// Checkout Field Remover 
add_filter('woocommerce_checkout_fields' , 'custom_cats_remove_checkout_field'); 
function custom_cats_remove_checkout_field($fields) { 
    // Initialising variables 
    $cat1_found = false; 
    $cat2_found = false; 

    // Iterating throuh each cart item 
    foreach(WC()->cart->get_cart() as $cart_item_key => $cart_item) { 
     // Cart item_id 
     $cart_item_id = $cart_item['data']->id; 

     // For first categories group 
     if(has_term(array('metal', 'wood'), 'product_cat', $cart_item_id)){ 
      $cat1_found = true; 
     } 

     // For the second category 
     if(has_term('bubblewrap', 'product_cat', $cart_item_id)){ 
      $cat2_found = true; 
     } 
    } 
    //If check came back false it will remove the field in question 
    if ($cat1_found) { 
     // Removes Field domain name 
     unset($fields['billing']['Field_1']); 
    } 
    if ($cat2_found) { 
     //Removes Field office_emails 
     unset($fields['billing']['Field_2']); 
    } 
    //Return unset result 
    return $fields; 
} 

代碼放在您的活動子主題的function.php文件(或主題)。或者也可以在任何插件php文件中使用。

+0

它現在不會刪除任何字段,我做了var_dump並且$ catx_found都是NULL。 – Whisper

+1

我使用一個插件添加額外的領域後,這個代碼小小的代碼與我自己的正確解決方案一樣工作,我會接受這個作爲正確的答案,因爲看到它比我的速度更快。 – Whisper