
当开发者在WordPress和WooCommerce环境中构建自定义模板(例如,用于展示用户订单历史或可下载产品)时,经常会遇到分页功能失效的问题。具体表现为:用户点击分页链接(如“第2页”)后,URL虽然正确地更新了(例如从mywebsite.com/account/downloads变为mywebsite.com/account/downloads/2),但页面显示的内容却依然是第一页的数据。
这通常发生在自定义循环(Custom Loop)中,特别是当使用wc_get_orders等WooCommerce特有的查询函数时。默认的WordPress分页机制(依赖get_query_var('paged'))可能无法在所有自定义URL结构或Endpoint下正确识别页码。问题的核心在于:
解决此问题的关键在于两步:首先,采用更可靠的方法从URL中获取当前页码;其次,确保paginate_links函数生成的链接格式与新的页码获取机制相匹配。
在许多情况下,get_query_var('paged')可能无法在自定义的WooCommerce Endpoint或重写规则下正确工作。一个更健壮的方法是直接从$_GET请求中获取自定义的页码参数,并进行适当的过滤。
我们将$current_page(或$paged)变量的定义从:
$current_page = ( get_query_var('paged') ) ? get_query_var('paged') : 1;修改为:
$paged = max( 1, (int) filter_input( INPUT_GET, 'pagina' ) );
解释:
为了让paginate_links函数生成与我们新的页码获取方式兼容的URL,我们需要调整其format参数。
在paginate_links的参数数组中,将format值从:
'format' => '%#%', // 或者其他不带查询参数的格式
修改为:
'format' => '?pagina=%#%',
解释:
以下是经过修正后的WooCommerce自定义订单(或下载)模板代码,其中包含了上述两项关键改动:
<?php
?><div class="orders-container"><?php
defined( 'ABSPATH' ) || exit;
// 确保下载产品存在,此处为示例,可根据实际需求调整
$downloads = WC()->customer->get_downloadable_products();
$has_downloads = (bool) $downloads;
do_action( 'woocommerce_before_account_downloads', $has_downloads );
if ( $has_downloads ) {
?>
<table class="table_orders heading">
<tr>
<td class="product_number">Ordine</td>
<td class="product_name">Prodotto</td>
<td class="product_data">Data</td>
<td class="product_price">Totale</td>
<td class="product_status">Stato</td>
<td class="product_action">File</td>
</tr>
</table>
<?php
$order_statuses = array('wc-completed');
// 步骤一:使用 filter_input 获取当前页码
$paged = max( 1, (int) filter_input( INPUT_GET, 'pagina' ) );
$args = apply_filters('woocommerce_my_account_my_orders_query',array(
'customer_id' => get_current_user_id(),
'post_status' => $order_statuses,
'paged' => $paged,
'posts_per_page' => 3, // 每页显示订单数量
'paginate' => true,
));
$customer_orders = wc_get_orders( $args );
// 遍历订单并显示内容
foreach($customer_orders->orders as $order) {
$orders_id = $order->get_id();
$status = wc_get_order_status_name( $order->get_status() );
$date_created = $order->get_date_created()->date('d/m/Y');
$order_total = $order->get_formatted_order_total();
$view_order = $order->get_view_order_url();
foreach($order->get_items() as $item_id => $item) {
$product_name = $item->get_name();
echo '
<table class="table_orders">
<tr class="table_row_items">
<td class="product_number">
<span class="mobile title">Ordine</span>
<span>#'. esc_attr($orders_id) .'</span>
</td>
<td class="product_name">
<span class="mobile title">Prodotto</span>
<a href="'. wp_kses_post($view_order) .'">'. wp_kses_post($product_name) .'</a>
</td>
<td class="product_data">
<span class="mobile title">Data</span>
<span>'. wp_kses_post($date_created) .'</span>
</td>
<td class="product_price">
<span class="mobile title">Prezzo</span>
<span>'. wp_kses_post($order_total) .'</span>
</td>
<td class="product_status">
<span class="mobile title">Stato</span>
<span class="label ' . $order->get_status() . '">'. wp_kses_post($status) .'</span>
</td>
<td class="product_action">
<span class="mobile title">File</span>
<a target=”_blank” href="'. esc_url($view_order) .'">Visualizza<i class="fa-duotone fa-eye"></i></a>
</td>
</tr>
</table>
';
}
}
// 分页按钮 - 负责订单历史的分页按钮和页码
?><div class="container-pagination"><?php
$args = array(
'base' => esc_url( wc_get_endpoint_url( 'libreria') ) . '%_%', // 替换 'libreria' 为你的自定义Endpoint
// 步骤二:修改 format 参数以匹配新的页码获取方式
'format' => '?pagina=%#%',
'total' => $customer_orders->max_num_pages,
'current' => $paged,
'show_all' => false,
'end_size' => 3,
'mid_size' => 3,
'prev_next' => true,
'prev_text' => __('<i class="fa-regular fa-angle-left"></i><span>Indietro</span>'),
'next_text' => __('<span>Avanti</span><i class="fa-regular fa-angle-right"></i>'),
'type' => 'plain',
'add_args' => false,
'add_fragment' => ''
);
echo paginate_links($args);
?></div><?php
} else {
?><div class="msg_orders">La tua cronologia ordini è vuota!</div><?php
}
do_action( 'woocommerce_after_account_downloads', $has_downloads );
?></div>通过将页码的获取方式从get_query_var('paged')更改为filter_input(INPUT_GET, 'pagina'),并相应地调整paginate_links函数的format参数为?pagina=%#%,可以有效地解决WooCommerce自定义模板中分页链接点击后内容重复加载的问题。这一方法确保了自定义查询能够正确识别和响应URL中的页码参数,从而实现流畅且功能完善的分页体验。
以上就是解决WooCommerce自定义模板分页内容重复加载问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号