首页 > 解决方案 > 为什么相同的 WordPress 功能在一个站点上运行而不在另一个站点上运行?

问题描述

好的,我有一个使用自定义主题的 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),并且在他的网站上,当您询问最近的三个帖子时,它实际上显示了六个。(现在他的网站上只有七个帖子。)

经过一番挖掘,我发现:

  1. 如果您要求四个帖子,它显示七个。
  2. 如果您要求三个帖子,则显示为六个。
  3. 如果您要求两个帖子,它显示五个。
  4. 如果您要求一个帖子,它会显示四个。
  5. 如果您要求零个帖子,它仍然显示六个。

就好像它向您传递给函数的参数添加了三个。

需要注意的是,上述功能在两个站点上是相同的。

进一步挖掘,我发现这是上述函数生成的 MySQL 调用:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 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。

当我这样做并刷新页面时,侧边栏中只显示了三个帖子,正如预期的那样。

MySQL 对此的调用如下:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date ASC LIMIT 0, 3

我现在迷路了——我完全不知道为什么:

  1. 此功能适用于我的网站(以及我帮助网站所有者设置相同 WordPress 主题的其他一些网站。

  2. 为什么它不适用于我朋友的网站,帖子按降序排列,但对帖子按升序排列。

  3. 为什么它似乎采用短代码参数中请求的帖子数量并添加三个。

有人对下一步看哪里有任何指示吗?

标签: wordpress

解决方案


推荐阅读