如何使用GET_POST和ACF减少查询次数?

时间:2020-01-08 作者:PhpDoe

在我的索引中。php文件,在经典的WordPress循环中,我必须查询帖子,以便检索那些具有通过自定义字段创建的关系值的帖子(使用ACF插件管理)。

我使用get\\u posts()函数和foreach循环实现了这一点。但是,由于我有300篇帖子,这会减慢页面加载时间。

因此,从这个角度来看,我正在寻找一种方法,使用不同的参数来减少get\\u posts()获取的帖子数量,或者减少查询的数量。但是,我使用的参数似乎正在增加查询的数量。

这是我正在努力改进的代码:

    <?php
    $artists = get_posts(array(
      \'post_type\'           => \'post\',
      \'numberposts\'         => \'1\',
      \'meta_query\'          => array(
            array(
              \'key\'       => \'relation\', // name of custom field
                \'value\'   => \'"\' . get_the_ID() . \'"\', // matches exactly "123", not just 123. This prevents a match for "1234"
                \'compare\' => \'LIKE\'
            )
      )
    ));

    ?>
    <?php if( $artists ) : ?>
      <?php foreach( $artists as $artist ) : ?>
        <p>
          <a href="<?php echo get_permalink( $artist->ID ); ?>"><?php echo get_the_title( $artist->ID ); ?></a>
        </p>
      <?php endforeach; ?>
    <?php endif; ?>
首先,我用的是paramater\'numberposts\' => \'1\', 而不是默认值\'numberposts\' => \'5\', 为了限制帖子数量和查询时间,但我没有看到任何改进,如果我使用“numberposts”=>“-1”(这并不限制帖子数量),查询数量会减少,加载时间也会减少。为什么?

然后,如果我使用这段代码而不是前一段代码,查询的数量会增加,但加载时间会减少:

<?php
    // trying to limit the number of posts targeting only the one with a specific relationship field
    $ids = get_field(\'relationship_field_name\', false, false);

    $artists = get_posts(array(
      \'post_type\'           => \'post\',
      \'numberposts\'         => \'1\',
      \'post__in\'            => $ids,
      )
    ));

    ?>
<?php if( $artists ) : ?>
  <?php foreach( $artists as $artist ) : ?>
    <p>
      <a href="<?php echo get_permalink( $artist->ID ); ?>"><?php echo get_the_title( $artist->ID ); ?></a>
    </p>
  <?php endforeach; ?>
<?php endif; ?>

EDIT :

我能够生成的最有效的代码是,仅616 queries and 0,4775s Database Query Time :

<?php
$ids = get_field(\'relation\', false, false);

$artists = get_posts(array(
  \'post_type\'     => \'post\',
  \'numberposts\'   => \'-1\',
  \'post__in\'      => $ids,
));

?>
<?php if( $artists ) : ?>
  <?php foreach( $artists as $artist ) : ?>
    <p>
      <a href="<?php echo get_permalink( $artist->ID ); ?>"><?php echo get_the_title( $artist->ID ); ?></a>
    </p>
  <?php endforeach; ?>
<?php endif; ?>
如果我将参数“numberposts”设置为1,或者如果我将其设置为默认值,我将获得1069 Queries and 0,7291s Database Query Time.

get\\u posts()缺少什么Im?如何优化代码的效率,减少查询数量和加载时间?

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

一切正常get_posts() 因为它创造了WP_Query 每次调用的实例数。您可以通过创建该实例来检查查询:

<?php
$test_query = new WP_Query(
    array(
        \'post_type\'      => \'post\',
        \'posts_per_page\' => -1, // any number, does not matter
        \'post__in\'       => $ids, // should be an array!
    )
);

echo $test_query->request;
正在添加\'meta_query\' 或其他参数将(不一定)增加查询的复杂性(因此也增加查询时间),但不会增加查询的数量。

没有足够的信息来找出为什么有这么多查询。

Adopted since OP\'s comment (稍后):

看见加载时间取决于查询的数量(第一个)及其复杂性(第二个)(或,否则,或两者兼而有之)。我不明白为什么你有这么多的查询,而我看不到你的循环中发生了什么while. 我认为你在循环中对300篇帖子中的每一篇都进行相同的查询。不要这样做get_posts() 在回路内部。如果您需要帖子之间的一些关系,请使用分类法,它们就是为此而设计的。喜欢tagscategories 或自定义movies, nappers, wooden toys, bicycles, etc. 你看到属于另一个人了吗?查询自定义字段是WordPress中最消耗资源的内容之一。在经常使用查询的情况下使用分类法。重新考虑排除该插件的架构,并提出一个新想法。

相关推荐

Performance on WPMS

我的WPMS站点托管在8核/32mb RAM服务器上,但响应时间非常长。我们有大约1000个博客(单个db上有35000多个表)和70000个页面浏览量。我认为我可以缩短响应时间,将具有更多页面浏览量的博客移动到单独的DB中,并使用hyper DB插件将所有博客拆分为每个DB 100个博客。你觉得怎么样?