如何在网站上嵌入外部提要

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?”。下面是精华。

  1. You tell SimplePie what feed you want to get and where to cache it.
  2. SimplePie looks to see if the feed is already cached:
    1. If the cache is fresh use that.
    2. If there is no cached copy at all, SimplePie will grab and cache the feed.
    3. 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).
      1. If it hasn't changed, we reset the timer on the cache's freshness and keep it for another 60 minutes before checking again.
      2. 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 的问题?
不会。根据缓存的实现,它可能会影响瞬态的实际存储方式(在内存中等),但不会影响功能。