如何在每X个普通帖子之后显示Y个自定义帖子数量?

时间:2014-04-17 作者:thedigitalmonk

我有一个循环中的一个循环。我知道了如何在Y个普通帖子之后显示所有或X个自定义帖子。我还了解了如何在每Y个普通帖子之后显示1个自定义帖子。如何在每Y个普通帖子之后显示X个自定义帖子。

简单地说。如何在每4篇博客帖子之后显示2篇book(自定义帖子类型)帖子?如何一次从循环中获取多个帖子?

这是在y普通帖子之后的x自定义帖子的逻辑。如何在每y个普通帖子之后获得x个自定义帖子?

main query // normal query
$k=0 // setting iterator
while have posts, the post

---post markup---


if($k == 4 or $k % 4 == 0) { // whether after x number or after every x number
second query // using WP_Query
while second query has posts, the posts

---custom post type markup // I NEED TO SHOW MORE THAN ONE HERE IF IT IS AFTER EVERY X blogposts

endwhile; //second query ends

}

$k++;
endwhile // main query

1 个回复
最合适的回答,由SO网友:birgire 整理而成

这里有一个想法:

定义:每页帖子:PPPY主要查询职位类型:XY 每次要注入的帖子:yX 注入前要显示的帖子Y 职位:x

公式:

我们将使用:

    PPP(Y) = y * floor( ( PPP(X) -1 ) / x )
在哪里PPP(X), xy 是积极的。

示例:

设置1:

PPP(X)=1, x=3, y=2, PPP(Y) = 2 * floor( (1-1)/3 ) = 2 * 0 = 0
Loop: X 
设置2:

PPP(X)=3, x=3, y=2, PPP(Y) = 2 * floor( (3-1)/3 ) = 2 * 0  = 0
Loop: XXX
设置3:

PPP(X)=4, x=3, y=2, PPP(Y) = 2 * floor( (4-1)/3 ) = 2 * 1  = 2
Loop: XXX YY X      
设置4:

PPP(X)=11, x=3, y=2, PPP(Y) = 2 * floor( (11-1)/3 )  = 2 * 3 = 6
Loop: XXX YY XXX YY XXX YY XX        
设置5:

PPP(X)=12, x=3, y=2, PPP(Y) = 2 * floor( (12-1)/3 ) = 2 * 3 = 6
Loop: XXX YY XXX YY XXX YY XXX      
设置6:

PPP(X)=13, x=3, y=2, PPP(Y) = 2 * floor( (13-1)/3 ) = 2 * 4 = 8 
Loop: XXX YY XXX YY XXX YY XXX YY X     
策略:让我们设法注入Y 发布到的循环中X 发布,无需直接修改模板文件。

我们想加入loop_start 职务类型主查询操作X, 和获取PPP(Y) 类型的职位Y.

然后我们要使用the_post 挂钩显示:

get_template_part( \'content\', \'y\' );
我们可以使用current_postposts_per_page 主管道的属性$wp_query 对象来控制注入逻辑。

我想打电话比较容易WP_Query() 对于每次注射,但让我们约束自己只调用它once 在主回路之前。

实现:

例如,在活动主题的目录中创建模板部件文件content-page.php, 包含:

<article>
    <header class="entry-header">
        <h2 class="entry-title"><?php the_title(); ?></h2>
    </header>
    <div class="entry-content">
        <?php the_content(); ?>
    </div>
</article>
然后,您可以尝试以下操作:

add_action( \'wp\', function(){

    // We want the injection only on the home page:
    if( ! is_home() ) return;

    // Start the injection:
    $inject = new WPSE_Inject( array( 
        \'items_before_each_inject\' => 3, 
        \'cpt_items_per_inject\'     => 2, 
        \'cpt\'                      => \'page\',
        \'template_part\'            => \'content-page\',
        \'paged\'                    => ( $pgd = get_query_var( \'paged\' ) ) ? $pgd : 1,       
    ) );
    $inject->init();
});
并根据您的需要进行修改。

