找到单个项目后,Foreach循环停止运行

时间:2017-01-12 15:36:48

标签: php wordpress woocommerce checkout cart

我有一个条件字段移除器,可以很好地使用ID,但是当我尝试使用类别运行它时,它会在获得结果后停止。

我已使用此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 =&gt;金属和包装材料cat =&gt; bubblewrap,i已经检查了拼写。我做的其他事情是数组的var_dump给了我:[0] =&gt;字符串(5)&#34;金属&#34;

我尝试用i ++制作数组;它确实将位置改为[x],其中x是产品数-1。正如我之前提到的,我制作了一个版本,使用的ID在大商店中工作得很好,所以我知道工作返回数组工作正常。

我没有按照教程到点并过早关闭其中一个foreach循环,导致只运行一次检查。它应该是那样但我有一个}以上//填充类别导致切断循环。

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

1 个答案:

答案 0 :(得分:1)

  

更新:

     

此代码正常运行,我已对其进行了测试   您用于创建2个结帐自定义字段的代码在哪里?
  我认为那是你的主要问题。你正在使用的教程有点过时,一无所有。 Here is the official WooCommerce tutorial for checkout fields

     

您应该更新丢失代码的问题,并清楚地告诉您要对2个结帐自定义字段做些什么(并提供一些详细信息)。

要使您的字段去除功能与类别一起使用,您应该使用has_term()函数作为条件,这样:

{{1}}

代码进入活动子主题(或主题)的function.php文件。或者也可以在任何插件php文件中。