douyue7536 2014-10-06 20:58
浏览 23
已采纳

为列表中的每个项返回数组的值

I'm still quite new to writing functions and PHP so please excuse me if this is easy. Let me provide a little background...

I have built an e-commerce site using MarketPress by WPMUDev and trying to write a function that will show the stock remaining depending on the product variation selected.

In MarketPress, if you have more than one variation of a product, e.g. Shirt (Blue/Black/White) then you specify the one product with three variations. On the single product page, you have a drop down box for each variant.

The code I have so far will find the stock level of the initial product only and not the variants. Please see below:

    function mp_product_stock_sc( $atts ){
    global $post;
    $product_id = $post->ID;
    $stock = get_post_meta($product_id, 'mp_inventory', true);
    $high_st = 1;
    //return 'Default Stock: ' . $stock[0];

    if ($stock[0] <= $high_st AND $stock[0] > 0 ) {
        //return 'Hurry! We only have ' . $stock[0] . ' in stock!';
        return 'Hurry! Only one left in stock!';
    } elseif ($stock[0] == 0) {
        return '';
    } else {
        return 'In Stock';
    }


    return 'Stock: ' . $stock[0];
}

    add_shortcode( 'mp_product_stock', 'mp_product_stock_sc' );

I know that the function is selecting the first variant in $stock[0] because the [0] is explicitly defined. By manually writing [1] it would select the next variant and so on.

What I need to do is, on the product variation drop down list, for each variant to have next to it the stock, e.g:

Shirt (Blue) - In Stock
Shirt (Black) - Hurry only 1 left!
Shirt (White) - In Stock

I know where to put the code, just not how to return the value.

Any advice greatly appreciated. There's probably a much better way of writing this too...

Thanks!

Edit: Adding below the code where the drop down is generated.

//create select list if more than one variation

                    if (is_array($meta["mp_price"]) && count($meta["mp_price"]) > 1 && empty($meta["mp_file"])) {

                            $variation_select = '<select class="mp_product_variations" name="variation">';

                            foreach ($meta["mp_price"] as $key => $value) {

                                    $disabled = (in_array($key, $no_inventory)) ? ' disabled="disabled"' : '';

                                    $variation_select .= '<option value="' . $key . '"' . $disabled . '>' . esc_html($meta["mp_var_name"][$key]) . ' - ';

                                    if ($meta["mp_is_sale"] && $meta["mp_sale_price"][$key]) {

                                            $variation_select .= $mp->format_currency('', $meta["mp_sale_price"][$key]);

                                    } else {

                                            $variation_select .= $mp->format_currency('', $value);

                                    }

                                    $variation_select .= "</option>
";

                            }

                            $variation_select .= "</select>&nbsp;
";

                    } else {

                            $button .= '<input type="hidden" name="variation" value="0" />';

                    }
  • 写回答

1条回答 默认 最新

  • dshgnt2008 2014-10-07 01:17
    关注

    This answer is based on the fact that you have an item code that you can feed into the method:

    EDIT: I added a Randomizer method that will do two things. 1) You can set it to return a random number to check that the $calltoaction if statement is working (set the second variable in Randomizer to true instead of false) and 2) It will check that your number is numeric and return it back if it is. If not numeric, it will return 'err' which means it's not a number.

    class StockCheck
            {
                public  static  function Fetch($itemcode, $high_st = 1)
                    {
                        // Check your stock on this item code (I pressume this is what it's doing.
                        // If not, this is what it should to do.)
                        $stock      =   get_post_meta($itemcode, 'mp_inventory', true);
                        // Assign number. If randomizer set to true, it will just generate a random num
                        // to test the if statement below. Change to false to return true number
                        $_inStock   =   self::Randomizer($stock[0],false);
    
                        if($_inStock !== 'err') {
                                if($_inStock !== 0) {
                                        // If stock is less than or equal to 10
                                        if($_inStock <= 10)
                                            $calltoaction   =   'Hurry! Only '.$_inStock.' Left in Stock!';
                                        // If stock is greater than 10 but less than or equal to 20
                                        elseif($_inStock > 10 && $_inStock <= 20)
                                            $calltoaction   =   'Only a Few Left. Going fast!';
                                        // Anthing else is just in stock
                                        else
                                            $calltoaction   =   'In Stock';
                                    }
                                // If zero, out of stock.
                                else
                                    $calltoaction   =   'Out of Stock, Sorry!';
                            }
    
                        return (isset($calltoaction))? $calltoaction:'Error: Stock value not numeric';
                    }
    
                protected static function Randomizer($value = 0, $randomizer = false)
                    {
                        // If set to true, it will just generate a random number for testing purposes
                        $defVal =   ($randomizer == true)? rand(0,30):$value;
                        // If $defVal is not a numeric, return "err"
                        return (is_numeric($defVal) || $defVal == 0)? $defVal:'err'; 
                    }
    
            }
    
        if(is_array($meta["mp_price"]) && count($meta["mp_price"]) > 1 && empty($meta["mp_file"])) {
                $variation_select = '<select class="mp_product_variations" name="variation">';
                foreach ($meta["mp_price"] as $key => $value) {
                        $disabled           =   (in_array($key, $no_inventory)) ? ' disabled="disabled"' : '';
                        $variation_select   .=  '<option value="' . $key . '"' . $disabled . '>' . esc_html($meta["mp_var_name"][$key]) . ' - ';
                        $variation_select   .=  ($meta["mp_is_sale"] && $meta["mp_sale_price"][$key])? $mp->format_currency('', $meta["mp_sale_price"][$key]): $mp->format_currency('', $value);
                        // This is where you would feed your item code...
                        $variation_select   .=  StockCheck::Fetch($meta["mp_itemcode"],1);
                        $variation_select   .=  "</option>
    ";
                    }
                $variation_select .= "</select>&nbsp;
    ";
            }
        else 
            $button .= '<input type="hidden" name="variation" value="0" />';
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥35 引用csv数据文件(4列1800行),通过高斯-赛德尔法拟合曲线,在选取(每五十点取1点)数据,求该数据点的曲率中心。
  • ¥20 程序只发送0X01,串口助手显示不正确,配置看了没有问题115200-8-1-no,如何解决?
  • ¥15 Google speech command 数据集获取
  • ¥15 vue3+element-plus页面崩溃
  • ¥15 像这种代码要怎么跑起来?
  • ¥15 安卓C读取/dev/fastpipe屏幕像素数据
  • ¥15 pyqt5tools安装失败
  • ¥15 mmdetection
  • ¥15 nginx代理报502的错误
  • ¥100 当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