根据带有加载更多按钮的自定义查询获取 WordPress 帖子

Posted

技术标签:

【中文标题】根据带有加载更多按钮的自定义查询获取 WordPress 帖子【英文标题】:Fetch WordPress Posts according to custom query with load more button 【发布时间】:2021-12-09 22:21:17 【问题描述】:

我在页面上有一个 2 行(3-3 列)的部分。所以在前 5 个帖子中显示,其中一个是广告图片。

所以在第一行,显示 2 个帖子,然后显示广告图片。在第二行显示了 3 个帖子

我的代码是-

$args = array(  
           'post_type' => 'products',
           'post_status' => 'publish',
           'posts_per_page' => 5,
           'orderby' => 'ID',
           'order' => 'DESC',
        );
  $posts = new WP_Query( $args );

因此,从这段代码中,我展示了 5 个帖子和 1 个广告图片,并且运行良好。

但是当我点击加载更多按钮时,我需要每次获取 6 个帖子,因此将添加 2 行(连续 3 个帖子)。

JS代码是

var page = 2;
var ppp = 5;

jQuery("body").on("click", ".btnLoadMoreblog", function()
   var ajaxUrl = document.location.origin + '/';
   var ajaxurla = ajaxUrl + "wp-admin/admin-ajax.php";
   jQuery('.loading-image img').css('display', 'block');
   jQuery.post(ajaxurla, 
       action: "loadmoreblog",
       ppp: ppp,
       page: page,
   )
   .done(function (postsa) 
       jQuery('.viewmore-btn').before(postsa);
       page++;
   )
);

在动作中,这是代码

$ppp = $_POST["ppp"];
$page = $_POST["page"];
$args = array(  
       'post_type' => 'products',
       'post_status' => 'publish',
       'posts_per_page' => $ppp,
       'paged' => $page,
       'orderby' => 'ID',
       'order' => 'DESC',
    );
    $posts = new WP_Query( $args );

帖子获取正确,因为我在 ppp 变量中传递了 5,但问题是一列是空的。

我想在 ajax 加载时一次获取 6 个帖子。所以如果我通过 var ppp = 6;那么帖子没有正确获取。

【问题讨论】:

这是在加载更多点击之前 - awesomescreenshot.com/image/… 在加载更多点击之后。 awesomescreenshot.com/image/… 未正确获取意味着一开始我使用posts_per_page = 5,在ajax 中,如果我使用5,那么它显示一列是空的。如果我使用 6,那么它将从 7number 帖子中获取。就像我有这些帖子 p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 如果我使用 ppp = 6 那么在单击加载更多时它会从 p7 获取并跳过 p6 所以这是问题 你看到我的解决方案了吗?应该可以很好地解决您的问题。 【参考方案1】:

这就是我使用现有自定义 WP_Query() 将新帖子加载到同一页面的方式。

此方法也适用于修改 WP_Query() 的自定义 url 变量。

在下面提供的代码中查看我的 cmets。

这是带有循环和加载更多按钮的查询 php...

<?php 

// exclude post id's (default false)
$excludePosts = isset($_REQUEST['excludePosts']) ? $_REQUEST['excludePosts'] : false;

// posts per page and load more posts to add
$postsPerPage = 20;

// products query args
$args = [
  'post_type'      => 'products',
  'post_status'    => 'publish',
  'orderby'        => 'ID',
  'order'          => 'DESC',
  'posts_per_page' => $postsPerPage,

  // here is the trick, exclude current posts from query when using jQuery $.post()
  'post__not_in'   => $excludePosts
];

// products query
$products = new WP_Query($args);

?>

<?php // we need this, a parent container for products ?>
<div id="products_archive">

  <?php // if we have query results ?>
  <?php if( $products->have_posts() ): ?>

    <?php // loop our query results (products) ?>
    <?php while( $products->have_posts()): $products->the_post() ?>

      <?php // your product with a data-product attribute and ID as the value ?>
      <?php // we need data-product to find all the currently loaded product ID's ?>
      <article data-product="<?=get_the_id()?>">
        <?php the_title(); ?>
        <?php the_content(); ?>
      </article>

    <?php endwhile; ?>
    
    <?php // if we have more posts to load based on current query, then show button ?>
    <?php if( $products->max_num_pages > 1 ): ?>

      <button id="load_more_products">
        Load more products
      </button>

    <?php endif; ?>

  <?php // if we have no query results ?>
  <?php else: ?>

    Sorry no products found.
  
  <?php endif; ?>

</div>

<?php // we need this, to pass the posts per page value to external jQuery script ?>
<script>
  window.postsPerPage = '<?=$postsPerPage?>';
</script>

这是使用$.post()重新加载当前页面查询的jQuery脚本,不包括已经加载的产品。

// load more products button click event
$(document).on('click', '#load_more_products', function() 

  // our click button
  let $btn = $(this);

  // disable button (you can add spinner to button here too)
  $btn.prop('disabled', true);

  // set current products empty array
  let currentProducts = [];

  // loop thought trough all products in products in archive
  $('[data-product]', '#products_archive').each( function(key, elem) 

    // current product push elements to current products array
    currentProducts.push( $(elem).data('product') );

  );

  // re post current page running the query again
  $.post('', 

    // pass this data to our php var $excludePosts to modify the page WP_Query
    excludePosts: currentProducts

  // html param passed data is full html of our reloaded page
  , function(html) 

    // find all the product article elements via data-product attribute in html 
    let $newProducts = $('#products_archive [data-product]', html);

    // if new products length is less than our window.postsPerPage variable value
    if( $newProducts.length < postsPerPage ) 

      // then hide the load more button
      $btn.hide();

    

    // insert new products after last current data-product article
    $newProducts.insertAfter( $('[data-product]', '#products_archive').last() );

  )

  // once our new products have been inserted
  .done(function() 

    // do stuff here to lazy load images etc...

    // re-enable button (and stop button spinner if you have one)
    $btn.prop('disabled', false);

  );

);

根据您当前 HTML 的结构和新获取的产品 html 的放置/附加,您需要调整脚本以适应。

但是,如果您遵循我的代码 cmets,这应该会让您走上正轨。

祝你好运!

【讨论】:

以上是关于根据带有加载更多按钮的自定义查询获取 WordPress 帖子的主要内容,如果未能解决你的问题,请参考以下文章

带有 Onclick 的自定义按钮,隐藏 Onclick 事件

UITableView 仅加载在设备上可见的自定义单元格,并在添加更多单元格时崩溃

带有进度条的按钮 android

如何在 Swift 3 中加载/删除带有动画的自定义视图

根据 WooCommerce 中的自定义结帐单选按钮和文本字段设置动态费用

带有自定义后退导航按钮的自定义按钮栏