最近一次wordpress主题开发中需要对现有用户角色功能的补充,顺带记录笔记。

注册用户角色

add_role('site_developer', '客户', array(
    'read' => true,  //文章阅读权限
    'moderate_comments' => true, //编辑、删除、修改评论权限
    'edit_posts' => false //编辑文章权限
));

角色API参考http://codex.wordpress.org/Roles_and_Capabilities
更多权限参考列表如下:

read 阅读文章
moderate_comments 管理评论
delete_posts 删除文章
edit_posts 编辑文章
delete_published_posts 删除已发布文章
publish_posts 发布文章
upload_files 上传文件
edit_published_posts 编辑已发布文章
read_private_pages 阅读私有页面
edit_private_pages 编辑私有页面
delete_private_pages 删除私有页面
read_private_posts 阅读私有文章
edit_private_posts 编辑私有文章
delete_private_posts 删除私有文章
delete_users 删除用户
edit_users 编辑用户
edit_themes 编辑主题
edit_plugins 编辑插件

添加/增加用户字段

 /*
 * 自定义用户个人资料信息
 */
add_filter( 'user_contactmethods', 'func_add_contact_fields' );
function func_add_contact_fields( $contactmethods ) {
    $contactmethods['qq'] = 'QQ';
    $contactmethods['qm_mailme'] = 'QQ邮箱“邮我”';
    $contactmethods['qq_weibo'] = '腾讯微博';
    $contactmethods['sina_weibo'] = '新浪微博';
    $contactmethods['twitter'] = 'Twitter';
    $contactmethods['google_plus'] = 'Google+';
    $contactmethods['donate'] = '赞助链接';
    unset( $contactmethods['yim'] );
    unset( $contactmethods['aim'] );
    unset( $contactmethods['jabber'] );
    return $contactmethods;
}

提供一份wordpress主题开发中的优化项目,经过许多版本迭代的最优体验。

随着wordprss功能的越来越完善,同时也越来越臃肿,有必要进行响应的优化工作,特别是对于做企业网站开发而言。

清除控制台不必要功能

add_action('wp_dashboard_setup', 'example_remove_dashboard_widgets' );
function example_remove_dashboard_widgets() {
    // 控制面板优化
    global $wp_meta_boxes;
    unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']); // 删除 "快速发布" 模块
    unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']); // 删除 "引入链接" 模块
    unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']); // 删除 "近期评论" 模块
    unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);  // 删除 "近期草稿" 模块
    unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);  // 删除 "WordPress 开发日志" 模块
    unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);  // 删除 "其它 WordPress 新闻" 模块
    unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']); // 删除 "概况" 模块
}
//移除不必要后台菜单选项
add_action( 'admin_menu', 'wpjam_remove_admin_menus' );
function wpjam_remove_admin_menus(){
    remove_menu_page( 'index.php' );                  //移除“仪表盘”-隐藏版本更新提示
    remove_menu_page( 'edit-comments.php' );          //移除“评论”
    //remove_menu_page( 'plugins.php' );              //移除"插件"
    remove_menu_page( 'tools.php' );                  //移除"工具"
    remove_submenu_page( 'options-general.php', 'options-writing.php' );    //移除二级菜单:“设置”——“撰写”
    // remove_submenu_page( 'options-general.php', 'options-discussion.php' ); //移除二级菜单:“设置”——“讨论”
    // remove_submenu_page( 'options-general.php', 'options-media.php' );      //移除二级菜单:“设置”——“多媒体”
}

remove_action('admin_init', '_maybe_update_themes');
add_filter('pre_site_transient_update_themes',  create_function('$a', "return null;"));//禁用主题更新
remove_action( 'load-update-core.php', 'wp_update_plugins' );
add_filter( 'pre_site_transient_update_plugins', create_function( '$a', "return null;" ) );//禁用插件更新
remove_action('admin_init', '_maybe_update_core');
add_filter('pre_site_transient_update_core',    create_function('$a', "return null;")); //禁用版本更新

移除不必要的选项

