2011-09-09 11 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を使用しないのですか?なぜRSSを使用するのですか?

2

WordPressモバイルチームには、使用するXML-RPCパーサー用のリポジトリがあります。実装と使用はかなり簡単です。これはXMLRPCDecodeXMLRPCEncoderで構成されています。ワードプレスで

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

EDIT

XML-RPC投稿するためのものです。 WordPressの実装ではwp.getPostsメソッドでwp_get_recent_posts()が使用されているため、投稿を取得する機能はかなり制限されています。私はclass-wp-xmlrpc-server.phpwp_getPostsメソッドを採用し、wp_get_recent_postsget_postsに置き換えることにより、この機能を改善しました。だから私はWp_Queryクラスのようなすべてのパラメータを使用することができます。

xmlrpc_methodフィルタは、組み込みメソッドをオーバーライドするために使用されます。あなたが望むなら、コードを投稿することができます。

EDIT 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'); 
関連する問題