好的,我有一个使用自定义主题的WordPress网站。
此主题包含一个短代码,该短代码旨在在侧栏中的文本小部件中使用,并且该短代码显示最新的帖子。默认为最后三个,但是您可以根据需要使用参数进行更改。
这是处理短代码的功能:
function wp_widget_recent_posts( $atts ){
extract( shortcode_atts( array(
'count' => 3,
), $atts ));
ob_start();
$arg = array(
'post_type' => 'post',
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'date',
'posts_per_page' => $atts['count'],
);
$wp_query = new WP_Query($arg);
if ( $wp_query->have_posts() ) : ?>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<?php get_template_part( 'partials/posts-loop-item' ); ?>
<?php endwhile; ?>
<?php endif; wp_reset_query();
$result = ob_get_clean();
return $result;
}
add_shortcode( 'recent_posts', 'wp_widget_recent_posts' );
这一切都可以在我的网站上正常工作。
但是,我有一个朋友正在使用相同的主题(并在相同的PHP版本上运行相同的WordPress版本),并且在他的网站上,当您询问最近的三篇文章时,实际上显示了六篇。 。 (他的网站上目前只有七个帖子。)
经过一番挖掘,我发现:
好像在向函数传递的参数中添加了三个一样。
请注意,上述功能在两个站点上都是相同的。
进一步挖掘,我发现这是上述函数生成的MySQL调用:
从wp_posts中选择SQL_CALC_FOUND_ROWS wp_posts.ID,其中1 = 1 AND wp_posts.post_type ='post'AND(((wp_posts.post_status ='publish')))ORDER BY wp_posts.post_date DESC LIMIT 0,3
我以前从未见过SQL_CALC_FOUND_ROWS,但是由于它是由核心WordPress代码生成的(因为在主题代码中没有名为WP_Query的函数),我假设这都是正确的。
接下来我做的结果使我感到惊讶。
我想对上述功能进行一些小的更改,纯粹是确保使用了该功能的最新版本。 (我怀疑我对主题的functions.php文件所做的更改被忽略了。)
因此,我将Order参数从DESC更改为ASC。
当我这样做并刷新页面时,如预期的那样,只有3个帖子显示在侧栏中。
对此的MySQL调用如下:
从wp_posts中选择SQL_CALC_FOUND_ROWS wp_posts.ID,其中1 = 1 AND wp_posts.post_type ='post'AND(((wp_posts.post_status ='publish'))ORDER BY wp_posts.post_date ASC LIMIT 0,3
我现在迷路了-我完全不知道为什么:
此功能在我的网站(以及其他一些我已帮助网站所有者设置相同WordPress主题的网站)上有效。
为什么它在我朋友的站点上的帖子降序排列不起作用,但是对帖子的升序排列却起作用。
为什么要在shortcode参数中显示请求的帖子数,然后在其中添加三个。
有人知道下一步该怎么做吗?