PHP远程操纵Wordpress的方法(流程剖析)
一直想写一个给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的方法(流程剖析)相关推荐
- wordpress备份方法比较
wordpress备份方法有很多,可以直接在服务器上下载备份到本地,也可以安装插件远程备份. 1.1 最简洁的方法:导出XML文件 登陆wordpress后台,找到工具-导出-下载导出文件,然后导入到 ...
- Lerna 运行流程剖析
大家好,我是若川.持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...
- Flutter 页面更新流程剖析
文章目录 Flutter页面更新流程剖析 更新流程 渲染过程 视频课程 博主相关文章列表 Flutter 框架实现原理 Flutter 框架层启动源码剖析 Flutter 页面更新流程剖析 Flutt ...
- 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)
2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由张宁 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/communi ...
- Wordpress建站流程-最新手把手详细教程
Wordpress建设外贸网站在不懂行的人眼里好像很难,感觉需要会开发,还要雇人维护,一般人或公司都会委托建站公司帮忙搞定,我认识的价格一般在2万起,殊不知这些公司很有可能也是用wordpress套用 ...
- kali metasploit 制作后门程序远程操控基本使用方法
kali metasploit制作后门程序远程操控基本使用方法 1.后门程序的制作与加密 后门的实质就是木马 msfvenom -p windows/x64/meterpreter/reverse_t ...
- Spring Security Oauth2 单点登录案例实现和执行流程剖析
我已经试过了 教程很完美 Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在"客户端" ...
- moba上传文件到服务器,图片上传到远程服务器上的方法
图片上传到远程服务器上的方法 内容精选 换一换 将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式.本节为您介绍本地Windows计算机通过远程桌面连接,上传文件至Windows ...
- vscode 调试python 无法连接远程服务器_vscode 远程调试python的方法
此文介绍了vscode 远程调试python的方法,分享给大伙,具有如下: 实验环境 远程服务器:京东云,1核2G,centos7.3 64bit 本地环境配置 安装vscode,实验用的版本是1.1 ...
- android 保存流媒体,Android实现使用流媒体播放远程mp3文件的方法
本文实例讲述了Android实现使用流媒体播放远程mp3文件的方法.分享给大家供大家参考,具体如下: package com.shadow.util; import java.io.BufferedI ...
最新文章
- ML之sklearn:sklearn.metrics中常用的函数参数(比如confusion_matrix等 )解释及其用法说明之详细攻略
- 复现经典:《统计学习方法》第 4 章 朴素贝叶斯
- 百度网站打不开了,百度被黑了?最新证实:百度遭黑客劫持,手段类似于12月被劫持的twitter(截图)...
- html中的meta详解
- mongodb可视化工具 linux,Linux中安装启动MongoDB与可视化工具
- 求一个简单的php购物车,PHP简单实现购物车
- thinkphp3.2 代码生成并点击验证码
- html隐藏visibility,通过display或visibility来隐藏html元素
- IP记录Linux所有用户操作日志的方法(附脚本)
- DSP之直接存储器访问控制器
- 【论文解读】IJCAI2019: 面向中文NER 基于lexicon rethinking的CNN模型
- 同一个项目的同一DLL多版本的兼容问题
- php源码 备课系统,电子教案管理系统2012版 V3.2
- 这几天阅读的shadowgun的几个shader
- STM32入门系列-STM32外设地址映射
- verilog移位、取绝对值
- 陈强教授《机器学习及R应用》课程 第五章作业
- tyvj P1517 飘飘乎居士的乌龟(最大流)
- 苹果手机可以微信分身吗_微信和微信分身版有区别吗
- 2021最新Java后端面经合集 | 阿里腾讯百度字节
热门文章
- MVC 下拉列表三级联动
- 【转】Linux删除文件未释放空间问题处理
- [ZT]javascript window resize 窗口改变事件
- VSTS有Bug,分析数据库的维度和维度属性使用中文命名时候,作为报表参数会出错。虽然有解决办法但是头大。...
- (react+dva+antd)知识点总结
- 一网打尽Android UI 控件教程
- Java之Ajax技术
- 什么是C++标准库?
- 关于RCP引用jar包的几个问题。
- Button.Text属性换行问题(Button.Bounds自动换行)