我为 WordPress 商店创建了自己的过滤器。过滤产品后,找到的产品将通过 Ajax 和新的 WP_Query 显示。过滤器显示为 URL 中的参数并通过 POST 传递。
到目前为止,一切正常,但“do_action('woocommerce_after_shop_loop');”不起作用,并且没有分页输出。
我的具体问题:如何在Ajax调用中输出分页?
使用过滤器时会调用此函数:
function load_trailers(){
var newParams = window.location.search;
if (currentParams !== newParams){
currentParams = newParams;
jQuery('.products-wrapper').addClass('loading');
jQuery.ajax({
url: wpAjax.ajax_url,
data: {
action: 'trailer', parameter: newParams, query: wpAjax.query,
},
type: 'post',
}).done(function(data){
jQuery('.woocommerce-archive-wrapper').empty();
jQuery('.woocommerce-archive-wrapper').append(data);
jQuery('.products-wrapper').removeClass('loading');
});
}
}
此函数加载 WP_Query 并传输产品:
add_action( 'wp_ajax_trailer', 'trailersuche' );
add_action( 'wp_ajax_nopriv_trailer', 'trailersuche' );
function trailersuche(){
$meta_query = $_POST['query'];
$parameters = $_POST['parameter'];
$parameters = str_replace('?', '', explode('&', $parameters));
// Write meta_query ...... $meta_query['meta_query'][]
echo '<div class="woocommerce-notices-wrapper"></div>';
$loop = new WP_Query($meta_query);
echo '<p class="woocommerce-result-count">' . $loop->found_posts . ' Produkte</p>';
do_action('woocommerce_before_shop_loop');
woocommerce_product_loop_start();
while ($loop->have_posts()) {
$loop->the_post();
wc_get_template_part( 'content', 'product' );
}
woocommerce_product_loop_end();
do_action( 'woocommerce_after_shop_loop' );
die();
}
要在您的 Ajax 调用中启用分页,您需要对代码进行一些修改。主要思想是从 URL 参数 捕获当前页面并将其传递给 WP_Query。此外,您需要在 Ajax 响应中返回分页 HTML。
让我们相应地修改您的 load_trailers 函数和 Trailersuche 函数:
load_trailers 函数:
function load_trailers() {
var newParams = window.location.search;
if (currentParams !== newParams) {
currentParams = newParams;
jQuery('.products-wrapper').addClass('loading');
jQuery.ajax({
url: wpAjax.ajax_url,
data: {
action: 'trailer',
parameter: newParams,
query: wpAjax.query,
page: getCurrentPageNumber(), // Add the current page number to the Ajax request
},
type: 'post',
}).done(function (data) {
jQuery('.woocommerce-archive-wrapper').empty();
jQuery('.woocommerce-archive-wrapper').append(data.content); // Use 'content' key from the Ajax response
jQuery('.products-wrapper').removeClass('loading');
jQuery('.pagination').html(data.pagination); // Add this line to update the pagination
});
}
}
// Helper function to get the current page number from the URL
function getCurrentPageNumber() {
var urlParams = new URLSearchParams(window.location.search);
return urlParams.get('page') || '1';
}
预告片功能:
add_action('wp_ajax_trailer', 'trailersuche');
add_action('wp_ajax_nopriv_trailer', 'trailersuche');
function trailersuche()
{
$meta_query = $_POST['query'];
$parameters = $_POST['parameter'];
$parameters = str_replace('?', '', explode('&', $parameters));
// Extract page number from the Ajax request
$paged = isset($_POST['page']) ? $_POST['page'] : 1;
// Add 'paged' parameter to the WP_Query
$meta_query['paged'] = $paged;
echo '<div class="woocommerce-notices-wrapper"></div>';
$loop = new WP_Query($meta_query);
ob_start();
echo '<p class="woocommerce-result-count">' . $loop->found_posts . ' Produkte</p>';
do_action('woocommerce_before_shop_loop');
woocommerce_product_loop_start();
while ($loop->have_posts()) {
$loop->the_post();
wc_get_template_part('content', 'product');
}
woocommerce_product_loop_end();
do_action('woocommerce_after_shop_loop');
$content = ob_get_clean();
// Return the content and pagination HTML
$response = array(
'content' => $content,
'pagination' => get_the_posts_pagination(array('query' => $loop)),
);
wp_send_json($response);
}
这些更改应该可以在您的 Ajax 加载产品中启用分页。确保您有一个带有“pagination”类的分页容器,您希望在其中显示分页链接。