一直想写一个给wordpress群发文章的应用,这样我就能自动采集文章,然后写个脚本自动发送文章了,哈哈。虽然用python干这种事情貌似更加擅长,但是我想做个web界面访问该应用,而python的虚拟主机现在还好少(至少PHP真的很容易有),于是拿起老本行,用PHP来搞定。

学PHP也已经有很长时间,从原来的纯手工编写,到后来的网上找类库自己整合,再到如今的直接使用框架。我再也不愿意从头开始写程序,现成的框架有大量的优秀代码,拿来用能实现目标何乐而不为,之前也用过zend、thinkphp、codeigniter,前两者其实都不错,但是现在我还是很偏爱codeigniter,就因为它强大的在线文档。

我使用的是CI(codeigniter)的“XML-RPC 和 XML-RPC 服务器类”,以下代码实现了将服务器wordpress站点的标签信息获取下来打印:

public function index(){//加载CI的xmlrpc类库$this->load->library('xmlrpc');//设定远程的XMLRPC.php文件的地址$this->xmlrpc->server('http://jobrule.sinaapp.com/xmlrpc.php');/** 设定需要操作的方法,该字符串,可以在wordpress服务器上* 的/wp-includes/class-wp-xmlrpc-server.php里面找到*/$this->xmlrpc->method('wp.getTags');/** 设定请求参数,可以直接去看class-wp-xmlrpc-server.php的源代码,* 其中第0个是id,第一个和第二个是用户名密码*/$request = array('','admin', '123456789');//将参数设定到请求里面,这时候还没有发送请求$this->xmlrpc->request($request);//发送请求if ( ! $this->xmlrpc->send_request()){echo $this->xmlrpc->display_error();}//打印结果看一看echo "<pre>";print_r( $this->xmlrpc->display_response());echo "</pre>";//$this->load->view('welcome_message');
}

CI的官方文档列出了xmlrpc类的API:

  • $this->xmlrpc->server():设定发送请求的服务器URL和端口号
  • $this->xmlrpc->timeout():设定一个发送请求的响应时间
  • $this->xmlrpc->method():设定请求的服务方法字符串(重要)
  • $this->xmlrpc->request():绑定发送请求的数据参数,并不发送请求
  • $this->xmlrpc->send_request():发送请求
  • $this->xmlrpc->display_error():打印错误信息
  • $this->xmlrpc->display_response():打印返回的响应信息
  • $this->xmlrpc->set_debug(TRUE):开发过程中打印一些调试信息

关键在于$this->xmlrpc->method(),该接口设定向服务器发送什么样的请求。下载一个wordpress源码,打开\wp-includes\class-wp-xmlrpc-server.php文件,可以看到所有的我们能够调用的服务:

// WordPress API
'wp.getUsersBlogs'        => 'this:wp_getUsersBlogs',
'wp.newPost'          => 'this:wp_newPost',
'wp.editPost'         => 'this:wp_editPost',
'wp.deletePost'           => 'this:wp_deletePost',
'wp.getPost'          => 'this:wp_getPost',
'wp.getPosts'         => 'this:wp_getPosts',
'wp.newTerm'          => 'this:wp_newTerm',
'wp.editTerm'         => 'this:wp_editTerm',
'wp.deleteTerm'           => 'this:wp_deleteTerm',
'wp.getTerm'          => 'this:wp_getTerm',
'wp.getTerms'         => 'this:wp_getTerms',
'wp.getTaxonomy'      => 'this:wp_getTaxonomy',
'wp.getTaxonomies'        => 'this:wp_getTaxonomies',
'wp.getPage'          => 'this:wp_getPage',
'wp.getPages'         => 'this:wp_getPages',
'wp.newPage'          => 'this:wp_newPage',
'wp.deletePage'           => 'this:wp_deletePage',
'wp.editPage'         => 'this:wp_editPage',
'wp.getPageList'      => 'this:wp_getPageList',
'wp.getAuthors'           => 'this:wp_getAuthors',
'wp.getCategories'        => 'this:mw_getCategories',       // Alias
'wp.getTags'          => 'this:wp_getTags',
'wp.newCategory'      => 'this:wp_newCategory',
'wp.deleteCategory'       => 'this:wp_deleteCategory',
'wp.suggestCategories'    => 'this:wp_suggestCategories',
'wp.uploadFile'           => 'this:mw_newMediaObject',  // Alias
'wp.getCommentCount'  => 'this:wp_getCommentCount',
'wp.getPostStatusList'    => 'this:wp_getPostStatusList',
'wp.getPageStatusList'    => 'this:wp_getPageStatusList',
'wp.getPageTemplates' => 'this:wp_getPageTemplates',
'wp.getOptions'           => 'this:wp_getOptions',
'wp.setOptions'           => 'this:wp_setOptions',
'wp.getComment'           => 'this:wp_getComment',
'wp.getComments'      => 'this:wp_getComments',
'wp.deleteComment'        => 'this:wp_deleteComment',
'wp.editComment'      => 'this:wp_editComment',
'wp.newComment'           => 'this:wp_newComment',
'wp.getCommentStatusList' => 'this:wp_getCommentStatusList',
'wp.getMediaItem'     => 'this:wp_getMediaItem',
'wp.getMediaLibrary'  => 'this:wp_getMediaLibrary',
'wp.getPostFormats'     => 'this:wp_getPostFormats',
'wp.getPostType'      => 'this:wp_getPostType',
'wp.getPostTypes'     => 'this:wp_getPostTypes',// Blogger API
'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs',
'blogger.getUserInfo' => 'this:blogger_getUserInfo',
'blogger.getPost' => 'this:blogger_getPost',
'blogger.getRecentPosts' => 'this:blogger_getRecentPosts',
'blogger.getTemplate' => 'this:blogger_getTemplate',
'blogger.setTemplate' => 'this:blogger_setTemplate',
'blogger.newPost' => 'this:blogger_newPost',
'blogger.editPost' => 'this:blogger_editPost',
'blogger.deletePost' => 'this:blogger_deletePost',// MetaWeblog API (with MT extensions to structs)
'metaWeblog.newPost' => 'this:mw_newPost',
'metaWeblog.editPost' => 'this:mw_editPost',
'metaWeblog.getPost' => 'this:mw_getPost',
'metaWeblog.getRecentPosts' => 'this:mw_getRecentPosts',
'metaWeblog.getCategories' => 'this:mw_getCategories',
'metaWeblog.newMediaObject' => 'this:mw_newMediaObject',// MetaWeblog API aliases for Blogger API
// see http://www.xmlrpc.com/stories/storyReader$2460
'metaWeblog.deletePost' => 'this:blogger_deletePost',
'metaWeblog.getTemplate' => 'this:blogger_getTemplate',
'metaWeblog.setTemplate' => 'this:blogger_setTemplate',
'metaWeblog.getUsersBlogs' => 'this:blogger_getUsersBlogs',// MovableType API
'mt.getCategoryList' => 'this:mt_getCategoryList',
'mt.getRecentPostTitles' => 'this:mt_getRecentPostTitles',
'mt.getPostCategories' => 'this:mt_getPostCategories',
'mt.setPostCategories' => 'this:mt_setPostCategories',
'mt.supportedMethods' => 'this:mt_supportedMethods',
'mt.supportedTextFilters' => 'this:mt_supportedTextFilters',
'mt.getTrackbackPings' => 'this:mt_getTrackbackPings',
'mt.publishPost' => 'this:mt_publishPost',// PingBack
'pingback.ping' => 'this:pingback_ping',
'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks','demo.sayHello' => 'this:sayHello',
'demo.addTwoNumbers' => 'this:addTwoNumbers'

根据方法名字,很容易知道是什么意思。要知道某一个方法需要发送什么参数,直接找到该方法,方法的注释可以看出需要什么参数,比如发送文章的newpost方法,根据注释知道需要如下参数:

/*** Create a new post for any registered post type.** @since 3.4.0** @param array $args Method parameters. Contains:*  - int     $blog_id*  - string  $username*  - string  $password*  - array   $content_struct*      $content_struct can contain:*      - post_type (default: 'post')*      - post_status (default: 'draft')*      - post_title*      - post_author*      - post_exerpt*      - post_content*      - post_date_gmt | post_date*      - post_format*      - post_password*      - comment_status - can be 'open' | 'closed'*      - ping_status - can be 'open' | 'closed'*      - sticky*      - post_thumbnail - ID of a media item to use as the post thumbnail/featured image*      - custom_fields - array, with each element containing 'key' and 'value'*      - terms - array, with taxonomy names as keys and arrays of term IDs as values*      - terms_names - array, with taxonomy names as keys and arrays of term names as values*      - enclosure*      - any other fields supported by wp_insert_post()* @return string post_id*/

至此PHP远程操作wordpress的基本流程已经非常清晰,本文使用的是CI的xmlrpc类,网友可以自己网上随便找个开源类代替,他们的接口肯定大同小异。关键是弄懂了服务端提供了什么服务,直接调用就好了。