// Remove Actions
remove_action('wp_head', 'feed_links_extra', 3); // feeds链接
remove_action('wp_head', 'feed_links', 2); 
remove_action('wp_head', 'rsd_link'); //移除head中的rel="EditURI"
remove_action('wp_head', 'wlwmanifest_link'); //移除head中的rel="wlwmanifest"
remove_action('wp_head', 'index_rel_link'); // 
remove_action('wp_head', 'parent_post_rel_link', 10, 0); // Prev link
remove_action('wp_head', 'start_post_rel_link', 10, 0); // Start link
remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0); //
remove_action('wp_head', 'wp_generator'); //禁止在head泄露wordpress版本号
remove_action('wp_head', 'start_post_rel_link', 10, 0);
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
remove_action('wp_head', 'rel_canonical');
remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0);



https://nodejs.org/dist/

《Node.js 调试指南》

@ruanyf
Chrome 浏览器允许将任意 HTTP 请求,转成 curl 命令的形式,从而在命令行发出这个请求。
这里还有一个小工具,可以将 curl 请求转成 Node 脚本。https://curl.trillworks.com/#node

版本号

使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。

语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。

如果只是修复bug,需要更新Z位。
如果是新增了功能,但是向下兼容,需要更新Y位。
如果有大变动,向下不兼容,需要更新X位。
版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。

NPM支持的所有版本号范围指定方式可以查看官方文档
Node 调试工具入门教程

node的http服务器

var http = require('http');
var fs = require('fs');
var documentRoot = 'D:/20180626/code'; //设置文件的根目录,可以修改为个人的自定义目录。
var server = http.createServer(function(req,res) {
    var url = req.url;
    var file = documentRoot + url;
    console.log(url);
    fs.readFile(file,function(err,data) {
        if(err){
            res.writeHeader(404,{
                'content-type':'text/html;charset="utf-8"'
            });
            res.write('<h1>404错误</h1><p>你要找的页面不存在</p>');
            res.end();
        }else{
            res.writeHeader(200,{
                'content-type':'text/html;charset=utf-8"'
            });
            res.write(data);
            res.end();
        }
    });
}).listen(8888);//设置的端口号,建议为6000以上。
console.log('服务器开启成功');


http://phpstudy.php.cn/
php5.6+Redis+Windows7安装 (phpstudy)
详解PhpStudy集成环境升级MySQL数据库版本
上面的教材安装前

mysql服务是你自己想要升级mysql服务生成的(前提是你按照了百度上所说的在你想要升级的mysql文件中使用了mysql
-install 等命令,在此还要强调一点,在这个之前,你原来的Mysql文件中你还要执行mysqld -remove!有同学会问了,这是为什么?因为啊。phpstudy是一个集成软件,你装好后,apache + mysql + php都是一起装好的,而Mysqla 就是phpstudy帮你注册的服务,所以你要删了。)

那说道这边,有些同学会问了,那说了这么久,你还是没说为什么phpstudy会起不来mysqlde
服务。其实说到这边,我已经说的很明确了。mysqla既然是phpstudy帮你注册的服务,那你自己mysqld
-install的注册的服务是mysql。那只要,在服务列表中让phpstudy生成一个mysqla的服务就行了啊!哈哈哈,聪明,那怎么做?emmmmmmm,无法截图。。。我直接说吧,打开phpstudy找到服务管理-->mysql-->安装服务!好了!这时候,就是你的时间了。link
start~

然后安装完后,搜索cmd(因为这样才能以管理员身份运行),
以管理员身份运行,标题显示为“选择管理员:命令提示符”
输入大写D: 进入D盘

C:\WINDOWS\system32>D:

D:\>cd phpStudy/PHPTutorial/MySQL

D:\phpStudy\PHPTutorial\MySQL>cd bin

> mysqld --initialize
> mysqld -install

D:\phpStudy\PHPTutorial\MySQL\bin>mysqld --initialzie
2018-06-10 23:28:58 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-06-10 23:28:58 0 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
2018-06-10 23:28:58 0 [Note] mysqld (mysqld 5.6.40) starting as process 7768 ...

D:\phpStudy\PHPTutorial\MySQL\bin>mysqld --install
Service successfully installed.

D:\phpStudy\PHPTutorial\MySQL\bin>

安装好phpstudy后,升级了MySQL后,通过phpstudy启动,Apache可以启动,Mysql无法启动。
解决方法:
之前已经装过Mysql,要把系统服务里面的MySQL删除,留下MySQLa服务。
同样以管理员身份运行cmd命令行下输入:sc delete mysql 即可删除。
重启即可。

phpStudy本地环境测试,打开网页很慢的解决办法!






