尝试在产品列表中添加下拉列表,以更改显示的产品数量。我正在开发Wordpress (4.8.2)和Woocommerce (3.1.2)的最新版本。
这是我在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;,但仍然无法工作。所以,add_filter似乎不起作用
发布于 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);
这将有助于确定您的过滤器是否被相同的过滤器覆盖,是否在另一个插件或主题的其他地方调用。
发布于 2017-10-20 13:51:34
好的,我已经完全改变了我的答案,并且测试了解决方案,所以它应该是有效的,唯一的问题是分页是完全有效的,但是如果有人能改进我的答案,那就更好了。
然而,查看woocommerce文档,您应该过滤$cols变量以使其工作。抱歉,我不知道上面的代码到底在做什么,所以我从头重写了脚本--但是我认为如果您只是使用$cols,那么您很可能是自己编写的。
以下是新代码:
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;
}如果有人能帮助使分页工作,这将是有帮助的。
发布于 2017-10-20 14:00:48
尝试用这样的方法更改您的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;
}https://stackoverflow.com/questions/46652048
复制相似问题