如何通过XML-RPC获取所有帖子(以块为单位)?

时间:2011-01-20 作者:kongo09

I would like to retrieve all posts of a blog via the XML-RPC API of Wordpress.

有以下方法blogger.getRecentPostsmetaWeblog.getRecentPosts 理论上,如果给出足够高的值作为职位数量(或-1),则应返回所有职位。

但是,这不适用于非常大的博客或非常弱的服务器,这些服务器无法在内存中保存整个博客。在这种情况下,这些函数最多不会返回任何内容,也不会向响应XML中抛出错误。

一种解决方案是一次检索较小的帖子块,例如50篇,然后将其全部放在接收端。要实现这一点,需要为帖子指定一个偏移量。我无法找到一种方法在有文档记录的API中指定这样的偏移量。

Is there any way to make this work, either by specifying an offset or by using other than the methods mentioned above?

我不是在寻找关于如何编写插件或以任何方式修改Wordpress本身的描述。我当然可以,但我说的是授权检索任意Wordpress博客的数据。

Edit: 我在Wordpress上打开了一张trac票证,并提出了解决方案建议:http://core.trac.wordpress.org/ticket/16316

5 个回复
最合适的回答,由SO网友:Rarst 整理而成

根据官方论坛的主题[xmlrpc] How to get posts with offset?

现有的XML-RPC API目前并没有真正提供收集所有post数据的方法。(约瑟夫·斯科特)

这个话题有点老了,我不知道从那以后是否有一些变化,但从源头上看,似乎不是这样。

SO网友:EAMann

让我为我最初提出的关于你动机的问题道歉。我看到了很多“如何远程检索其他博客的所有帖子”的问题,并立即假设存在恶意意图,因为10次中有9次是这样的。这就是说,你的目的似乎很直截了当,令人尊敬。

目前,无法“分块”您提到的三个请求中的任何一个的XML返回。今天早上我起床的时候,我看到你proposed this as a feature enhancement through Trac. 这肯定不会进入Wordpress 3.1,所以在提交的补丁进入core之前,您可能需要等待几个月(或更长时间)。但这是一个良好的开端。

同时,请记住XML-RPC API是可扩展的。虽然在现有API中无法接收“块”,但您始终可以添加自己的方法。这实际上是在core中获取补丁的最佳方法-创建自己的方法,确保它有效,然后将补丁提交回Trac。

我猜你的方法与metaWeblog.getRecentPosts, 但名字会更好一点。。。可能wp.getPagedPosts. 您可以接受所有相同的参数,但添加一个:“pagenumber”。通过这种方式,您可以将请求设置为一次返回50篇文章,并逐步遍历收集。

要添加方法,请将xmlrpc_methods 过滤器:

function xml_add_method( $methods ) {
    $methods[\'wp.getPagedPosts\'] = \'wp_getPagedPosts\';
    return $methods;
}
add_filter( \'xmlrpc_methods\', \'xml_add_method\');
然后添加回调函数:

function wp_getPagedPosts($args) {

    // $this->escape($args);    //<-- This is called by native XML-RPC methods to sanitize passed arrays for the database.

    $blog_ID     = (int) $args[0];
    $username  = $args[1];
    $password   = $args[2];
    if ( isset( $args[3] ) )
        $query = array( \'numberposts\' => absint( $args[3] ) );
    else
        $query = array();

    if ( !$user = $this->login($username, $password) )
        return $this->error;

    do_action(\'xmlrpc_call\', \'wp.getPagedPosts\');

    //... get a list of posts and generate your XML-RPC return ...

}
请记住,这是您要放在外部插件文件或functions.php 文件,以支持额外的XML-RPC请求。没有任何现有的方法来处理此问题,因此您只能自己编写。但如果你做了一次,并且做得很好,然后把它提交给Trac。。。它可以成为核心,这样你就不必再做了。

SO网友:EarnestoDev

这很简单。只需使用metaWeblog即可。getRecentPosts或mt.getRecentPostTitles,并将限制设置为PHP\\u INT\\u MAX。如果将其设置为0,则返回设置为在主页上显示的最多帖子数(通常为10篇)。我的Wp Remote Control Library 这很容易做到。请参见基本代码段。

// Getting all posts as full or light items
$all_posts = $wpapi->getRecentPosts(PHP_INT_MAX);
$all_post_titles = $wpapi->getRecentPostsList(PHP_INT_MAX);
问候您。

SO网友:zoltar

获取所有帖子的一种简单方法是,首先尝试运行getRecentPosts方法,只检索1篇帖子(最新的是将返回的帖子),然后使用此帖子的ID简单地循环并使用getPost方法连续获取每个帖子。如果您在一次调用中检索到的数据量有问题,那么这应该可以解决您的问题。你甚至可以通过将你的美元数改为5美元或10美元或你拥有的任何东西来改变这一点,以获取大块。

下面是一个非常简单的示例(假设您熟悉PHP中的两种方法,希望您能理解……):

<?php
include(\'your_xmlrpc_functions_for_getRecentPosts_and_getPosts.php\');
$count = 1;
$dataArray = getRecentPosts($appkey, $blogid, $user, $pass, $count);
$startID = $dataArray[0][postid];
for($i=$startID;$i>0;$i--) {
 $postInfoArray[] = getPost($appkey, $blogid, $user, $pass, $i);
 //add in whatever other functionality for each post here (maybe a time delay or something)
}
?>
希望这对某人有所帮助:)

SO网友:here

wp。getPosts现在提供了请求偏移量的功能。

http://codex.wordpress.org/XML-RPC_WordPress_API/Posts#wp.getPost

结束