请输入图片描述
以上图来自这里
各位程序猿们,如果你觉得老板 10 天要你们上线一个 App 是一个丧心病狂的事情,
那么可以多想想这位哥。
Youtube 上有位哥的采访,你可以听听大神当年的故事。
https://www.youtube.com/watch?v=IPxQ9kEaF8c
当然,码农和大神的区别在于:遇到这种事情,10 天以后码农死掉了,而大神成功了。
只是但凡这种极速上线的事情,都会留下一堆的坑,大神和码农的的区别,也就是水洼和天坑的区别。

作者:罗志宇
链接:https://www.zhihu.com/question/31415286/answer/58022648
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

js混淆

https://javascriptobfuscator.herokuapp.com/
http://www.jsfuck.com/
移动时代的前端加密
从零开始的webpack生活-0x004:js压缩混淆
https://www.v2ex.com/t/381946
https://www.v2ex.com/t/392624
https://www.v2ex.com/t/363167

JavaScript

前端程序员经常忽视的一个JavaScript的面试试题
妙味课堂 JS 实战开发课程大纲
JavaScript (脚本之家)
JavaScript教程 (廖雪峰)
React.js-demo (阮一峰)(GitHub)
webpack-demos (阮一峰)
react-babel-webpack-boilerplate (阮一峰)
ECMAScript的兼容 && 兼容包
ECMAScript5.1中文版 + ECMAScript3 + ECMAScript(合集) && 英文版
30分钟掌握ES6/ES2015核心内容(上)
30分钟掌握ES6/ES2015核心内容(下)
ECMAScript 6 入门 (阮一峰)(GitHub)
ES6 全套教程 ECMAScript6 (原著:阮一峰)
JavaScript 标准参考教程(alpha) (阮一峰)(GitHub) 新地址 https://wangdoc.com/
悟透JavaScript
原生态纯JavaScript 100大技巧大收集
前端日常:JavaScript验证
JS实战实例教程
前端代码异常日志收集与监控
stylus中文版参考文档之综述
JavaScript深入系列(15篇)、JavaScript专题系列、ES6系列、React系列
Awesome JavaScript

递归

js 递归、非递归生成树
https://www.cnblogs.com/ygunoil/p/12524806.html

浮点型数据使用注意事项
JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。

所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定:
var x = 0.1;
var y = 0.2;
var z = x + y // z 的结果为 0.3
if (z == 0.3) // 返回 false
为解决以上问题,可以用整数的乘除法来解决:
var z = (x 10 + y 10) / 10; // z 的结果为 0.3

不推荐使用 TAB 键来缩进,因为不同编辑器 TAB 键的解析不一样。

关于js三元表达式,多个判断条件的写法
以两个判断条件为例,直接上代码:

var a = 3;
var b = a === 1 ? '是1' : (a === 2 ? '是2' : '不是1也不是2')
console.log(b); //不是1也不是2

Bridge

https://github.com/wendux/DSBridge-Android
https://github.com/wendux/DSBridge-IOS
原生与 JS 交互,里面有demo 例子

模块化规范

js模块化编程之彻底弄懂CommonJS和AMD/CMD!
CommonJS、requirejs、ES6的对比
Js apply call方法 详解
javascript 六种数据类型(一)
10 个技巧,让你更专业地使用 console 进行 JS 调试
High performance JavaScript templating engine

零碎

从谷歌的JavaScript编写风格中,13 点值得我们注意的! && google jsguide
不会Object.defineProperty你就out了 && MDN

聊聊函数节流(throttle)和函数去抖(debounce)

https://unpkg.com/browse/vue@2.6.10/
https://cdn.jsdelivr.net/npm/vue/
在 unpkg 和 cdnjs 上获取

https://github.com/lodash/lodash/ && 中文文档地址 && 中文文档2
https://www.npmjs.com/package/ramda && 中文
Lodash,你正在使用的JavaScript库
轻量高效的开源JavaScript插件和库

http://www.freejs.net/

节流 (throttle) 让一个函数不要执行的太频繁,减少执行过快的调用,叫节流
去抖 (debounce) 去抖就是对于一定时间段的连续的函数调用,只让其执行一次
https://segmentfault.com/a/1190000025137536
防抖与节流 ,优化

屏蔽F12

