这里有一个想法:
定义:每页帖子:PPP
自定义帖子类型:Y
主要查询职位类型:X
多少Y
每次要注入的帖子:y
多少X
注入前要显示的帖子Y
职位:x
公式:
我们将使用:
PPP(Y) = y * floor( ( PPP(X) -1 ) / x )
在哪里
PPP(X)
,
x
和
y
是积极的。
示例:
设置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_post
和
posts_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
环分页似乎也很有效。
这可以进一步细化,但希望这是您的起点。