【问题标题】:Return value of an array for each item in a list返回列表中每个项目的数组值
【发布时间】:2014-12-01 05:11:34
【问题描述】:

我对编写函数和 PHP 还是很陌生,所以如果这很简单,请见谅。让我提供一点背景...

我已经使用 WPMUDev 的 MarketPress 构建了一个电子商务网站,并尝试编写一个函数,该函数将根据所选产品变体显示剩余库存。

在 MarketPress 中,如果您有多个产品变体,例如衬衫(蓝色/黑色/白色)然后您指定具有三种变体的一种产品。在单个产品页面上,每个变体都有一个下拉框。

到目前为止,我的代码只能找到初始产品的库存水平,而不是变体。请看下面:

    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' );

我知道该函数正在选择 $stock[0] 中的第一个变体,因为 [0] 已明确定义。通过手动编写 [1],它将选择下一个变体,依此类推。

我需要做的是,在产品变体下拉列表中,每个变体旁边都有库存,例如:

衬衫(蓝色) - 有货
衬衫(黑色) - 快点只剩 1 件!
衬衫(白色) - 有货

我知道将代码放在哪里,只是不知道如何返回值。

非常感谢任何建议。可能还有更好的方法来写这个......

谢谢!

编辑:在生成下拉列表的代码下方添加。

//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>\n";

                            }

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

                    } else {

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

                    }

【问题讨论】:

  • “返回列表中每个项目的数组值” - 听起来像是函数式语言中 map 之类的任务,不知道 PHP 是否有。
  • 您是否有权访问下拉列表的脚本,或者该脚本在与下拉列表的生成相关的位置运行?
  • @Rasclatt 感谢您的回复。我已经添加了生成下拉菜单的代码。
  • 如果我要做这样的事情,我会确保我有一个包含产品信息的查询,如果可用性在不同的位置/数组,我会确保两者都有匹配键。所以就像$item['product']['123'] = 'Shirt (Blue)'; 和我的其他数组就像$status['product']['123'] = 'Unavailable';。如果您有两个比较阵列或能够制作两个,您可以这样做。另一种方法是让您的函数需要该函数返回状态的项目代码。
  • $meta 数组中,你有没有像$meta['mp_itemcode'] 这样的项目代码(我不知道密钥会被调用,所以这是一个例子......)还是 $key 循环中的项目代码?

标签: php arrays function


【解决方案1】:

这个答案是基于你有一个可以输入方法的项目代码的事实:

编辑:我添加了一个Randomizer 方法,它可以做两件事。 1)您可以将其设置为返回一个随机数以检查$calltoaction if 语句是否正常工作(将Randomizer 中的第二个变量设置为true 而不是false)和2)它将检查您的号码是数字,如果是则返回。如果不是数字,它将返回 'err',这意味着它不是数字。

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>\n";
                }
            $variation_select .= "</select>&nbsp;\n";
        }
    else 
        $button .= '<input type="hidden" name="variation" value="0" />';

【讨论】:

  • 非常感谢您的详细回复!我已经实现了这一点,似乎我们正在取得进展。现在,下拉框中的每个产品变体旁边都有“有货”。问题是,所有产品都说“有货”。当每个变体的库存水平达到“1”时,我希望它说“仅剩 1 个库存”。我将如何实现这一目标?谢谢!
  • 到目前为止,您的帮助很大,请多多包涵。我将如何切换if 语句?我需要每个变体来呼应“In Stock”、“Out of Stock”等。目前所有产品都说“In Stock”。 (一旦这个问题得到解决,我将在 Code Academy 上进行长时间的努力。
  • 不用担心。非常感谢您提供的帮助。
  • 很遗憾没有。它仍然只退回库存的第一件商品。我将玩弄代码,并根据我的发现进行更新。谢谢
  • 如果您重新发布当前代码,它可能会在几分钟内解决。要检查的一件事是$stock[0] 是一个数字,所以我会在页面上回显它以查看它在说什么。这可能不是你所期望的。例如,它可能不是$stock[0],而是类似$stock[0]['in_stock'] 或类似的东西?
猜你喜欢
  • 2014-11-27
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2021-04-10
相关资源
最近更新 更多