这两个网站都是用Wordpress制作的
我想在我的网站上显示包含不同数量项目的多个位置的Feed。我下面的代码(functions.php)似乎正在运行,但我有几个问题。我担心代码不是最佳的,可能会导致网站出现性能问题。我用它的网站每天有大约10万次观看。
需要在同一页面上的多个位置调用Feed。有时它需要显示3个项目或4个项目。
要调用Feed,我使用WordPress函数 fetch_feed(); ,可以使用SimplePie。
Feed存储在哪里?
每次加载网站时,Feed是否已兑现或是否有请求?
我希望Feed能够对网站的性能产生最小的影响,如何改进我的代码以实现这一目标?
我的托管服务提供商使用服务器端缓存,这会对Feed造成问题吗?
调用Feed
<?php Roots\Sage\Feed\update_feed(3); ?>
functions.php中的代码:
function update_feed( $itemAmount ) {
include_once( ABSPATH . WPINC . '/feed.php' );
// Get a SimplePie feed object from the specified feed source.
$rss = fetch_feed( 'https://example.nl/feed/' );
$maxitems = 0;
$rss_items = "";
if ( ! is_wp_error( $rss ) ) : // Checks that the object is created correctly
// Figure out how many total items there are, but limit it to 5.
$maxitems = $rss->get_item_quantity( $itemAmount );
// Build an array of all the items, starting with element 0 (first element).
$rss_items = $rss->get_items( 0, $maxitems );
endif; ?>
<ul>
<?php if ( $maxitems == 0 ) : ?>
<li><?php _e( 'No items', 'sage' ); ?></li>
<?php else : ?>
<?php // Loop through each feed item and display each item as a hyperlink. ?>
<?php foreach ( $rss_items as $item ) :
$job_url = esc_url( $item->get_permalink() );
$job_title = esc_html( $item->get_title() );
$job_thumbnail_url = $item->get_item_tags( '', 'job_logo_url' );
?>
<li>
<a href="<?= esc_url( $job_url ); ?>" target="_blank"><img src="<?= $job_thumbnail_url[0]["data"]; ?>" alt=""></a>
</li>
<?php endforeach; ?>
<?php endif; ?>
</ul>
<?php
}
add_action( 'update_feed', __NAMESPACE__ . '\\update_feed' );
答案 0 :(得分:1)
就请求数量而言,您非常安全,因为fetch_feed()
会自动缓存提取的响应。
Feed正在兑现?
这在fetch_feed()
函数调用的说明中进行了简要说明,并在Notes部分中提到: fetch_feed
默认情况下缓存12小时的结果。您可以通过过滤器wp_feed_cache_transient_lifetime
修改时间间隔来修改此项。
如果你深入研究函数的source code,你会发现fetch_feed()
实际上只是SimplePie类的包装器。话虽如此,值得在他们的常见问题解答中阅读“How does SimplePie’s caching system work?”。以下是本质。
- 您告诉SimplePie您想要获取哪些Feed以及将其缓存到何处。
- SimplePie查看Feed是否已缓存:
醇>
- 如果缓存是新用的。
- 如果根本没有缓存副本,SimplePie将抓取并缓存Feed。
- 如果缓存在那里但它已经过时了(SimplePie默认为60分钟;可以使用set_cache_duration()进行配置),那么SimplePie会询问自上次我们抓取它以来它是否已更改(这是HTTPCG部分)。
- 如果它没有改变,我们会在缓存的新鲜度上重置计时器并再保持60分钟,然后再次检查。
- 如果缓存已更改,SimplePie会转储现有缓存(因为缓存只是基于Feed的数据对象的副本),并抓取该Feed的新副本并使用它。
将它们组合在一起,这意味着默认情况下,WordPress的set_cache_duration()
SimplePie设置为12小时。总而言之,这意味着在第一个请求被缓存后,12小时内不会执行任何新请求。这不受您请求和显示的Feed项数的影响,因为整个Feed已被缓存,而不仅仅是您指定的项目数。
Feed存储在哪里?
默认情况下,提取的Feed内容存储在数据库中。确切地说,在wp_options
表下的_transient_feed_<hash>
(<hash>
是一系列32个字符)的键下。
如何改进我的代码?
没有什么可以改进的。但是,如果您的Feed不经常更改,则可以增加默认的12小时缓存时间。下面的示例使用DAY_IN_SECONDS
constant。
add_filter('wp_feed_cache_transient_lifetime' , function ($seconds) {
return DAY_IN_SECONDS;
});
主机提供商的服务器端缓存是否会成为Feed的问题?
否。根据缓存实现,它可能会影响瞬态实际存储的方式(在内存中等等),但不会影响功能。