使用选择下拉列表更改Woocommerce中显示的产品数量

时间:2017-10-09 17:37:11

标签: php wordpress woocommerce

尝试在产品列表中添加下拉列表以更改显示的产品数量。我正在研究最新版本的Wordpress(4.8.2)和Woocommerce(3.1.2)。

这是我在char

上的代码
functions.php

所以问题是当我更改下拉列表时,页面重新加载但显示的产品数量保持不变。默认。知道出了什么问题吗?

编辑:我尝试在功能的第一行添加//save and load the chosen option from session function jc_get_products_per_page(){ global $woocommerce; $default = 5; $count = $default; $options = jc_get_products_per_page_options(); // capture form data and store in session if(isset($_POST['jc-woocommerce-products-per-page'])){ // set products per page from dropdown $products_max = intval($_POST['jc-woocommerce-products-per-page']); if($products_max != 0 && $products_max >= -1){ $woocommerce->session->jc_product_per_page = $products_max; return $products_max; } } // load product limit from session if(isset($woocommerce->session->jc_product_per_page)){ // set products per page from woo session $products_max = intval($woocommerce->session->jc_product_per_page); if($products_max != 0 && $products_max >= -1){ return $products_max; } } return $count; } add_filter('loop_shop_per_page','jc_get_products_per_page'); //set the options for the dropdown function jc_get_products_per_page_options(){ $options = apply_filters( 'jc_products_per_page', array( 5 => __('5', 'woocommerce'), 10 => __('10', 'woocommerce'), 15 => __('15', 'woocommerce'), 20 => __('20', 'woocommerce') )); return $options; } //display the dropdown on front-end function jc_woocommerce_products_per_page(){ $options = jc_get_products_per_page_options(); $current_value = jc_get_products_per_page(); ?> <div class="products-per-page"> <span>View:</span> <form action="" method="POST" class="woocommerce-products-per-page"> <select name="jc-woocommerce-products-per-page" onchange="this.form.submit()"> <?php foreach($options as $value => $name): ?> <option value="<?php echo $value; ?>" <?php selected($value, $current_value); ?>><?php echo $name; ?></option> <?php endforeach; ?> </select> </form> </div> <?php } add_action('woocommerce_after_shop_loop', 'jc_woocommerce_products_per_page', 1); ,但仍然无法正常工作。所以,似乎return 2;没有工作

3 个答案:

答案 0 :(得分:2)

我从您的初始帖子中抓取您的代码并将其放入我为WooCommerce开发的主题中,它就像一个魅力。

显然,那不是你的情况。但是这让我相信在你的代码被调用之后,其他东西也可能会挂钩loop_shop_per_page过滤器。

在重构所有代码之前,请尝试将add_filter的优先级设置为高位,例如:

add_filter('loop_shop_per_page','jc_get_products_per_page', 99);

这应该有助于确定过滤器被另一个插件或主题中的其他位置调用的过滤器覆盖是否存在问题。

答案 1 :(得分:0)

好的,我已经完全改变了我的答案并测试了解决方案,所以它应该可以工作,唯一的问题是分页是完全有效的,但如果有人可以改进我的答案那就好了。

查看woocommerce文档然而,您应该过滤$cols变量才能使其正常工作。道歉我无法确切地说出你在上面用你的代码做了什么,所以我从头开始重写脚本 - 但我想如果你刚用$cols那么你可能自己就到了那里。< / p>

这是新代码:

    add_filter( 'loop_shop_per_page', 'new_loop_shop_per_page', 20 );
    add_action('woocommerce_after_shop_loop', 'new_loop_shop_per_page', 1);
    add_action( 'woocommerce_product_query', 'mywoocommerce_products_per_page', 1, 50 );



    function new_loop_shop_per_page( $cols ) {

        session_start();
        $default = "5";
        $cols = $default;
        $submittedValue = "";
       // global $submittedvalue;
        $value0 = "5";
        $value1 = "10";
        $value2 = "15";
        $value3 = "20";

        if (isset($_POST["ProductsPerPage"])) {

         $_SESSION['ProductsPerPage'] = $_POST['ProductsPerPage'];
         $submittedvalue = $_SESSION['ProductsPerPage'];

        }

        ?>
        <form action="" name="products" method="post">
        <select project="ProductsPerPage" id="ProductsPerPage" name="ProductsPerPage">
         <option value = "<?php echo $value0; ?>"<?php echo ($value0 == $submittedvalue)?" SELECTED":""?>><?php echo $value0; ?></option>
         <option value = "<?php echo $value1; ?>"<?php echo ($value0 == $submittedvalue)?" SELECTED":""?>><?php echo $value1; ?></option>
         <option value = "<?php echo $value2; ?>"<?php echo ($value0 == $submittedvalue)?" SELECTED":""?>><?php echo $value2; ?></option>
         <option value = "<?php echo $value3; ?>"<?php echo ($value0 == $submittedvalue)?" SELECTED":""?>><?php echo $value3; ?></option>
        </select>
        <input type="submit" name="submit" id="submit" value="Submit" />

        </form>


      <?php
      global $submittedvalue;
      $cols = $submittedValue;
      return $cols;

      }


function mywoocommerce_products_per_page( $query ) {
    if ( $query->is_main_query() ) {
         session_start();
         global $submittedvalue;
         //$submittedvalue = '5';
         $_SESSION['ProductsPerPage'] = $_POST['ProductsPerPage'];
         $submittedvalue = $_SESSION['ProductsPerPage'];
         $query->set( 'posts_per_page', $submittedvalue );

    }
}

add_filter( 'redirect_canonical', 'custom_disable_redirect_canonical' );
function custom_disable_redirect_canonical( $redirect_url ) {
    if ( is_paged() && is_singular() ) $redirect_url = false; 
    return $redirect_url; 
}

如果有人可以帮助让分页工作,那将会有所帮助。

答案 2 :(得分:0)

尝试使用类似的方式更改jc_get_products_per_page()功能。

    function() jc_get_products_max($ppp=5) {
        if(!empty($ppp)) {
            $ppp = (int)$ppp;
            if($ppp != 0 && $ppp >= -1){
                return $ppp;
            }
        }           
    }
    function jc_get_products_per_page(){    
        global $woocommerce; 
        $count = jc_get_products_max();  
        $options = jc_get_products_per_page_options();
        if(isset($_POST['jc-woocommerce-products-per-page'])){ 
                $count = jc_get_products_max($_POST['jc-woocommerce-products-per-page']);
        } else {
            if(isset($woocommerce->session->jc_product_per_page)){
                    $count = jc_get_products_max($woocommerce->session->jc_product_per_page);
            }
        }
        $woocommerce->session->jc_product_per_page = $count;
        return $count;
    }