小言_互联网的博客

wordpress插件使用vue+webpack开发后台界面以及使用node-wpapi和wpdb访问数据库

623人阅读  评论(0)

原文链接:https://dsx2016.com/?p=1066

公众号:大师兄2016

一.vue开发插件后台界面

wordpress本身自带jquery环境,php也可以写html代码,从而展示前端页面。

但是jquery有一些过时了,不太适合现在数据驱动开发,使用vue可以更快更好的迭代。

如上图所示,vue-cli开发的界面可以应用在插件界面中。

二.设置管理菜单

在插件的index.php中(入口文件)


  
  1. // 后台菜单初始化时创建自定义菜单
  2. add_action( 'admin_menu', 'add_diy_menu');
  3. // 设置主菜单和子菜单的函数
  4. function add_diy_menu() {
  5.   // 顶级菜单标题
  6.   add_menu_page(__( '顶级菜单'),__( '简码菜单'), 8, __FILE__, 'my_function_menu');
  7.   // 子菜单标题
  8.   add_submenu_page( __FILE__, '子菜单1', 'vue管理界面', 8, 'your-admin-sub-menu1', 'my_function_submenu1');
  9.   // 子菜单标题
  10.   add_submenu_page( __FILE__, '子菜单2', '其他测试界面', 8, 'your-admin-sub-menu2', 'my_function_submenu2');
  11. }
  12. // 主菜单界面
  13. function my_function_menu() {
  14.   // 输出div
  15.   echo "<div style='width:100%;height:1000px;background-color:#eee'>测试菜单</div>";
  16. }
  17. // 子菜单界面-演示为vue项目
  18. function my_function_submenu1() {
  19.   // 引入插件dist目录下的html
  20.   require_once( "dist/index.html");
  21. }
  22. // 子菜单界面
  23. function my_function_submenu2() {  
  24. // 获取url方式的html
  25. $html = str_get_html( 'https://dsx2016.com');
  26. echo $html;
  27.    
  28. // 也可以引入php(里面有html的内容)
  29. // include_once 'test.php';
  30. }

 

三.放入vue html资源

通过require_once("dist/index.html")之后,点击菜单就能加载html

但是会报其他cssjs等资源引用错误,原因是路径找不到。

webpack打包后的文件在dist,你也可以放在插件目录下别的文件夹

需要手动修改资源引用

根据你自己的wordpress站点目录和插件目录来修改对应的路径

查看正常访问下的目录结构

四.使用node-wpapi访问数据库

有没有什么办法,可以在独立于wordpress之外的网页访问其数据库。

wordpress提供了REST API,顾名思义,我们可以单独开发接口和界面,来查看和设置wordpress内容。

REST API 参考地址:https://developer.wordpress.org/rest-api/using-the-rest-api/client-libraries/

NODE-WPAPI 参考地址:http://wp-api.org/node-wpapi/

使用方式

首先wordpress安装插件(通过上传或者插件市场等方式),这一步很重要,解锁rest api

插件地址:https://github.com/WP-API/Basic-Auth

其次在插件的入口文件,如index.php中添加跨域设置,这一步很重要,不然无法访问数据


  
  1. add_action( 'send_headers', function() {
  2.   if ( ! did_action( 'rest_api_init') && $_SERVER[ 'REQUEST_METHOD'] == 'HEAD' ) {
  3.       header( 'Access-Control-Allow-Origin: *' );
  4.       header( 'Access-Control-Expose-Headers: Link' );
  5.       header( 'Access-Control-Allow-Methods: HEAD' );
  6.   }
  7. } );

 

然后引入库的资源文件,在vueindex.html中引入node-wpapijs文件

注意前端网页使用引入UMD套件即可,使用npm安装也行。

文档地址:http://wp-api.org/node-wpapi/installation/#download-the-umd-bundle

 

<script src="./static/js/wpapi.min.js"></script>

 

app.vue或者其他需要使用的界面文件中,添加代码

详情内容参考文档和代码注释

文档地址:http://wp-api.org/node-wpapi/using-the-client/


  
  1. // 建议等页面加载完毕后再获取window下的WPAPI
  2. mounted(){
  3.   // 引入全局api
  4.   Vue.prototype.$WPAPI= window.WPAPI
  5.   // 注册wordpress(对应站点名: http://localhost/wordpress)(这里获取到的wp就是可以操作数据的变量)
  6.   var wp = new WPAPI({ endpoint: 'http://localhost/wordpress/wp-json' });
  7.    
  8.   // 获取页面项的集合-这个操作不需要认证登录
  9.   let pagesData=wp.pages()
  10.    
  11.   // 使用登录(同样注册站点名)
  12.   var apiPromise = WPAPI.discover( 'http://localhost/wordpress/' ).then( function( site ) {
  13.       // 使用wordpress的账户登录
  14.       return site.auth({
  15.           username: 'short_code',
  16.           password: '*********'
  17.       });
  18.   });
  19.   // 需要权限的放在下面函数里(site等同于上面的wp)
  20.   apiPromise.then( function( site ) {
  21.       // 这里面的操作是认证才能进行的操作(获取网站设置,更新编辑文章等都需要认证登录)
  22.       site.settings().then( (res)=>{
  23.           console.log( `获取所有设置`,res)
  24.       })
  25.   })
  26. }

 

