如何在网站

时间:2018-01-02 08:48:10

标签: php wordpress rss

这两个网站都是用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' );

1 个答案:

答案 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?”。以下是本质。

  
      
  1. 您告诉SimplePie您想要获取哪些Feed以及将其缓存到何处。
  2.   
  3. SimplePie查看Feed是否已缓存:      
        
    1. 如果缓存是新用的。
    2.   
    3. 如果根本没有缓存副本,SimplePie将抓取并缓存Feed。
    4.   
    5. 如果缓存在那里但它已经过时了(SimplePie默认为60分钟;可以使用set_cache_duration()进行配置),那么SimplePie会询问自上次我们抓取它以来它是否已更改(这是HTTPCG部分)。      
          
      1. 如果它没有改变,我们会在缓存的新鲜度上重置计时器并再保持60分钟,然后再次检查。
      2.   
      3. 如果缓存已更改,SimplePie会转储现有缓存(因为缓存只是基于Feed的数据对象的副本),并抓取该Feed的新副本并使用它。
      4.   
    6.   
  4.   

将它们组合在一起,这意味着默认情况下,WordPress的set_cache_duration() SimplePie设置为12小时。总而言之,这意味着在第一个请求被缓存后,12小时内不会执行任何新请求。这不受您请求和显示的Feed项数的影响,因为整个Feed已被缓存,而不仅仅是您指定的项目数。

Feed存储在哪里?
默认情况下,提取的Feed内容存储在数据库中。确切地说,在wp_options表下的_transient_feed_<hash><hash>是一系列32个字符)的键下。

如何改进我的代码?
没有什么可以改进的。但是,如果您的Feed不经常更改,则可以增加默认的12小时缓存时间。下面的示例使用DAY_IN_SECONDS constant

将其增加到1天
add_filter('wp_feed_cache_transient_lifetime' , function ($seconds) {
    return DAY_IN_SECONDS;
});

主机提供商的服务器端缓存是否会成为Feed的问题?
否。根据缓存实现,它可能会影响瞬态实际存储的方式(在内存中等等),但不会影响功能。