转载于:https://www.cnblogs.com/crazyant/archive/2012/08/11/2823877.html

PHP远程操纵Wordpress的方法(流程剖析)相关推荐

  1. wordpress备份方法比较

    wordpress备份方法有很多,可以直接在服务器上下载备份到本地,也可以安装插件远程备份. 1.1 最简洁的方法:导出XML文件 登陆wordpress后台,找到工具-导出-下载导出文件,然后导入到 ...

  2. Lerna 运行流程剖析

    大家好,我是若川.持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...

  3. Flutter 页面更新流程剖析

    文章目录 Flutter页面更新流程剖析 更新流程 渲染过程 视频课程 博主相关文章列表 Flutter 框架实现原理 Flutter 框架层启动源码剖析 Flutter 页面更新流程剖析 Flutt ...

  4. 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由张宁 原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/communi ...

  5. Wordpress建站流程-最新手把手详细教程

    Wordpress建设外贸网站在不懂行的人眼里好像很难,感觉需要会开发,还要雇人维护,一般人或公司都会委托建站公司帮忙搞定,我认识的价格一般在2万起,殊不知这些公司很有可能也是用wordpress套用 ...

  6. kali metasploit 制作后门程序远程操控基本使用方法

    kali metasploit制作后门程序远程操控基本使用方法 1.后门程序的制作与加密 后门的实质就是木马 msfvenom -p windows/x64/meterpreter/reverse_t ...

  7. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    我已经试过了 教程很完美 Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在"客户端" ...

  8. moba上传文件到服务器,图片上传到远程服务器上的方法

    图片上传到远程服务器上的方法 内容精选 换一换 将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式.本节为您介绍本地Windows计算机通过远程桌面连接,上传文件至Windows ...

  9. vscode 调试python 无法连接远程服务器_vscode 远程调试python的方法

    此文介绍了vscode 远程调试python的方法,分享给大伙,具有如下: 实验环境 远程服务器:京东云,1核2G,centos7.3 64bit 本地环境配置 安装vscode,实验用的版本是1.1 ...

  10. android 保存流媒体,Android实现使用流媒体播放远程mp3文件的方法

    本文实例讲述了Android实现使用流媒体播放远程mp3文件的方法.分享给大家供大家参考,具体如下: package com.shadow.util; import java.io.BufferedI ...

最新文章

  1. ML之sklearn:sklearn.metrics中常用的函数参数(比如confusion_matrix等 )解释及其用法说明之详细攻略
  2. 复现经典:《统计学习方法》第 4 章 朴素贝叶斯
  3. 百度网站打不开了,百度被黑了?最新证实:百度遭黑客劫持,手段类似于12月被劫持的twitter(截图)...
  4. html中的meta详解
  5. mongodb可视化工具 linux,Linux中安装启动MongoDB与可视化工具
  6. 求一个简单的php购物车,PHP简单实现购物车
  7. thinkphp3.2 代码生成并点击验证码
  8. html隐藏visibility,通过display或visibility来隐藏html元素
  9. IP记录Linux所有用户操作日志的方法(附脚本)
  10. DSP之直接存储器访问控制器
  11. 【论文解读】IJCAI2019: 面向中文NER 基于lexicon rethinking的CNN模型
  12. 同一个项目的同一DLL多版本的兼容问题
  13. php源码 备课系统,电子教案管理系统2012版 V3.2
  14. 这几天阅读的shadowgun的几个shader
  15. STM32入门系列-STM32外设地址映射
  16. verilog移位、取绝对值
  17. 陈强教授《机器学习及R应用》课程 第五章作业
  18. tyvj P1517 飘飘乎居士的乌龟(最大流)
  19. 苹果手机可以微信分身吗_微信和微信分身版有区别吗
  20. 2021最新Java后端面经合集 | 阿里腾讯百度字节

热门文章

  1. MVC 下拉列表三级联动
  2. 【转】Linux删除文件未释放空间问题处理
  3. [ZT]javascript window resize 窗口改变事件
  4. VSTS有Bug,分析数据库的维度和维度属性使用中文命名时候,作为报表参数会出错。虽然有解决办法但是头大。...
  5. (react+dva+antd)知识点总结
  6. 一网打尽Android UI 控件教程
  7. Java之Ajax技术
  8. 什么是C++标准库?
  9. 关于RCP引用jar包的几个问题。
  10. Button.Text属性换行问题(Button.Bounds自动换行)