如何在网站上嵌入外部提要
how to embed external feed on website
两个网站都是用 Wordpress 制作的
我想在我的网站上的多个位置显示不同数量的项目的供稿。我下面的代码 (functions.php) 似乎可以正常工作,但我有几个问题。我担心代码不是最优的,可能会导致网站出现性能问题。我使用它的网站每天大约有 10 万次浏览量。
有时需要在同一页面上的多个位置调用提要。有时需要显示3条或4条。
为了调用提要,我使用了 Wordpress 函数 fetch_feed();,它与 SimplePie 一起使用。
提要存储在哪里?
每次加载网站时是否正在兑现提要或是否正在执行请求?
我希望 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' );
就请求数量而言,您是非常安全的,因为 fetch_feed()
会自动缓存获取的响应。
提要是否兑现?
这在 fetch_feed()
function call, and also mentioned under the Notes 部分的描述中有简要说明:fetch_feed
默认缓存结果 12 小时。您可以通过过滤器 wp_feed_cache_transient_lifetime
修改时间间隔来修改它。
如果您深入了解他们的常见问题解答中的 source code of the function, you will see that fetch_feed()
is really just a wrapper for the SimplePie class. Having said that, it is worth to read “How does SimplePie’s caching system work?”。下面是精华。
- You tell SimplePie what feed you want to get and where to cache it.
- SimplePie looks to see if the feed is already cached:
- If the cache is fresh use that.
- If there is no cached copy at all, SimplePie will grab and cache the feed.
- If the cache is there but it's old (SimplePie defaults to 60 minutes; configurable with set_cache_duration()), then SimplePie will ask the feed if it has changed since the last time we grabbed it (this is the HTTPCG part).
- If it hasn't changed, we reset the timer on the cache's freshness and keep it for another 60 minutes before checking again.
- If the cache has changed, SimplePie dumps the existing cache (since the cache is just a copy of the data object based on the feed), and grabs a new copy of the feed and uses it.
综合起来,就是说 SimplePie 的 set_cache_duration()
默认被 WordPress 设置为 12 小时。总而言之,这意味着在缓存第一个请求后的 12 小时内不会执行任何新请求。这不受您请求和显示的 Feed 项目数量的影响,因为整个 Feed 都会被缓存,而不仅仅是您指定的项目数量。
提要存储在哪里?
默认情况下,获取的提要内容存储在数据库中。准确地说,在 wp_options
table 下一个看起来像 _transient_feed_<hash>
的键(其中 <hash>
是一系列 32 个字符)。
如何改进我的代码?
没有什么可以改进的。但是,如果您的提要不经常更改,您可以增加默认的 12 小时缓存时间。下面的示例使用 DAY_IN_SECONDS
constant.
将其增加到 1 天
add_filter('wp_feed_cache_transient_lifetime' , function ($seconds) {
return DAY_IN_SECONDS;
});
托管服务提供商的服务器端缓存是否会成为 Feed 的问题?
不会。根据缓存的实现,它可能会影响瞬态的实际存储方式(在内存中等),但不会影响功能。
两个网站都是用 Wordpress 制作的
我想在我的网站上的多个位置显示不同数量的项目的供稿。我下面的代码 (functions.php) 似乎可以正常工作,但我有几个问题。我担心代码不是最优的,可能会导致网站出现性能问题。我使用它的网站每天大约有 10 万次浏览量。
有时需要在同一页面上的多个位置调用提要。有时需要显示3条或4条。
为了调用提要,我使用了 Wordpress 函数 fetch_feed();,它与 SimplePie 一起使用。
提要存储在哪里?
每次加载网站时是否正在兑现提要或是否正在执行请求?
我希望 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' );
就请求数量而言,您是非常安全的,因为 fetch_feed()
会自动缓存获取的响应。
提要是否兑现?
这在 fetch_feed()
function call, and also mentioned under the Notes 部分的描述中有简要说明:fetch_feed
默认缓存结果 12 小时。您可以通过过滤器 wp_feed_cache_transient_lifetime
修改时间间隔来修改它。
如果您深入了解他们的常见问题解答中的 source code of the function, you will see that fetch_feed()
is really just a wrapper for the SimplePie class. Having said that, it is worth to read “How does SimplePie’s caching system work?”。下面是精华。
- You tell SimplePie what feed you want to get and where to cache it.
- SimplePie looks to see if the feed is already cached:
- If the cache is fresh use that.
- If there is no cached copy at all, SimplePie will grab and cache the feed.
- If the cache is there but it's old (SimplePie defaults to 60 minutes; configurable with set_cache_duration()), then SimplePie will ask the feed if it has changed since the last time we grabbed it (this is the HTTPCG part).
- If it hasn't changed, we reset the timer on the cache's freshness and keep it for another 60 minutes before checking again.
- If the cache has changed, SimplePie dumps the existing cache (since the cache is just a copy of the data object based on the feed), and grabs a new copy of the feed and uses it.
综合起来,就是说 SimplePie 的 set_cache_duration()
默认被 WordPress 设置为 12 小时。总而言之,这意味着在缓存第一个请求后的 12 小时内不会执行任何新请求。这不受您请求和显示的 Feed 项目数量的影响,因为整个 Feed 都会被缓存,而不仅仅是您指定的项目数量。
提要存储在哪里?
默认情况下,获取的提要内容存储在数据库中。准确地说,在 wp_options
table 下一个看起来像 _transient_feed_<hash>
的键(其中 <hash>
是一系列 32 个字符)。
如何改进我的代码?
没有什么可以改进的。但是,如果您的提要不经常更改,您可以增加默认的 12 小时缓存时间。下面的示例使用 DAY_IN_SECONDS
constant.
add_filter('wp_feed_cache_transient_lifetime' , function ($seconds) {
return DAY_IN_SECONDS;
});
托管服务提供商的服务器端缓存是否会成为 Feed 的问题?
不会。根据缓存的实现,它可能会影响瞬态的实际存储方式(在内存中等),但不会影响功能。