首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用选择下拉菜单更改Woocommerce中显示的产品数量

使用选择下拉菜单更改Woocommerce中显示的产品数量
EN

Stack Overflow用户
提问于 2017-10-09 17:37:11
回答 3查看 2.2K关注 0票数 1

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

这是我在functions.php上的代码

代码语言:javascript
复制
//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;,但仍然无法工作。所以,add_filter似乎不起作用

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-24 16:54:59

我从最初的文章中抓取了您的代码,并将它放到了我为WooCommerce开发的主题中,它非常有魅力。

很明显那不是你的案子。但这使我相信,在调用代码之后,可能还会有其他东西链接到loop_shop_per_page过滤器中。

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

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

这将有助于确定您的过滤器是否被相同的过滤器覆盖,是否在另一个插件或主题的其他地方调用。

票数 2
EN

Stack Overflow用户

发布于 2017-10-20 13:51:34

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

然而,查看woocommerce文档,您应该过滤$cols变量以使其工作。抱歉,我不知道上面的代码到底在做什么,所以我从头重写了脚本--但是我认为如果您只是使用$cols,那么您很可能是自己编写的。

以下是新代码:

代码语言:javascript
复制
    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; 
}

如果有人能帮助使分页工作,这将是有帮助的。

票数 0
EN

Stack Overflow用户

发布于 2017-10-20 14:00:48

尝试用这样的方法更改您的jc_get_products_per_page()函数。

代码语言:javascript
复制
    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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46652048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档