在我的索引中。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?如何优化代码的效率,减少查询数量和加载时间?
最合适的回答,由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()
在回路内部。如果您需要帖子之间的一些关系,请使用分类法,它们就是为此而设计的。喜欢tags
或categories
或自定义movies
, nappers
, wooden toys
, bicycles
, etc
. 你看到属于另一个人了吗?查询自定义字段是WordPress中最消耗资源的内容之一。在经常使用查询的情况下使用分类法。重新考虑排除该插件的架构,并提出一个新想法。