问题在于循环:
foreach ( $hadices as $post ) : setup_postdata( $post );
if ( have_posts()) : while (have_posts()) : the_post();
setup_postdata( $post ); ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_content(); ?>
<?php endwhile;
endif;
endforeach;
wp_reset_postdata();
如果我们修复缩进并正确设置格式,我们会得到:
foreach ( $hadices as $post ) {
setup_postdata( $post );
if ( have_posts()) {
while (have_posts()) {
the_post();
setup_postdata( $post );
?>
<h2>
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</h2>
<?php
the_content();
}
}
}
wp_reset_postdata();
现在让我们把它写成伪代码/简单的英语:
for each hadices post
Set the current post
if the main query has posts
for each post in the main query
Set the current post as the post from the main query
Set the current post as the current post
output the post
After the loop, reset the post data
我们可以看到,出于某种原因,有2个post循环,当前post设置了3次。最重要的是,代码使用
$post
它是全局变量的名称。
因此,让我们将其改写为标准WP_Query
回路:
$q = new WP_Query([
\'post_type\' => \'hadices\',
\'orderby\' => \'rand\',
\'posts_per_page\' => 1,
]);
if ( $q->have_posts() ) {
while( $q->have_posts() ) {
$q->the_post();
// output the post
}
wp_reset_postdata();
} else {
echo \'<p>None were found</p>\';
}
备注:
the_post
呼叫setup_postdata
在内部,您不必再次调用它get_posts
呼叫WP_Query
在内部,去掉中间人,直接WP_Query
WP_Query
利用缓存机制,使其速度更快posts_per_page
需要一个数字,不必用引号括起来,1
可以,不必"1"
缩进缩进缩进!您的编辑器应该为您缩进,因此ti应该毫不费力。如果您想要一个免费的程序,请使用SublimitText或Atom等编辑器,或者选择更高级的IDE,如PHPStorm。所有3个包都有只需按一个按钮即可重新格式化整个文件的包。不要使用<?php ?>
垃圾邮件,此:echo \'<br/>\';
与相同?><?php echo \'<br/>\';?><?php
但是更容易阅读您的原始代码从未检查是否找到任何帖子wp_reset_postdata
在if语句中调用您的帖子类型以复数形式命名,hadices
, 但从技术上来说应该是hadice
, 或者我猜hadith
, 您可以通过更改注册帖子类型时使用的URLrewrite
选项改善性能rand
它不仅速度慢,而且是您可以要求服务器执行的最慢的操作之一。一些实现将使用随机排序的相同数据创建一个全新的表,然后对新表执行查询,然后将其销毁,这对于大量帖子来说变得非常缓慢。因此,让我们在PHP中执行随机部分,即计划:
请从数据库中获取一篇帖子,找出要从PHP中选择的帖子。首先,让我们计算出有多少篇帖子hadices
那里的帖子正在使用wp_count_posts
:
$counts = wp_count_posts( \'hadices\', false );
然后,让我们生成一个介于0和最大帖子数之间的数字:$counts = wp_count_posts( \'hadices\', false );
$offset = mt_rand( 1, $counts->publish );
然后,让我们告诉它使用我们生成的数字作为偏移量,所以如果偏移量是12,那么我们需要12hadices
波斯特,如果号码是212,我们要212hadices
邮递因此,让我们将其插入到改进的查询中,通过使用偏移量来请求页面,并且每页有1篇文章:
$q = new WP_Query([
\'post_type\' => \'hadices\',
\'posts_per_page\' => 1,
\'page\' => $offset,
]);