<script type="text/javascript">
window.onload = function() {
    document.onkeydown = function() {
       var e = window.event || arguments[0];
       //屏蔽F12
       if(e.keyCode == 123) {
           return false;
           //屏蔽Ctrl+Shift+I
       } else if((e.ctrlKey) && (e.shiftKey) && (e.keyCode == 73)) {
           return false;
         //屏蔽Ctrl+Shift+J
       } else if((e.ctrlKey) && (e.shiftKey) && (e.keyCode == 74)) {
           return false;
           //屏蔽Shift+F10
       } else if((e.shiftKey) && (e.keyCode == 121)){
           return false;
       } else if(event.ctrlKey  &&  window.event.keyCode==83 ){
           return false;
       }
   };
   //屏蔽右键单击
   document.oncontextmenu = function() {
       return false;
   }

   //debugger
   var hasDebugger = false;
    var start = new Date();
    try {
    // 新建一个匿名函数,这样 debugger 得不到任何信息
        (function() {}).constructor('debugger')()
        if (new Date() - start > 200) {
            hasDebugger = true;
            window.close(); //关闭当前窗口(防抽)
            window.location="about:blank"; //将当前窗口跳转置空白页
        }
    } catch(e) {
        //alert(hasDebugger)
        window.close(); //关闭当前窗口(防抽)
        window.location="about:blank"; //将当前窗口跳转置空白页
    }
}
</script>

语言排名

排名

总结

EventUtil——跨浏览器的事件对象
JavaScript 的 this 原理
JS前端开发联盟群
javascript学习思维导图(收藏)
[转] js async await 终极异步解决方案

显示多少帧
https://www.testufo.com/

const showFPS = (function () {

// noinspection JSUnresolvedVariable, SpellCheckingInspection
const requestAnimationFrame =

window.requestAnimationFrame || // Chromium window.webkitRequestAnimationFrame || // Webkit window.mozRequestAnimationFrame || // Mozilla Geko window.oRequestAnimationFrame || // Opera Presto window.msRequestAnimationFrame || // IE Trident? function (callback) { // Fallback function window.setTimeout(callback, 1000 / 60); };
let dialog;
let container;
let fps = 0;
let lastTime = Date.now();
function setStyle(el, styles) {

for (const key in styles) { el.style[key] = styles[key]; }
}

function init() {

dialog = document.createElement('dialog'); setStyle(dialog, { display: 'block', border: 'none', backgroundColor: 'rgba(0, 0, 0, 0.6)', margin: 0, padding: '4px', position: 'fixed', top: 0, right: 'auto,', bottom: 'auto', left: 0, color: '#fff', fontSize: '12px', textAlign: 'center', borderRadius: '0 0 4px 0' }); container.appendChild(dialog);
}

function calcFPS() {

let offset = Date.now() - lastTime; fps += 1; if (offset >= 1000) { lastTime += offset; displayFPS(fps); fps = 0; } requestAnimationFrame(calcFPS);
}

function displayFPS(fps) {

const fpsStr = `${fps} FPS`; if (!dialog) { init(); } if (fpsStr !== dialog.textContent) { dialog.textContent = fpsStr; }
}
return function (parent) {

container = parent; calcFPS();
};
}());
showFPS(document.body);




875571
https://www.w3cplus.com/javascript/webpack-config-part1.html

Webpack 打包优化之体积篇
Webpack 打包优化之速度篇
(webpack系列二)webpack打包优化探索

Webpack按需打包Lodash的几种方式

webpack 打包JS 的运行原理

优化

使用可视化图表对 Webpack 2 的编译与打包进行统计分析

全局引入lodash,报错

index.js(main.js)

import _                from 'lodash';

// 设置lodash 全局

window._ = _;


warning  '_' is not defined  no-undef

https://stackoverflow.com/questions/45317154/error-is-not-defined-no-undef

.eslintrc

"globals" : {
    "$axios": false,
    "$store": false,
    "APIs": false,
    "__PROJECTDIR__": false,
    "_": true
  },


ESLint配置清单

ESLint官方提供的一份标准配置
阿里eslint-config-ali
腾讯AlloyTeamAlloyTeam ESLint 配置指南
Airbnb JavaScript Style Guide



前端面试题集锦 && GitHub
总结前端面试过程中最容易出现的问题
前端面试题
前端工作面试问题
面试时HR问:“你离职的原因是什么?”两种回答,结局大不相同!

HTML 问题
CSS 问题
JS 问题

前端面试考点多?看这几篇文章就够了

BAT 要的是什么样的前端实习生?

前端笔试题面试题记录(上)|

请你介绍下所做的项目

