【问题标题】:Reading a Wordpress blog using XML-RPC使用 XML-RPC 阅读 Wordpress 博客
【发布时间】:2011-11-13 13:13:39
【问题描述】:

无论我在哪里看,我都找不到将我的应用程序完全连接到 Wordpress 的方法。我想做的是:在您未登录时显示最近的文章(当然已发布)和较旧的文章,并帮助为已登录的用户编写 cmets。

看起来我必须从 RSS 中提取博客文章(但是“阅读更多...”下面的文字呢?),然后使用 XML-RPC* 对文章发表评论。是这样吗,还是有人有更好的解决方案? (*metaWeblog.getRecentPosts 在 WP 上并不总是可用)

关于该博客的实现,我没有太多要说的,尽管我可以要求所有者安装一些插件。如WP-RESTful

请指出正确的方向,因为我花了几天时间寻找一个应该简单但似乎不是那样的解决方案。谢谢!

【问题讨论】:

  • 那么,要么我是唯一一个有这个问题的人,要么答案太明显了......? (我希望是后者。)
  • ♫♪ 我可以踢吗? ♫ 猜我做不到! ♪♫
  • 真的吗?没有人尝试为 WP 网站构建应用程序?

标签: android wordpress api rest xml-rpc


【解决方案1】:

WordPress 移动团队为他们使用的 XML-RPC 解析器提供了一个存储库。它的实现和使用相当简单。它由XMLRPCDecodeXMLRPCEncoder 组成。

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

编辑

XML-RPC 在 WordPress 中用于发布。获取帖子的功能非常有限,因为 WordPress 实现在 wp.getPosts 方法中使用了 wp_get_recent_posts()。我通过在class-wp-xmlrpc-server.php 中采用wp_getPosts 方法并将wp_get_recent_posts 替换为get_posts,使功能变得更好。所以我可以使用 Wp_Query 类中的所有参数。

然后使用xmlrpc_method 过滤器覆盖内置方法。如果你愿意,我可以发布代码。

编辑二

没关系,我会发布代码... :)

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');

【讨论】:

    【解决方案2】:

    我认为 xmlrpc 是要走的路,这就是 WP 自己的应用程序连接的方式。为什么不使用它来获取帖子,为什么要使用 RSS 呢?

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多