Como obter todas as postagens (em pedaços) via XML-RPC?

Gostaria de recuperar todas as postagens de um blog via XML-RPC API do WordPress.

Existem os methods de blogger.getRecentPosts e metaWeblog.getRecentPosts que – dado um valor suficientemente alto como o número de posts (ou -1) em teoria deve retornar todas as postagens.

No entanto, isso não funciona para blogs muito grandes ou servidores muito fracos que não podem conter todo o blog em memory. Nesse caso, essas funções não retornarão nada na melhor das hipóteses ou lançarão um erro na resposta XML.

Uma solução seria recuperar pedaços menores de, por exemplo, 50, postagens por vez e colocá-lo todo junto no lado receptor. Para que isso funcione, seria necessário especificar um deslocamento para as postagens a serem obtidas. Não consegui encontrar uma maneira de especificar tal deslocamento na API documentada.

Existe alguma maneira de fazer isso funcionar, seja especificando um deslocamento ou usando outros methods acima mencionados?

Não estou à procura de uma descrição sobre como escrever um plugin ou modificar o WordPress de forma alguma. Eu posso fazer isso, claro, mas estou falando sobre a recuperação autorizada de dados de blogs WordPress arbitrários.

Edit: Eu abri um ticket trac no WordPress com uma sugestão de solução: http://core.trac.wordpress.org/ticket/16316

Solutions Collecting From Web of "Como obter todas as postagens (em pedaços) via XML-RPC?"

De acordo com tópico em fóruns oficiais [xmlrpc] Como obter posts com deslocamento?

As APIs existentes de XML-RPC realmente não fornecem uma maneira de coletar todos os dados de postagem agora. (Joseph Scott)

O tópico é um pouco antigo e não sei se houve algumas mudanças desde então, mas a partir de uma visão rápida da fonte, isso não parece ser assim.

Deixe-me pedir desculpas pela primeira pergunta que tive sobre os seus motivos. Eu vejo muitas perguntas sobre “como posso recuperar remotamente todas as postagens de outro blog” e assumir imediatamente que há intenção nefasta porque, 9 vezes em 10, existe. Dito isto, seus objectives parecem muito diretos e respeitáveis.

Atualmente, não há como “trocar” o retorno XML de qualquer um dos três pedidos que você mencionou. Quando eu levantei esta manhã, no entanto, vi que você propôs isso como um aprimoramento de resources através do Trac . Isso definitivamente não entrará no WordPress 3.1, então você provavelmente estará esperando alguns meses (ou mais) antes que os patches enviados o façam no núcleo. Mas este é um bom começo.

Entretanto, lembre-se de que a API XML-RPC é extensível. Embora não haja nenhuma maneira de receber “pedaços” na API existente, você sempre pode adicionar seu próprio método. Esta é realmente a melhor maneira de obter um patch no núcleo – crie seu próprio método, verifique se ele funciona e envie o patch de volta ao Trac.

Meu palpite é que seu método seria muito parecido com metaWeblog.getRecentPosts , mas seria nomeado um pouco melhor … talvez wp.getPagedPosts . Você pode aceitar todos os mesmos parâmetros, mas adicione um: “pagenumber”. Desta forma, você poderia configurar o pedido para retornar 50 posts de cada vez e caminhar progressivamente pela coleção.

Para adicionar seu método, você xmlrpc_methods filtro xmlrpc_methods :

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

Em seguida, adicione sua function de retorno de chamada:

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

Lembre-se, este é o código que você colocaria em um arquivo de plug-in externo ou um arquivo functions.php com seu tema para suportar a solicitação XML-RPC adicional. Não há nenhum método existente para lidar com isso, então você está preso a escrever o seu próprio. Mas se você fizer isso uma vez, e fazê-lo bem, e enviá-lo de volta para Trac … pode se tornar Core, então você não precisaria fazê-lo novamente.

É fácil. Basta usar metaWeblog.getRecentPostts ou mt.getRecentPostTitles e definir limite para PHP_INT_MAX . Se você configurá-lo para 0 ele retorna um máximo de postagens que você configurou para exibir na página inicial (10 geralmente) . Minha biblioteca de controle remoto Wp faz isso com muita facilidade. Veja os trechos básicos .

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

Atenciosamente .

Uma maneira simples de pegar todas as postagens é primeiro tentar executar o método getRecentPosts e recuperar apenas 1 publicação (o mais recente é o que será retornado) e usar a ID desta postagem para simplesmente encaminhar novamente e pegar cada publicação consecutivamente com o método getPost. Se você estiver tendo problemas com a quantidade de dados que estão sendo recuperados em uma chamada, isso deve resolver seu problema. Você poderia até mesmo alterar isso para pegar pedaços, alterando seu número de $ para 5 ou 10 ou o que você tem.

Aqui está um exemplo severamente despojado (assumindo que você está familiarizado com os dois methods em PHP, espero que você tenha a idéia …):

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

Espero que isso ajude alguém 🙂

O wp.getPostts agora oferece a capacidade de solicitar um deslocamento.

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