web-dev-qa-db-ja.com

XML-RPCを介してすべての投稿を(まとめで)取得する方法

WordpressのXML-RPC APIを介してブログのすべての投稿を取得したいです。

blogger.getRecentPostsmetaWeblog.getRecentPostsのメソッドがあります - 理論上の投稿数(または-1)が十分に高い値を与えられた場合、すべての投稿を返すべきです。

ただし、これは非常に大きなブログや、ブログ全体をメモリに保持できないような非常に弱いサーバーでは機能しません。その場合、これらの関数はせいぜい何も返しませんし、応答XMLにエラーをスローしません。

解決策は、以下のような小さいチャンクを取得することです。 50、一度に投稿し、受信側でそれをすべて一緒に置きます。これが機能するためには、取得する投稿のオフセットを指定する必要があります。文書化されたAPIでそのようなオフセットを指定する方法を見つけることができませんでした。

オフセットを指定することによって、または上記の方法以外の方法を使用することによって、これを機能させる方法はありますか?

私はどのようにしてプラグインを書いたりWordpress自体を変更したりするかについての説明を探していません。確かにそれは可能ですが、私は任意のWordpressブログのデータの許可された検索について話しています。

編集:私は解決策を提案してWordpressでTracチケットをオープンしました: http://core.trac.wordpress.org/ticket/16316

1
kongo09

公式フォーラムのトピックに従ってください [xmlrpc]オフセット付きの投稿をどのように取得しますか?

既存のXML-RPC APIは、現時点ですべての投稿データを収集する方法を実際には提供していません。 (ジョセフスコット)

トピックは多少古く、それ以来いくつかの変更があったかどうか私は知りませんが、簡単にソースを見るとそれはそうではありません。

1
Rarst

私があなたの動機について持っていた最初の質問をお詫び申し上げます。 「他のブログからすべての投稿をリモートで取得するにはどうすればよいですか」という質問が多数ありますが、すぐに10のうち9倍があるため、悪意のある意図があると想定します。とは言っても、あなたの目的は非常に単純明快で立派なようです。

現時点では、あなたが言及した3つの要求のうちのいずれかのXMLリターンを「まとめる」方法はありません。けれども今朝起きた時、私はあなたが Tracを通した機能強化としてこれを提案したのを見ました 。これは間違いなくWordpress 3.1には反映されないので、投稿されたパッチがコアになるまでに数ヶ月(またはそれ以上)待つことになるでしょう。しかし、これは良いスタートです。

その間に、XML-RPC APIは拡張可能であることを忘れないでください。既存のAPIに「チャンク」を受け取る方法はありませんが、いつでも独自のメソッドを追加できます。これは実際にパッチをコアにする最も良い方法です - あなた自身のメソッドを作成し、それが機能することを確認し、そしてパッチをTracに送り返す。

私の推測では、あなたのメソッドはmetaWeblog.getRecentPostsに非常に似ているでしょうが、もう少し良い名前を付けられるでしょう...おそらくwp.getPagedPosts。同じパラメータをすべて受け入れることもできますが、1つ追加してください: "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 ...

}

覚えておいて、これは追加のXML-RPCリクエストをサポートするためにあなたがあなたのテーマを持つ外部プラグインファイルかfunctions.phpファイルに入れるコードです。これを処理するための既存の方法はありませんので、あなたはあなた自身のものを書くことで行き詰まっています。しかし、あなたが一度それをやって、それをうまくやって、そしてTracにそれを送り返すならば...それはコアになる可能性があります、そしてあなたは再びそれをする必要はないでしょう。

6
EAMann

それは簡単です。ただ使う metaWeblog.getRecentPosts または mt.getRecentPostTitles に制限を設定 PHP_INT_MAX。に設定した場合  ホームページに表示するように設定した投稿の最大数を返します (通常10)。俺の  Wpリモートコントロールライブラリ  これは非常に簡単にできます。を参照してください 基本スニペット

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

よろしく

1
EarnestoDev

wp.​​getPostsはオフセットを要求する機能を提供します。

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

0
here

すべての投稿を取得する簡単な方法は、最初にgetRecentPostsメソッドを実行して1つの投稿のみを取得し(最新のものが返されるもの)、この投稿のIDを使用してgetPostメソッドで各投稿を単純にループバックして取得することです。 1回の呼び出しで取得されるデータ量に問題がある場合は、これで問題は解決します。あなたはあなたの$カウントを5、10またはwhat-have-youに変更することによってチャンクをつかむためにこれを変更することさえできます。

これは厳しく省略された例です(あなたがPHPの2つの方法に精通していると仮定すると、うまくいけばあなたはアイデアを得るでしょう..):

<?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)
}
?>

これが誰かに役立つことを願っています:)

0
zoltar