it-swarm.com.de

Wie bekomme ich alle Posts (in Chunks) per XML-RPC?

Ich möchte alle Beiträge eines Blogs über die XML-RPC-API von Wordpress abrufen.

Es gibt die Methoden von blogger.getRecentPosts und metaWeblog.getRecentPosts, die - bei einem ausreichend hohen Wert als Anzahl der Posts (oder -1) theoretisch alle Posts zurückgeben sollten.

Dies funktioniert jedoch nicht für sehr große Blogs oder sehr schwache Server, auf denen nicht das gesamte Blog gespeichert werden kann. In diesem Fall geben diese Funktionen bestenfalls nichts zurück oder werfen einen Fehler in das Antwort-XML.

Eine Lösung wäre, kleinere Stücke von z.B. 50, postet nacheinander und fügt alles auf der Empfangsseite zusammen. Damit dies funktioniert, müsste ein Offset angegeben werden, damit die Beiträge abgerufen werden. Es war mir nicht möglich, einen solchen Offset in der dokumentierten API anzugeben.

Gibt es eine Möglichkeit, dies zu erreichen, entweder durch Angabe eines Offsets oder durch Verwendung einer anderen als der oben genannten Methoden?

Ich suche keine Beschreibung, wie man ein Plugin schreibt oder Wordpress selbst auf irgendeine Weise modifiziert. Das kann ich natürlich, aber ich spreche von einem autorisierten Abruf von Daten beliebiger Wordpress-Blogs.

Edit: Ich habe ein Trac-Ticket bei Wordpress mit einem Lösungsvorschlag geöffnet: http://core.trac.wordpress.org/ticket/16316

1
kongo09

Nach Thema in offiziellen Foren [xmlrpc] Wie bekomme ich Posts mit Offset?

Die vorhandenen XML-RPC-APIs bieten derzeit keine Möglichkeit, alle Post-Daten zu erfassen. (Joseph Scott)

Das Thema ist etwas alt und mir ist nicht bekannt, ob es seitdem einige Änderungen gegeben hat, aber von der Quelle aus scheint es nicht so.

1
Rarst

Lassen Sie mich für die anfängliche Frage, die ich zu Ihren Motiven hatte, entschuldigen. Ich sehe eine Menge Fragen, die zum Thema "Wie kann ich aus der Ferne alle Beiträge eines anderen Blogs abrufen?" Gestellt werden, und gehe sofort davon aus, dass eine schändliche Absicht vorliegt, weil es neun von zehn Fragen gibt. Das heißt, Ihre Absichten scheinen sehr einfach und seriös zu sein.

Derzeit gibt es keine Möglichkeit, die XML-Rückgabe von drei von Ihnen erwähnten Anforderungen zu "teilen". Als ich heute Morgen aufgestanden bin, habe ich gesehen, dass Sie dies als Funktionserweiterung durch Trac vorgeschlagen haben. Dies wird es definitiv nicht in Wordpress 3.1 schaffen, so dass Sie wahrscheinlich einige Monate (oder länger) warten müssen, bevor die eingereichten Patches in den Core gelangen. Aber das ist ein guter Anfang.

Denken Sie in der Zwischenzeit daran, dass die XML-RPC-API erweiterbar ist. Während es in der vorhandenen API keine Möglichkeit gibt, "Chunks" zu empfangen, können Sie jederzeit eine eigene Methode hinzufügen. Dies ist eigentlich der beste Weg, um einen Patch in Core zu erhalten - erstellen Sie Ihre eigene Methode, stellen Sie sicher, dass sie funktioniert, und senden Sie den Patch an Trac zurück.

Meine Vermutung ist, dass Ihre Methode metaWeblog.getRecentPosts sehr ähnlich wäre, aber einen etwas besseren Namen hätte ... vielleicht wp.getPagedPosts. Sie könnten alle gleichen Parameter akzeptieren, aber einen hinzufügen: "Seitennummer". Auf diese Weise können Sie festlegen, dass 50 Posts gleichzeitig zurückgegeben und die Sammlung schrittweise durchlaufen werden sollen.

Um Ihre Methode hinzuzufügen, schließen Sie sich dem xmlrpc_methods-Filter an:

function xml_add_method( $methods ) {
    $methods['wp.getPagedPosts'] = 'wp_getPagedPosts';
    return $methods;
}
add_filter( 'xmlrpc_methods', 'xml_add_method');

Fügen Sie dann Ihre Rückruffunktion hinzu:

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 ...

}

Denken Sie daran, dass dies der Code ist, den Sie in eine externe Plug-in-Datei oder eine functions.php-Datei mit Ihrem Design einfügen würden, um die zusätzliche XML-RPC-Anforderung zu unterstützen. Es gibt keine existierenden Methoden, um damit umzugehen. Sie müssen also Ihre eigenen schreiben. Aber wenn du es einmal machst und es gut machst und es an Trac zurücksendest ... es könnte Core werden, dann müsstest du es nicht noch einmal machen.

6
EAMann

Es ist einfach. Benutz einfach metaWeblog.getRecentPosts oder mt.getRecentPostTitles und setze Limit auf PHP_INT_MAX. Wenn Sie es auf setzen  Es werden maximal die Beiträge zurückgegeben, die Sie für die Anzeige auf der Startseite festgelegt haben (Normalerweise 10). Mein Wp-Fernbedienungsbibliothek macht das mit Leichtigkeit. Siehe die Grundlegende Snippets.

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

Grüße .

1
EarnestoDev

wp.getPosts bietet jetzt die Möglichkeit, einen Offset anzufordern.

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

0
here

Eine einfache Möglichkeit, alle Posts zu erfassen, besteht darin, zunächst die Methode getRecentPosts auszuführen und nur einen Post abzurufen (der letzte wird zurückgegeben) und die ID dieses Posts zu verwenden, um einfach eine Schleife zu erstellen und jeden Post nacheinander mit der Methode getPost abzurufen. Wenn Sie Probleme mit der Datenmenge haben, die in einem Anruf abgerufen wird, sollte dies Ihr Problem lösen. Sie können dies sogar ändern, um Brocken zu packen, indem Sie Ihre $ -Anzahl auf 5 oder 10 oder was-haben-Sie ändern.

Hier ist ein stark reduziertes Beispiel (vorausgesetzt, Sie kennen die beiden Methoden in PHP und haben hoffentlich eine Idee):

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

Hoffe das hilft jemandem :)

0
zoltar