这个WPSE_Inject 类别定义为:

/**
 * class WPSE_Inject
 *
 * Inject custom posts into the main loop, through hooks, 
 * with only a single WP_Query() call
 *
 * @link http://wordpress.stackexchange.com/a/141612/26350
 *
 * Definitions:
 *      Posts per page: PPP
 *      Custom post type: Y
 *      Main query post type: X
 *      How many Y posts to inject: y
 *      How many X posts to display before injecting the Y posts: x
 *
 * Formula:
 *      PPP(Y) = y * floor( ( PPP(X) -1 ) / x ) 
 *          where PPP(X), x and y are positive
 */

class WPSE_Inject
{   
    protected $results       = NULL;
    protected $query         = NULL;
    protected $nr            = 0;
    protected $inject_mode   = FALSE;
    protected $args          = array();

    public function __construct( $args = array() )
    {
        $defaults = array( 
            \'items_before_each_inject\' => 5, 
            \'cpt_items_per_inject\'     => 1, 
            \'cpt\'                      => \'post\', 
            \'paged\'                    => 1, 
            \'template_part\'            => \'content-post\'
        );
        $this->args = wp_parse_args( $args, $defaults );
    }

    public function init()
    {
        add_action( \'loop_start\', array( $this, \'loop_start\' ) );
        add_action( \'loop_end\',   array( $this, \'loop_end\'   ) );
    }

    public function cpt_items_on_this_page( WP_Query $query )
    {
        $count =  $this->args[\'cpt_items_per_inject\'] * floor( ( $query->get( \'posts_per_page\' ) -1 ) / $this->args[\'items_before_each_inject\'] );
        return ( $count > 0 ) ? $count : 1;
    }

    public function loop_start( WP_Query $query )
    {
        $this->query = $query;

        if( $query->is_main_query() )
        {               
            $args = array( 
                \'post_type\'        => $this->args[\'cpt\'], 
                \'posts_per_page\'   => $this->cpt_items_on_this_page( $query ), 
                \'paged\'            => $this->args[\'paged\'], 
                \'suppress_filters\' => TRUE, 
            );
            $this->results = new WP_Query( $args );
            add_action( \'the_post\', array( $this, \'the_post\' ) );
        }
    }

    public function loop_end( WP_Query $query )
    {
        if( $query->is_main_query() )
            remove_action( \'the_post\', array( $this, \'the_post\' ) );
    }

    public function the_post()
    {           
        if( ! $this->inject_mode        
            && 0 < $this->nr 
            && 0 === $this->nr % $this->args[\'items_before_each_inject\'] )
        {    
            $this->inject_mode = TRUE;          
            $this->results->rewind_posts();
            $this->results->current_post = ( absint( $this->nr / $this->args[\'items_before_each_inject\'] ) -1 ) * $this->args[\'cpt_items_per_inject\'] - 1;
            $j = 1;
            if ( $this->results->have_posts() ) :
                while ( $this->results->have_posts() ) :
                    $this->results->the_post();
                    get_template_part(  $this->args[\'template_part\'] );
                    if( $this->args[\'cpt_items_per_inject\'] < ++$j )
                        break;

                endwhile;
                wp_reset_postdata();
            endif;
            $this->inject_mode = FALSE;
        }

        if( ! $this->inject_mode )
            $this->nr++;

    }
}
我在默认主题上测试了这个,在这里我注入了page 主要内容post 环分页似乎也很有效。

这可以进一步细化,但希望这是您的起点。

结束

相关推荐

Query date in wordpress loop

我目前有一个名为“事件”的自定义帖子类型。我根据这里的教程创建了这个http://tatiyants.com/how-to-use-wordpress-custom-post-types-to-add-events-to-your-site/. 我想查询日期,只显示日期即将到来的帖子,而不是过去的帖子。$event_date >= time然而,在教程中,他使用一个短代码显示结果。我正在尝试将其转换为标准wp循环,以便在索引中显示它。php。他在其短代码函数中使用以下内容:add_shortcode