从0打造wordpress插件wp2oc fileshare (1) – 将wp存储后端做进owncloud
关键字:wp2oc fileshare,wordpress媒体存进网盘,网盘作为wordpress图床,owncloud wordpress backend storage
其实用网盘做wordpress网站的图床一直是一个很流行的想法,业界存在oss,七牛网盘,百度盘wp2pcs,wp2pcs_sy方案,不过oss,七牛,百度盘pcs这三者始终是面向外接第三方服务,这些都不能得到服务保障,其中免费且最好用的百度盘pcs api需要申请权限,实用性大打拆扣。
这里我们选择的用owncloud作为wordpress的存储后端,这二者生态相似,完成后的插件可以,1,基本(不能完全)代替wordpress原生图片媒体管理功能,2,网盘图床的操作/备份符合在文件夹操作文件习惯,且可以网盘特有的同步方式进行备份和打包,3,当媒体文件很大时,转移wordpress整个媒体也就是改一条外链。不再需要涉及到数据库备份。4,当然还有更多。。
1,确立需求:我们仅需要开发一个APP
我们需要的仅仅是将owncloud存储服务做进wordpress,owncloud有自己的rest api,可以将其服务以wordpress插件的方式做进wordpress形成其后端图床。
我们找到的是ocs filessharing api,为什么必须是fileshare而不是file呢,因为做图床的网盘必须是可以外链的。主要用到的是其get all share部分,所需的参数形式是http://www.xxx.com/ocs/path?=/dir&subfiles=true,首先对于使用到的参数部分我已经在后台加了设置接口了,主要就是四个:
接下来就是开发和调试了
PS:开发是一步一步确立调试的过程,如果说编码确定技术点然后一个一个攻克是寻龙过程,因为龙比较大还是比较容易发现的,而调试则是一个捉虫的过程,常指代开发过程中,这二者所花的时间和过程往往在开发软件和APP(APP指一些小软件只有几个)穿插。尤其是调试部分,需要频繁进行,一个负责的开发实践往往要体现这二者。
在下面的各个技点难点中,我们会同时谈到技术点和调试手段,即龙和虫:
2,技术难点:wordpress plugin开发
1,往wordpress媒体上传框新加选项卡,以下参阅了否子戈的部分代码。
// 在新媒体管理界面添加一个百度网盘的选项
function wp_storage_to_pcs_media_tab($tabs){
// if(!is_wp_to_pcs_active())return;
$newtab = array(‘tab_slug’ => ‘From Owncloud Fileshare’);
return array_merge($tabs,$newtab);
}
add_filter(‘media_upload_tabs’, ‘wp_storage_to_pcs_media_tab’);
// 这个地方需要增加一个中间介wp_iframe,这样就可以使用wordpress的脚本和样式
function media_upload_file_from_pcs_iframe(){
wp_iframe(‘wp_storage_to_pcs_media_tab_box’);
}
add_action(‘media_upload_tab_slug’,’media_upload_file_from_pcs_iframe’);
?>
2,改造owncloud files_sharing app,使之显示链接文件而不是外链共享文件。这是因为原文件中得到的结果是返回所有的共享而不是指定root share dir下的所有文件,而后者才是我们需要的,我使用的是8.0.16的相关文件,简单修改如下:
private static function getSharesFromFolder($params) {
$path = $params[‘path’];
$view = new OCFilesView(‘/’.OCPUser::getUser().’/files’);
if(!$view->is_dir($path)) {
return new OC_OCS_Result(null, 400, “not a directory”);
}
$content = $view->getDirectoryContent($path);
$result = array();
foreach ($content as $file) {
$result = array_merge($result, array(‘1’=>$file[‘name’]) );
}
return new OC_OCS_Result($result);
}
3,调试明确rest api一次request/response过程中的数据主要是什么形式的:
好像bookmark用的rest api是第一代,用的是json,而ocs api用的是owncloud api,那为什么二套可以共存呢,这是因为开源软件都是慢慢发展起来的,历史遗留中好的部分会存在很久。
注意,这里会出现不确定的复杂情况比如无限要求密码,此时记得要清空浏览器所有缓存重新粘贴完整url,调试一次就要清空一次才能保障调试结果顺利进行。
4,让owncloud ocs rest api免密码,这是因为上面的调视是可视化进行的,而owncloud ocs api是需要程序内编码验证的,而这些不能浏览器端以传递给URL的方式进行,只能通过CURL http basic auth方式进行,能传给URL的是以上几个提到的配置参数。
function wp_storage_to_pcs_media_list_files(){
$ch = curl_init(“get_option(‘oc2wpfs_oc_server’)”./ocs/v1.php/apps/files_sharing/api/v1/shares?path=get_option(‘oc2wpfs_oc_dir’).”&subfiles=true”);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, “get_option(‘oc2wpfs_oc_user’):get_option(‘oc2wpfs_oc_password’)”);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
……
}
得出以下基本调试视图:
好了,接下来就是把获到的API response解析为上传媒体上的文件,让editor支持选择媒体等部分了。这样插件就基本完成了,留到以后做。。
(此处不设回复,扫码到微信参与留言,或直接点击到原文)
- [实录]解决Migrator.Net 小bug
- Jenkins Pipeline插件十大最佳实践!
- Spring Cloud Hystrix的请求合并
- JQuery JCshare 0.1 分享插件
- Java中的即时编译(Just-in-time compilation)
- 无尽的忙碌换来幸福的日子
- 消费者驱动的微服务契约测试套件:Spring Cloud Contract
- 自己做的一个小程序 可采集、导出、模板、配置
- 分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(上)
- .NET反射、委托技术与设计模式
- 我最常用的Intellij IDEA快捷键
- 用Js控制TextBox不能复制粘贴
- 漫画:什么是单例模式?(整合版)
- 保护连接字符串
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centos7 安装 jdk8 的正确姿势 实践笔记
- 初探雾效果!shader 源码分析与讲解! Cocos Creator 3D Shader Fog !
- js键盘键值大全
- mysql用户创建+密码修改+删除用户+角色分配 的正确姿势 实践笔记
- Centos7 安装 Nginx 的正确姿势 并设置开机自启 实践笔记
- js函数大全(2)
- HTML之打开/另存为/打印/刷新/查看原文件等按钮的代码
- Centos7 安装 Keepalived+Nginx 双机热备HA 的正确姿势 并开机自启 实践笔记
- 从 findbugs-maven-plugin 到 spotbugs-maven-plugin 帮你找到代码中的bug
- nmap常用命令检查主机在线与在线主机端口开放情况
- 想做测试工程师的可以看看
- nginx 实现Web应用程序的负载均衡
- 线上遇到nginx Cors跨域请求OPTIONS方法405 Method Not Allowed问题
- 常见Linux命令的正确打开姿势 实践笔记 更新中
- 用gogs轻松搭建个人的git服务器