别人问你http协议,到底是想问什么?

Java面试通关要点汇总集【终极版】

常见 Web 安全攻防总结

解耦基本可以遵循三个原则:

分层设计
单向依赖
服务抽象

version:1.2
url?=是参数query string
调试时遇到浏览器缓存
浏览器认为不同的url而重新请求
从而避免缓存

写简历

基本信息,姓名,年龄,手机,邮箱,籍贯
学历,博士,硕士,本科,大专
工作经历,时间,公司,岗位,职责,技术栈,业绩
自我陈述
把握面试的沟通方向
豁达,自信的适度发挥

大厂员工接触的技术面很窄吗?

当然,也有人说了,“我所谓的螺丝钉并非做重复机械的工作,而是说只能接触到一小块业务或技术点,无法接触到系统的全貌”。

这个确实是事实,毕竟大厂有非常多的研发人员。所以一般会将一个复杂的系统拆散成多个零部件,每个小组或每个人做其中一块。

但我想说的是,只接触其中一块领域,你就不能成长了吗?大厂和小厂的最大区别是什么?是用户量级。一般的小厂是十几万或几十万的 DAU,而大厂往往是上千万甚至上亿的 DAU,同样一段代码,在小厂里能良好运行,但到了大厂,就会发现里面存在非常多问题。

大厂求精通,求深度;小厂求速度,求广度。

如果你在大厂,就应该尽可能深入去研究你参与的模块,多想想如何把你所做的模块优化到极致,在巨大的用户量面前依然能够稳定运行。相信我,这样的一份经验可以成为未来无数次面试的一大亮点。


docker入门指南 - - 基本操作篇
Docker新手入门实战教程
Docker 教程
Docker入门学习笔记
Docker 资源汇总
一键创建docker 容器 指定ip,指定主机名,指定容器名称,指定镜像创建容器
开源 - 快速生成docker小鸡的方法(类似openvz)

Docker — 从入门到实践 && https://www.yuque.com/grasilife/docker

面板

https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe
https://download.docker.com/win/stable/Docker for Windows Installer.exe
https://download.docker.com/mac/stable/Docker.dmg
有docker面板推荐没

开发环境

https://github.com/yeszao/dnmp

https://github.com/LaraDock/laradock
https://github.com/RystLee/DevDock
https://segmentfault.com/a/1190000006802383
PHP 开发环境

请问如何卸载呢?

docker-compose down
docker ps -a
docker image ls -a
docker rm [container_id]
docker rmi [image_id]

chown -R 1000.1000 /data/webroot/m69w
find /data/webroot/m69w -type d -exec chmod 755 {} \;
find /data/webroot/m69w -type f -exec chmod 644 {} \;

docker ps -a

cp config.sample.inc.php config.inc.php
vim config.inc.php

docker exec -it bypanel-phpmyadmin-1 bash


docker cp bypanel-phpmyadmin-1:/var/www/html/config.inc.php /opt/bypanel/cfg/phpmyadmin/config.inc.php
https://blog.csdn.net/accress/article/details/17582923
docker cp bypanel-phpmyadmin-1:/var/www/html/libraries/config.default.php /opt/bypanel/cfg/phpmyadmin/config.default.php
docker cp /opt/bypanel/cfg/phpmyadmin/config.default.php bypanel-phpmyadmin-1:/var/www/html/libraries/config.default.php
docker cp /opt/bypanel/cfg/phpmyadmin/config.php bypanel-phpmyadmin-1:/var/www/html/libraries/config.php

docker cp bypanel-phpmyadmin-1:/var/www/html/import.php /opt/bypanel/cfg/phpmyadmin/import.php

docker cp /opt/bypanel/cfg/phpmyadmin/config.inc.php bypanel-phpmyadmin-1:/var/www/html/config.inc.php

unzip /opt/bypanel/cfg/phpmyadmin/xxx.zip /opt/bypanel/cfg/phpmyadmin/xxx.sql

docker cp /opt/bypanel/cfg/phpmyadmin/xxx.sql bypanel-phpmyadmin-1:/var/www/html/upload/




docker exec -i your_mysql_container_name mysql -u your_username --password=your_password your_database < path_to_your_database_dump.sql

docker exec -i  bypanel-mysql-1 mysql -u userName --password=password sqlName < /opt/bypanel/cfg/phpmyadmin/xxx.sql



mkdir upload
mkdir save