带有几个帖子的第一个归档页面

时间:2022-01-25 作者:Alex Osipov

我正在寻找一种方法,如何在档案的第一页上只显示几篇文章。这是我的存档模板-page-archive.php, 我使用它作为模板来显示我的所有帖子/食谱:

<?php
get_header(\'archive\');  ?>

<div id="primary" class="content-area blog-archive col-md-9">
  <main id="main" class="site-main">
    <div class="breadcrumbs-block"><?php
    if ( function_exists(\'yoast_breadcrumb\') ) {
      yoast_breadcrumb( \'<p id="breadcrumbs">\',\'</p>\' );
    }
    ?>
      </div>
    <?php query_posts(\'post_type=post&post_status=publish&posts_per_page=24&paged=\'. get_query_var(\'paged\')); ?>
       <?php if( have_posts() ): ?>
<div class="row all-recipes-block">
        <?php while( have_posts() ): the_post(); ?>
          <article id="post-<?php the_ID(); ?>" <?php post_class(\'col-md-4\'); ?>>
            <?php if ( has_post_thumbnail() ) : ?>
              <a class="post-teaser" href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
                <div class="thumbnail-block"><?php the_post_thumbnail(\'regular-post-thumbnail\'); ?></div>
                <div class="title-block"><span class="h3 title-for-widget"><?php the_title(); ?></span></div>
              </a>
            <?php endif; ?>
          </article>
        <?php endwhile; ?>
      </div>
      <div class="pagination-block row">
              <?php numeric_posts_nav(); ?>
      </div>
         <?php else: ?>
      <div id="post-404" class="noposts">
            <p><?php _e(\'None found.\',\'example\'); ?></p>
      </div><!-- /#post-404 -->
     <?php endif; wp_reset_query(); ?>
  </main>
</div>
<?php
get_footer();
目前我每页有24篇帖子和分页,我希望在第一页上只显示12篇帖子!

这是我的帖子导航功能:

// numeric posts navigation

function numeric_posts_nav() {

    if( is_singular() )
        return;

    global $wp_query;

    /** Stop execution if there\'s only 1 page */
    if( $wp_query->max_num_pages <= 1 )
        return;

    $paged = get_query_var( \'paged\' ) ? absint( get_query_var( \'paged\' ) ) : 1;
    $max   = intval( $wp_query->max_num_pages );

    /** Add current page to the array */
    if ( $paged >= 1 )
        $links[] = $paged;

    /** Add the pages around the current page to the array */
    if ( $paged >= 3 ) {
        $links[] = $paged - 1;
        $links[] = $paged - 2;
    }

    if ( ( $paged + 2 ) <= $max ) {
        $links[] = $paged + 2;
        $links[] = $paged + 1;
    }

    echo \'<div class="pagination-navigation col-md-12"><ul class="d-flex justify-content-center">\' . "\\n";
请帮忙!

提前感谢您!

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

这是我的存档模板-page-archive.php, 我正在使用asa模板显示我的所有帖子/食谱

所以如果你用的是Page (post of the page type) 具有自定义/特定Page Template, 那你应该create a secondary query and loop 用于检索和显示您的食谱/帖子。

但即使使用默认的归档模板,如archive.php 文件,您应该not使用query_posts() 在模板中!

原因如下:(我添加了粗体和斜体格式)

此功能将completely override the main query and isn’t intended for use by plugins or themes. 它修改主查询的过于简单的方法可能会有问题,应该尽可能避免。在大多数情况下,有更好、性能更好的选项来修改主查询,例如通过‘pre_get_posts’内的操作WP_Query.

应该注意的是,使用它来替换页面上的主查询可能会增加页面加载时间,在最坏的情况下,所需工作量会增加一倍以上。该函数虽然易于使用,但以后也容易出现混淆和问题。有关详细信息,请参阅下面有关注意事项的说明。

-请参见https://developer.wordpress.org/reference/functions/query_posts/ 上述注意事项和其他细节。

下面是如何转换query_posts() 使用辅助查询的代码/WP_Query 而是循环:

更换<?php query_posts(\'post_type=post&post_status=publish&posts_per_page=24&paged=\'. get_query_var(\'paged\')); ?> 使用此选项:

<?php
// you could also do $query = new WP_Query( \'your args here\' ), but I thought
// using array is better or more readable :)
$query = new WP_Query( array(
    \'post_type\'      => \'post\',
    \'post_status\'    => \'publish\',
    \'posts_per_page\' => 24,
    \'paged\'          => get_query_var( \'paged\' ),
) );
?>
have_posts() 具有$query->have_posts(), and 这个the_post() 具有$query->the_post(). 一、 e.使用$query 上面创建的变量。

最后,更换wp_reset_query() 具有wp_reset_postdata().

Now, as for displaying only a few posts on the first page, i.e. different than your posts_per_page value..

正确的解决方案是use an offset, 像这样:

将上述步骤1中的代码段替换为以下代码段,或使用以下代码段代替该代码段:

<?php
// Define the number of posts per page.
$per_page  = 12; // for the 1st page
$per_page2 = 24; // for page 2, 3, etc.

// Get the current page number.
$paged     = max( 1, get_query_var( \'paged\' ) );
// This is used as the posts_per_page value.
$per_page3 = ( $paged > 1 ) ? $per_page2 : $per_page;

// Calculate the offset.
$offset = ( $paged - 1 ) * $per_page2;
$diff   = $per_page2 - $per_page;
$minus  = ( $paged > 1 ) ? $diff : 0;

$query = new WP_Query( array(
    \'post_type\'      => \'post\',
    \'post_status\'    => \'publish\',
    \'posts_per_page\' => $per_page3,
    \'offset\'         => $offset - $minus,
) );

// Recalculate the total number of pages.
$query->max_num_pages = ceil(
    ( $query->found_posts + $diff ) /
    max( $per_page, $per_page2 )
);
?>
<?php numeric_posts_nav(); ?> 具有<?php numeric_posts_nav( $query ); ?>.

编辑分页功能-更换此部件(第775-787行here):

function numeric_posts_nav() {

    if( is_singular() )
        return;

    global $wp_query;

    /** Stop execution if there\'s only 1 page */
    if( $wp_query->max_num_pages <= 1 )
        return;

    $paged = get_query_var( \'paged\' ) ? absint( get_query_var( \'paged\' ) ) : 1;
    $max   = intval( $wp_query->max_num_pages );
使用此选项:

function numeric_posts_nav( WP_Query $query = null ) {

    global $wp_query;

    if ( ! $query ) {
        $query =& $wp_query;
    }

    if( $query->is_singular() || $query->max_num_pages <= 1 ) {
        return;
    }

    $paged = get_query_var( \'paged\' ) ? absint( get_query_var( \'paged\' ) ) : 1;
    $max   = intval( $query->max_num_pages );
就这些,现在检查一下它是否适合您!:)

SO网友:tiago calado

假设您想保留html,可以将其放在函数中,并将此函数保存在函数中。php

function showPosts($postsToShow){
  if( have_posts() ): ?>
    <div class="row all-recipes-block"><?php
      $countPosts = 0;
      while( have_posts() && $countPosts < $postsToShow): the_post(); ?>
        <article id="post-<?php the_ID(); ?>" <?php post_class(\'col-md-4\'); ?>> <?php
          if ( has_post_thumbnail() ) : ?>
            <a class="post-teaser" href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
            <div class="thumbnail-block"><?php the_post_thumbnail(\'regular-post-thumbnail\'); ?></div>
            <div class="title-block"><span class="h3 title-for-widget"><?php the_title(); ?></span></div>
            </a> <?php
          endif; ?>
        </article> <?php
      $countPosts += 1;
      endwhile; ?>
    </div>
    <div class="pagination-block row">
            <?php numeric_posts_nav(); ?>
    </div>
       <?php else: ?>
    <div id="post-404" class="noposts">
          <p><?php _e(\'None found.\',\'example\'); ?></p>
    </div><!-- /#post-404 --><?php 
  endif; wp_reset_query();
}
现在您只需要调用这个函数showPosts(6);在你的首页,这意味着你的html是这样的

get_header(\'archive\');  ?>
<div id="primary" class="content-area blog-archive col-md-9">
  <main id="main" class="site-main">
    <div class="breadcrumbs-block"><?php
    if ( function_exists(\'yoast_breadcrumb\') ) {
      yoast_breadcrumb( \'<p id="breadcrumbs">\',\'</p>\' );
    }
    ?>
      </div>
    <?php query_posts(\'post_type=post&post_status=publish&posts_per_page=24&paged=\'. get_query_var(\'paged\')); ?>
    <?php showPosts(6); ?>
  </main>
</div>
<?php
get_footer();
让我知道!

现在请注意,这不是头版,而是存档。php,所以如果仍然没有给出期望的结果,那是因为存档。php负责按类别、标记或年或月进行帖子循环。因此,如果仍然不起作用,请删除上述更改,奇怪的是,请不要将下面的代码复制并粘贴到索引中。php

$postsToShow = 6;
get_header(\'archive\');  ?>
<div id="primary" class="content-area blog-archive col-md-9">
  <main id="main" class="site-main">
    <div class="breadcrumbs-block"><?php
    if ( function_exists(\'yoast_breadcrumb\') ) {
      yoast_breadcrumb( \'<p id="breadcrumbs">\',\'</p>\' );
    }
    ?>
      </div>
    <?php query_posts(\'post_type=post&post_status=publish&posts_per_page=24&paged=\'. get_query_var(\'paged\')); ?>
       <?php if( have_posts() ): ?>
<div class="row all-recipes-block"><?php
        $countPosts = 0;
        while( have_posts() && $countPosts < $postsToShow): the_post(); ?>
          <article id="post-<?php the_ID(); ?>" <?php post_class(\'col-md-4\'); ?>> <?php
          if ( has_post_thumbnail() ) : ?>
            <a class="post-teaser" href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
            <div class="thumbnail-block"><?php the_post_thumbnail(\'regular-post-thumbnail\'); ?></div>
            <div class="title-block"><span class="h3 title-for-widget"><?php the_title(); ?></span></div>
            </a> <?php
          endif; ?>
          </article> <?php
          $countPosts += 1;
        endwhile; ?>
      </div>
      <div class="pagination-block row">
              <?php numeric_posts_nav(); ?>
      </div>
         <?php else: ?>
      <div id="post-404" class="noposts">
            <p><?php _e(\'None found.\',\'example\'); ?></p>
      </div><!-- /#post-404 -->
     <?php endif; wp_reset_query(); ?>
  </main>
</div>
<?php
get_footer();
现在应该很有魅力了!

我正在创建一个包含页面、商店和博客的网站,为了实现你正在做的同样的事情,这是我发现的树,我似乎没有在互联网或wp库中找到它。开始了

#### posts files ####
all the articles    index.php
single article      single.php
all the articles with some query(year, month, tag, category...) archive.php
在索引中这样做似乎很奇怪。php和single。php,但这是我的工作方式。

相关推荐

ACF Taxonomy in Loop

你好吗我的问题是,我在头版上显示了一些卡片,例如名称和描述,这些信息来自我的分类法event,因为我用ACF创建了一些字段,我想在卡片中打印它们,但我不知道怎么做。下面是我如何打印卡片的代码 <?php if(is_front_page()): $terms = get_terms( [ \'taxonomy\' => \'evento\', \'hide_empty\' =>