如何在wordpress中使用限制语句创建RSS源

时间:2012-02-22 04:18:21

标签: php ios wordpress

我基本上是在创建一个iphone应用程序,它可以从wordpress获取数据。 Wordpress将通过RSS源向iphone应用提供音频和视频链接。我有饲料和音频播放器工作得很好,但似乎无法找到任何与如何创建自定义Feed有关的内容,我可以指定分页,如start = 0& items = 10。插件会很棒,但如果有人有任何想法,我可以用PHP编写代码。

1 个答案:

答案 0 :(得分:6)

我将通过更改WordPress安装的标准RSS提要来回答此问题,以响应查询参数传递的限制。正如你所说,你已经有了一个有效的饲料,这应该可以为你提供所需的一切。

默认情况下,WordPress中的标准Feed受设置→阅读页面上的“联合供稿显示最新的 X 项目”设置的限制,并且未被取消,因为这通常不会理解RSS提要。这是由WordPress的WP_Query :: get_posts()方法在query.php中控制的,如果你有兴趣看看内部是如何工作的。

但是,虽然Feed查询的限制设置为LIMIT 0, X(其中X是上述设置,默认为10),但您可以通过在正确的位置过滤查询来覆盖限制。

例如,过滤器post_limits将在Feed的默认代码和运行时间之间设置的点之间过滤查询的LIMIT子句。因此,插件中的以下代码 - 甚至是主题的functions.php中的代码 - 将完全取消限制RSS提要中返回的项目:

function custom_rss_limits($limits) {
  if (is_feed()) {
    // If this is a feed, drop the LIMIT clause completely
    return "";
  } else {
    // It's not a feed; leave the normal LIMIT in place.
    return $limits;
  }
}
add_filter('post_limits', 'custom_rss_limits');

(此时我应该提到明显的安全隐患 - 如果你的博客上有2万个帖子,如果有很多人开始抓住你的Feed,你会给自己带来很多服务器负载和带宽,以及你向所有人发送了所有20,000件商品。因此,请记住,无论你最终做什么,你可能仍然想要强制执行一些硬限制,以防有人确定你的Feed端点可以被要求一切,比如分析iPhone应用程序的流量。)

现在我们所要做的就是回应查询参数。首先,我们使用WordPress注册您的两个查询参数:

function rss_limit_queryvars( $qv ) {
  $qv[] = 'start';
  $qv[] = 'items';
  return $qv;
}
add_filter('query_vars', 'rss_limit_queryvars' );

这样我们就可以传递您为网址参数建议的startitems个变量。

我们所要做的就是调整原来的LIMIT更改功能以响应它们:

function custom_rss_limits($limits) {
  if (is_feed()) {
    global $wp_query;
    if (isset($wp_query->query_vars['start']) &&
        isset($wp_query->query_vars['items'])) {
        // We're a feed, and we got pagination parameters. Override our
        // standard limit.

        // First convert to ints in case anyone's put something hinky 
        // in the query string.
        $start = intval($wp_query->query_vars['start']); 
        $items = intval($wp_query->query_vars['items']);
        $limits = "LIMIT $start, $items";
    } else {
      // We weren't passed pagination parameters, so just
      // leave the default limits alone.
    }
  }
  return $limits;
}
add_filter('post_limits', 'custom_rss_limits');

你去吧。在WordPress上抛出最后两个代码块,现在您可以在任何现有的Feed上使用这样的URL:

http://example.com/feed/?start=30&items=25

对于此示例,您将获得正常的RSS提要,但是从项目编号30开始有25个项目。

...如果传递查询参数,一切都会正常工作。