更多操作参考官方文档API

五.php使用wpdb操作自定义数据库

使用上述node-wpapi优点是,所有的方法都按规范写好了,拿来即用。

但是对于数据库操作,没办法自定义表和插入自定义字段和数据。

所以如果想把插件,如字体base64数据存入到单独的mysql表中,就需要wordpress提供的wpdb

官方文档:https://codex.wordpress.org/Class_Reference/wpdb

代码如下,test.php


  
  1. <?php
  2. // 允许跨域
  3. header( 'Access-Control-Allow-Origin:*'); // *代表允许任何网址请求
  4. header( 'Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE'); // 允许请求的类型
  5. header( 'Access-Control-Allow-Credentials: true'); // 设置是否允许发送 cookies
  6. header( 'Access-Control-Allow-Headers: Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin'); // 设置允许自定义请求头的字段
  7. // 获取根目录路径-很重要-根据自己的插件和php文件路径来写
  8. define( 'PATH', dirname(dirname(dirname(dirname(dirname(dirname( __FILE__)))))). '/');  
  9. // 引入配置文件才能使用wpdb-必须
  10. require_once(PATH . 'wp-config.php');
  11. // 获取全局wpdb-必须
  12. global $wpdb;
  13. // 使用wpdb操作数据库(当前为获取用户数)
  14. $user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
  15. // 要返回的json数据
  16. $ret = array(
  17. 'data' => '456',
  18. 'user_count' => $user_count, // 获取到的wordpress用户数
  19. 'permalink'=> $permalink,
  20. 'code' => 0,
  21. 'msg' => 'fail',
  22. );
  23. // 设置返回的数据格式为json
  24. header( 'content-type:application/json;charset=utf8');
  25. // 返回解码后的数据
  26. echo json_encode($ret);
  27. ?>

 

写好的php放在插件目录下,即可。

值得注意的是,因为php在插件目录中,也就是在wordpress环境中。

无论是php写前端界面,还是使用wpdb操作数据库,都不需要验证登录,因为本身就处于当前账户状态,共享cookie

六.在vue中访问插件中的php api

可以看到访问的api地址为 http://localhost/wordpress/wp-content/plugins/short_code/api/test/index2.php

基本等同于网站的目录结构和文件路径

vue中访问该php文件即可

api文件


  
  1. // 通用url前缀
  2. const BASE_URL = `/wordpress/wp-content/plugins/short_code/api/test`;
  3. // testPhp
  4. export let testPhp = `${BASE_URL}/index2.php`;

 

使用axios封装的$http访问接口


  
  1. this.$http({
  2.   method: `get`,
  3.   url: API.testPhp,
  4.   params: {}
  5. }).then( res => {
  6.   console.log( `获取php api的json数据`, res);
  7. },(err)=>{
  8.   console.log( `获取php数据错误`,err)
  9. });

 

注意vue-cli的访问一定要设置跨域处理,在configindex.js文件中设置

关于proxyTable搜索网络文档即可


  
  1. proxyTable: {
  2.   '/api': {
  3.       // 本地环境
  4.       // target: 'http://127.0.0.1:8089',
  5.       // 测试环境
  6.       target: 'http://localhost/wordpress/wp-content/api/test',
  7.       changeOrigin: true,
  8.       secure: false,
  9.       pathRewrite: {
  10.           '^/api': '',
  11.       }
  12.     }
  13. },

 

如果没有使用过vue或者react,那么使用jquery也能很快开发插件界面和交互

Tips

本片文章是《wordpress插件嵌入webFont自定义字体》的下篇,主要讲字体插件的界面编写和数据库设置方式

要把python的字体转化精简接口写出来又是另外不止一篇文章了,涉及到flask框架,api设计,服务器部署和token验证等

哪怕是一个小小的wordpress字体插件,也涉及到以下知识体系:

  • Html、Css、Js三件套等

  • Webpack+Vue+Element

  • Php、Pyhon、Node、Mysql、Nginx、Apache

  • 产品和Ui设计,最小MVP,任务分解等

多学,多做,多思考,多整理,多沉淀,打造和维护一个属于自己的感兴趣有价值的产品。


转载:https://blog.csdn.net/weixin_37865166/article/details/105610793
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场