我在Wordpress/Woocommerce网站上的functions.php
文件中组装了一些自定义代码。代码最初来源于此:向wooccommerce添加每页产品下拉列表。
我的代码旨在将每页产品(PPP(下拉框添加到包含多个分页产品页面的任何存档页面中
我面临的问题可以使用以下场景来突出显示:
- 一个理论档案页面包含100个产品
- PPP功能允许显示"12"、"24"、"36"或"所有"产品
- 默认设置为每页显示"12"个产品
- 如果导航到此档案的第6页,则一切正常(6 x 12=72[小于100](
- 如果您现在将下拉列表更改为"36",因为第6页(6 x 36=216[大于100](由于缺少产品而不存在,则会显示404错误
当前代码可在此处找到:
add_action( 'woocommerce_before_shop_loop', 'UmbrellaTrading_products_per_page_archive_dropdown', 25 );
add_action( 'woocommerce_after_shop_loop', 'UmbrellaTrading_products_per_page_archive_dropdown', 25 );
function UmbrellaTrading_products_per_page_archive_dropdown() {
$per_page = filter_input(INPUT_GET, 'perpage', FILTER_SANITIZE_NUMBER_INT);
echo '<div class="utwc-perpage">';
echo '<select onchange="if (this.value) window.location.href=this.value">';
$orderby_options = array(
'12' => '12',
'24' => '24',
'36' => '36',
'-1' => 'All'
);
foreach( $orderby_options as $value => $label ) {
echo "<option ".selected( $per_page, $value )." value='?perpage=$value'>$label</option>";
}
echo '</select>';
echo '</div>';
}
add_action( 'pre_get_posts', 'UmbrellaTrading_products_per_page_archive_dropdown_pre_query' );
function UmbrellaTrading_products_per_page_archive_dropdown_pre_query( $query ) {
$per_page = filter_input(INPUT_GET, 'perpage', FILTER_SANITIZE_NUMBER_INT);
if( $query->is_main_query() && !is_admin() && is_post_type_archive( 'product' ) || is_product_category() || is_product_tag() ) {
$query->set( 'posts_per_page', $per_page );
}
}
这个问题似乎是URL结构的结果。它最初不影响URL:
https://umbrellatrading.co.uk/shop
当触发分页时,它也保持URL不变:
https://umbrellatrading.co.uk/shop/page/3
这就是问题出现的地方;因为URL当前在分页后添加PPP代码,所以当为不存在的页面生成PPP URL时,代码中没有任何内容可以阻止这一点,因此会出现404。
https://umbrellatrading.co.uk/shop/page/3?perpage=24
为了让代码正确无误地工作,我认为应该设置正确的URL行为(如下所示(,始终重定向到引用URL的分页结果的第一页,即如果您在存档结果页面的第3页上,通过从前端的下拉列表中选择来触发PPP代码,您应该重定向到相同存档级别的第1页,只使用修改后的PPP。因此,URL应该是这样的。
https://umbrellatrading.co.uk/shop?perpage=24
我的问题是:如何从代码中删除URL的分页部分(上例中为">/page/3"(,但仍将PPP查询添加到末尾
协助;我可以在代码echo '<select onchange="if (this.value) window.location.href=this.value">';
中看到完整的URL,但我不确定如何将其分割并重新配置以显示正确的URL结构
您需要更改select
标记上的onchange
事件,以便不仅添加perpage
参数,还删除URL:中的/page/X
部分
echo '<select onchange="if(this.value) window.location.href=window.location.pathname.replace(/\/page\/\d+$/,'')+'?'+this.value">';
在这里,我使用了//page/d+$/
正则表达式来删除当前路径末尾的分页(当包含在PHP字符串中时转义(