woocommerce_after_shop_loop

问题描述 投票:0回答:1

我为 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();
}
php ajax wordpress
1个回答
0
投票

要在您的 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”类的分页容器,您希望在其中显示分页链接。

© www.soinside.com 2019 - 2024. All rights reserved.