2011-09-09 159 views
3

無論我在哪裏看,我都找不到一種方法將我的應用完全連接到Wordpress。我想要做的是:顯示最近的文章(當然是公佈的)和較舊的文章,當你沒有登錄時,並且便於爲用戶寫評論。使用XML-RPC閱讀Wordpress博客

它看起來像我必須從RSS(但下面的文本'閱讀更多...'?)怎麼樣拉博客文章,然後使用XML-RPC *評論文章。是這樣,還是有人有更好的解決方案? (* metaWeblog.getRecentPosts並不總是在WP上可用)

我沒有太多的關於博客的實現問題,雖然我可以要求所有者安裝一些插件。如WP-RESTful

請指點我看正確的方向,因爲我花了幾天的時間尋找一個應該很簡單但看起來並不那樣的解決方案。謝謝!

+0

所以,無論我是唯一一個有這個問題,或許答案是太明顯...? (我希望後者。) – Simon

+0

♫♪可以踢嗎? ♫猜我不能! ♪♫ – Simon

+0

真的嗎?沒有人試圖建立一個WP網站的應用程序? – Simon

回答

1

我認爲xmlrpc是要走的路,這就是WP自己的應用程序連接的例子。你爲什麼不用它來獲取帖子,爲什麼使用RSS呢?

2

WordPress移動團隊有一個他們使用的XML-RPC分析器的存儲庫。實現和使用相當簡單。它由一個XMLRPCDecodeXMLRPCEncoder組成。

https://github.com/wordpress-mobile/wpxmlrpc

編輯在WordPress

XML-RPC是爲張貼。獲取帖子的功能非常有限,因爲WordPress的實現在wp.getPosts方法中使用wp_get_recent_posts()。我通過採用class-wp-xmlrpc-server.php中的wp_getPosts方法和get_posts替換wp_get_recent_posts來使功能更好。所以我可以使用類似Wp_Query類的所有參數。

然後使用xmlrpc_method過濾器覆蓋內置方法。如果你願意,我可以發佈代碼。

編輯II

沒關係,我會張貼代碼... :)

include_once(ABSPATH . 'wp-admin/includes/admin.php'); 

include_once(ABSPATH . WPINC . '/post.php'); 
include_once(ABSPATH . WPINC . '/class-IXR.php'); 
include_once(ABSPATH . WPINC . '/class-wp-xmlrpc-server.php'); 

class jw_xmlrpc_server extends wp_xmlrpc_server { 
    function __construct($wp_xmlrpc_server) { 
     parent::__construct(); 

     foreach(get_object_vars($wp_xmlrpc_server) as $key => $val) { 
      $wp_xmlrpc_server->key = $val; 
     } 
    } 

    public function minimum_args($args, $count) { 
     return parent::minimum_args($args, $count); 
    } 

    public function _prepare_post($post, $fields) { 
     return parent::_prepare_post($post, $fields); 
    } 
} 

class WP_Post_Converter { 
    public function to_array($post) { 
     $array = array(); 

     foreach(get_object_vars($post) as $key => $val) { 
      $array[$key] = $val; 
     } 

     return $array; 
    } 
} 

function wp_getPosts($args) { 
    global $wp_xmlrpc_server; 
    $wp_server_save = $wp_xmlrpc_server; 
    $wp_xmlrpc_server = new jw_xmlrpc_server($wp_xmlrpc_server); 

    if (!$wp_xmlrpc_server->minimum_args($args, 3)) { 
     return $wp_xmlrpc_server->error; 
    } 

    $wp_xmlrpc_server->escape($args); 

    $blog_id = (int) $args[0]; 
    $username = $args[1]; 
    $password = $args[2]; 
    $filter  = isset($args[3]) ? $args[3] : array(); 

    if (isset($args[4])) { 
     $fields = $args[4]; 
    } 
    else { 
     $fields = apply_filters('xmlrpc_default_post_fields', array('post', 'terms', 'custom_fields'), 'wp.getPosts'); 
    } 

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

    do_action('xmlrpc_call', 'wp.getPosts'); 

    if (isset($filter['post_type'])) { 
     $post_type = get_post_type_object($filter['post_type']); 

     if (!((bool)$post_type)) { 
      return new IXR_Error(403, __('The post type specified is not valid')); 
     } 
    } 
    else { 
     $post_type = get_post_type_object('post'); 
    } 

    if (!current_user_can($post_type->cap->edit_posts)) { 
     return new IXR_Error(401, __('Sorry, you are not allowed to edit posts in this post type')); 
    } 

    $filter['post_type'] = $post_type->name; 

// $posts_list = wp_get_recent_posts($query); 
    $posts_list = get_posts($filter); 

    if (!$posts_list) { 
     return array(); 
    } 

    // holds all the posts data 
    $struct = array(); 

    foreach ($posts_list as $post) { 
     $post = WP_Post_Converter::to_array($post); 
     $post_type = get_post_type_object($post['post_type']); 

     if (!current_user_can($post_type->cap->edit_post, $post['ID'])) { 
      continue; 
     } 

     $struct[] = $wp_xmlrpc_server->_prepare_post($post, $fields); 
    } 

    $wp_xmlrpc_server = $wp_server_save; 

    return $struct; 
} 

function wp_get_categories($args) { 
    global $wp_xmlrpc_server; 
    $wp_server_save = $wp_xmlrpc_server; 
    $wp_xmlrpc_server = new jw_xmlrpc_server($wp_xmlrpc_server); 

    $wp_xmlrpc_server->escape($args); 

    $blog_ID = (int) $args[0]; 
    $username = $args[1]; 
    $password = $args[2]; 

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

    if (!current_user_can('edit_posts')) { 
     return new IXR_Error(401, __('Sorry, you must be able to edit posts on this site in order to view categories.')); 
    } 

    do_action('xmlrpc_call', 'metaWeblog.getCategories'); 

    $categories_struct = array(); 

    if ($cats = get_categories(array('get' => 'all'))) { 
     foreach ($cats as $cat) { 
      $struct['categoryId'] = $cat->term_id; 
      $struct['parentId'] = $cat->parent; 
      $struct['postCount'] = $cat->count; 
      $struct['description'] = $cat->name; 
      $struct['categoryDescription'] = $cat->description; 
      $struct['categoryName'] = $cat->name; 
      $struct['htmlUrl'] = esc_html(get_category_link($cat->term_id)); 
      $struct['rssUrl'] = esc_html(get_category_feed_link($cat->term_id, 'rss2')); 

      $categories_struct[] = $struct; 
     } 
    } 

    $wp_xmlrpc_server = $wp_server_save; 

    return $categories_struct; 
} 

function wp_method_setter($methods) { 
    $methods['wp.getPosts'] = 'wp_getPosts'; 
    $methods['wp.getCategories'] = 'wp_get_categories'; 
    return $methods; 
} 
add_filter('xmlrpc_methods', 'wp_method_setter');