如何在购物车页面中正确设置数量下拉菜单?

时间:2015-11-19 15:18:49

标签: php wordpress woocommerce

因为我不知道如何禁用数量悬停。我将使用下拉数量。我有代码,但数量下拉列表没有更新购物车页面中的正确数字。你知道为什么吗?例如,如果我的数量为3,则在我的购物车页面中会显示1。 此外,当我选择我的数量3,然后我点击"添加到购物车按钮" ,它会说"请选择产品选项"因为我没有选择尺寸。数量从1开始,它与我之前选择的不相同。 此外,这也必须在移动设备上工作。你能帮帮我吗?谢谢

// override the quantity input with a dropdown
function woocommerce_quantity_input() {
global $product;
global $post;
global $prod_quant_default;



$prod_quant_default = 1;     // <----------- Default Amount
$category_ID = '26';         // <----------- Case Category

$terms = get_the_terms( $post->ID, 'product_cat' );
foreach ($terms as $term) {
    $product_cat_id = $term->term_id;
    break;
}


// Sets QTY for Cases (Cat 26)          
if ($product_cat_id == $category_ID){
    $prod_quant_default = 1;
            //break;
  }


$defaults = array(
    'input_name'    => 'quantity',
    'input_value'   => '1',
    'max_value'     => apply_filters( 'woocommerce_quantity_input_max', '', $product ),
    'min_value'     => apply_filters( 'woocommerce_quantity_input_min', '', $product ),
    'step'      => apply_filters( 'woocommerce_quantity_input_step', '1', $product ),
    'style'     => apply_filters( 'woocommerce_quantity_style', 'float:left; margin-right:10px;', $product )
);
if ( ! empty( $defaults['min_value'] ) )
    $min = $defaults['min_value'];
else $min = 1;

if ( ! empty( $defaults['max_value'] ) )
    $max = $defaults['max_value'];
else $max = 10;

if ( ! empty( $defaults['step'] ) )
    $step = $defaults['step'];
else $step = 1;


$options = '';
for ( $count = $min; $count <= $max; $count = $count+$step ) {
    global $prod_quant_default;
            if ($count == $prod_quant_default) {
                $selected = ' selected="selected" ';
                }
            else {
                $selected = null;
            }


            $options .= '<option' . $selected . ' value="' . $count . '">' . $count . '</option>';

}
echo '<div class="quantity_select" style="' . $defaults['style'] . '"><select name="' . esc_attr( $defaults['input_name'] ) . '" title="' . _x( 'Qty', 'Product quantity input tooltip', 'woocommerce' ) . '" class="qty">' . $options . '</select></div>';

}

2 个答案:

答案 0 :(得分:1)

我认为最好的方法是覆盖quantity-input.php函数调用的woocommerce_quantity_input()模板。

您主题的新woocommerce/global/quantity-input.php模板覆盖:

<?php
/**
 * Product quantity inputs
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/global/quantity-input.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you (the theme developer).
 * will need to copy the new files to your theme to maintain compatibility. We try to do this.
 * as little as possible, but it does happen. When this occurs the version of the template file will.
 * be bumped and the readme will list any important changes.
 *
 * @see         http://docs.woothemes.com/document/template-structure/
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.5.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}
?>
<div class="quantity">
    <?php
    $options = '';
    for ( $count = $args['min_value']; $count <= $args['max_value']; $count = $count+$args['step'] ) {
        $options .= '<option' . selected( $args['input_value'], $count, false ) . ' value="' . $count . '">' . $count . '</option>';
    } 
    if ( $options ){ ?>
    <select name="<?php echo esc_attr( $args['input_name'] ); ?>" title="<?php echo esc_attr_x( 'Qty', 'Product quantity input tooltip', 'woocommerce' ) ?>" class="qty" /><?php echo $options;?></select>
    <?php } else {
        printf( '%s <input type="hidden" name="%s" value="%s" />', $args['input_value'], $args['input_name'], $args['input_value'] );
    } ?>
</div>

注意:我所有的本地测试都在最前沿的WooCommerce上,我不确定这里列出的2.5版本是否适用于当前的WC2.4.X.但这个想法是类似的。

如果您需要修改最低/最高默认值,可以通过主题functions.php中的过滤器执行此操作:

add_filter( 'woocommerce_quantity_input_max', 'so_input_max', 20, 2 );
function so_input_max( $max, $product ){
    return 10;
}

add_filter( 'woocommerce_quantity_input_min', 'so_input_min', 20, 2 );
function so_input_min( $min, $product ){
    return 1;
}

请记住,在调用woocommerce_quantity_input()函数时没有直接指定min / max的情况下,这些只是默认值。

修改

我改进了上面的模板以获得正确的输入名称/值(<select>肯定有错误的名称属性)并在没有选项的情况下显示隐藏的数量输入(这就是Woo所做的当产品单独出售时,以便在更新购物车时数量不会丢失。)

购物车页面上没有选项,因为cart.php模板没有设置最大值,如果项目的库存没有被管理,或者是否允许延期交货。 null max会杀死我们模板中的for循环。如果min为0且max为null,则无需循环,也不会创建<option>个标记。

要解决此问题,我们可以过滤woocommerce_cart_item_quantity模板中的cart.php。这也需要添加到您的functions.php

add_filter( 'woocommerce_cart_item_quantity', 'so_cart_item_quantity', 10, 3 );
function so_cart_item_quantity( $product_quantity, $cart_item_key, $cart_item ){
    $_product = $cart_item['data'];
     if ( ! $_product->is_sold_individually() ) {
        $max_value = $_product->backorders_allowed() ? '' : $_product->get_stock_quantity();
        // set a max of 10 as default if max is null
        $max_value = $max_value != '' ? $max_value : 10;
        $product_quantity = woocommerce_quantity_input( array(
                'input_name'  => "cart[{$cart_item_key}][qty]",
                'input_value' => $cart_item['quantity'],
                'max_value'   => $max_value,
                'min_value'   => '0'
        ), $_product, false );
    }
    return $product_quantity;
}

答案 1 :(得分:1)

使用带有AJAX的Woo 2.6进行购物车更新时存在一个问题,即选择中断。如果你删除尾随/这里:

...', 'woocommerce' ) ?>" class="qty" />

要:

', 'woocommerce' ) ?>" class="qty">

现在可以了。