wordpress插件开发从创建一个新的菜单开始

创建插件的目的

1.我们为什么要创建一个插件?

  • IT界有一个知名的论调叫做不要造重复的轮子,如果有可能的话,你应该尽可能的从现有的网络资源上选择一个已有的插件来使用,而不是重新创造一个。它耗费的精力很可能是没有相应价值的。所以在创建一个插件之前,你应该先去wordpress的插件仓库搜索关键词,看一下是不是已经有了满足需求的插件。

2.你希望你的插件具有什么功能?

  • 在开始开发之前,想好这个问题,能帮你省去很多麻烦。比如,你的插件是提供给前台页面使用的还是在后台页面使用的?是后台的独立模块么?它应该有哪几个页面,页面上应该有哪些功能?怎么去设计这个页面的布局?这些问题,都需要有一个清晰的规划。

前置工作

尽管我们在梳理开发流程中已经提到了如何创建一个插件,但是我们还是要再说一次,以防有些读者没有看到。

1.打开WordPress安装目录下的wp-content目录。

2.打开plugins目录。

3.创建一个新目录并在插件后命名(例如plugin-name)。

4.打开新插件的目录。

5.创建一个新的PHP文件(例如,在插件后命名此文件也很好plugin-name.php)。

开始开发

就像下面的示例一样,你必须在你创建的主插件文件的开头加上一段doc注释来告诉wordpress这是个插件,当然也可以加上作者,邮箱等信息,下面只是简单示例,详细可以在我们梳理流程的那边博文/或者官网中看到。

1
2
3
4
5
6
7
8
9
//wp-content/plugin-name/plugin-name.php
<?php
/**
* Plugin Name: 插件名称
*/
function do_something_else()
{
//.....你的代码
}

还记得我们在第一篇梳理中提到的三个基础插件钩子么?

1.register_activation_hook //启用插件时触发的钩子

2.register_deactivation_hook//禁用插件时触发的钩子

3.register_uninstall_hook//删除插件时触发的钩子

我们可以通过这三个钩子函数来做一下一些前置/后置的处理,比如说插件被启用时创建一个自定义数据表,初始化一些配置,禁用时恢复初始化设置,删除时删除自定义的数据表。

这里我们先不展开来讲我们在讲OptionApi的时候再讲这个。

准备工作都已经做好了,我们现在开始正式的开发。我们假设说我们要做的是一个额外的内容管理插件。那我们现在想要在后台创建一个定制内容管理菜单,该怎么做呢?

wordpress向我们提供了一个add_menu_page的函数:

1
2
3
4
5
6
7
8
9
10
11
12
/**
//我们先看一下函数的参数
add_menu_page(
string $page_title, //页面标题
string $menu_title, //菜单名称
string $capability, //权限级别
string $menu_slug, //菜单标识 唯一
callable $function = '', //回调函数 其实就是点击这个菜单后触发的函数 我们可以返回一个页面
string $icon_url = '', //图标,可以为空
int $position = null //位置 决定了菜单应该插入在第几个
);
**/

那我们应该怎么使用呢?

for-example :

你的wp-content/plugin-name/plugin-name.php文件,看起来应该像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
/*
Plugin Name: 定制内容管理
Plugin URI: http://ergou.fun
Description: 内容管理模块(自定义内容非posts)
Version: 1.0
Author: ergou
Author URI: http://ergou.fun

Copyright 2019 ergou (email : 531432012@qq.com)

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

/** 第1步:创建自定义菜单的函数**/
function ergou_cms_plugin_menu()
{
add_menu_page('定制内容管理', '内容管理', 'manage_options', 'ergou-cms-manager', 'ergou_cms_plugin_options', '', 7);

}

/** 第2步:将函数注册到钩子中 */
add_action('admin_menu', 'ergou_cms_plugin_menu');

/** 第3步:定义选项被点击时打开的页面 */
function ergou_cms_plugin_options()
{
if (!current_user_can('manage_options')) {
wp_die(__('You do not have sufficient permissions to access this page.'));
}
//include_once(plugin_dir_path(__FILE__) . 'detail/index.php');

//也可以直接返回HTML,不过我建议是额外放一个文件,这样以后维护起来好处理

//你可以直接 echo "hello world"
echo "Hello World";
wp_die();
}

我们现在回到我们的后台管理页面点击插件管理你会发现多了一个,定制内容管理的菜单,点击启用。菜单就会增加在左侧顶级菜单里。点击定制内容管理菜单,页面输出了"Hello World"。至此,我们算是完成了第一步。

本篇内容就是这些。That’s all .Thank you .

wordpress插件开发流程梳理(二)插件最佳实践

开发插件的最佳实践

避免命名冲突

当您的插件对变量,函数或类使用相同的名称作为另一个插件时,会发生命名冲突。

幸运的是,您可以使用以下方法避免命名冲突。

程序性

默认情况下,所有变量,函数和类都在全局命名空间中定义,这意味着您的插件可以覆盖由另一个插件设置的变量,函数和类,反之亦然。在函数或类中定义的变量不受此影响。

前缀一切

所有变量,函数和类都应以唯一标识符为前缀。前缀可防止其他插件覆盖您的变量并意外调用您的函数和类。它也会阻止你做同样的事情。

检查现有实现

PHP提供了许多函数来验证变量,函数,类和常量的存在。如果实体存在,所有这些都将返回true。

  • 变量: isset() (包括数组,对象等)
  • 函数: function_exists()
  • 类: class_exists()
  • 常量:defined()

OOP面向对象

解决命名冲突问题的一种更简单的方法是使用类来获取插件的代码。

您仍然需要检查是否已经使用了您想要的类的名称,但其余的将由PHP处理。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if ( !class_exists( 'WPOrg_Plugin' ) ) {
class WPOrg_Plugin
{
public static function init() {
register_setting( 'wporg_settings', 'wporg_option_foo' );
}

public static function get_foo() {
return get_option( 'wporg_option_foo' );
}
}

WPOrg_Plugin::init();
WPOrg_Plugin::get_foo();
}

目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
/plugin-name
plugin-name.php //插件主文件,必须和文件夹名保持一致
uninstall.php //卸载插件时自动运行的脚本
/languages //国际化语言包
/includes //其他功能脚本
/admin
/js
/css
/images
/public
/js
/css
/images

条件加载

将管理代码与公共代码分开是有帮助的。使用条件is_admin()。

示例:

1
2
3
4
5
<?php
if ( is_admin() ) {
// we are in admin mode
require_once( dirname( __FILE__ ) . '/admin/plugin-name-admin.php' );
}

文件结构参考

参考模板

对于您编写的每个新插件,您可能希望从样板开始,而不是从头开始。使用样板的一个优点是在您自己的插件之间保持一致。如果使用他们熟悉的样板,使用模板也可以让其他人更容易为您的代码做出贡献。

这些也可作为不同但可比较的架构的进一步示例。

注:本篇,完全是由官方文档翻译而来,描述了一个好的插件的最佳实践。该用什么样的目录结构,什么时候该做一些权限的判定,甚至Github上提供了一些可参考的模板,以防我们的代码写出来像坨屎一样。我也希望自己写出来的插件,且不说功能如何,最起码不被喷This is shit .所以你看到,我们现在花一些功夫来从头梳理,流程。真正开发流程中遇到的问题,我会在后边的时候提到。

wordpress插件开发流程梳理

1.声明一个插件

首先我们必须明白,wordpress的插件可以是单文件,也可以是多文件,css/html都不是必须的,以下举例暂且在单文件模式下

比如我们要创建一个名为 hellophp的插件,那我们就需要在wp-content/plugins目录下新建hellophp文件夹和hellophp.php文件,但是这还是不能让系统识别这个插件。插件的主文件名要和目录一致。

在wordpress中,要让系统识别一个插件,首先要做的就是,声明一个DOCBLOCK(文档块)

示例:

wp-content/plugins/hellophp/hellophp.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<?php
/**
* Plugin Name: hellophp
* Plugin URI: https://example.com/plugins/the-basics/
* Description: Basic WordPress Plugin Header Comment
* Version: 0.0.0
* Author: WordPress.org
* Author URI: https://author.example.com/
* License: GPL2
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: wporg
* Domain Path: /languages
*/

//完整的示例是这样,但是除了Plugin Name其他都不是必须的

2.初始化插件

  • wordpress-hook

    • register_activation_hook( FILE, ‘pluginprefix_function_to_run’ ); //启用插件时的钩子
    • register_deactivation_hook( FILE, ‘pluginprefix_function_to_run’ );//停用插件时的钩子

示例:

示例摘自官方文档,启动插件钩子最常见的用途之一是当插件注册自定义帖子类型时刷新WordPress永久链接。这摆脱了令人讨厌的404错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//启用插件时的处理
function pluginprefix_setup_post_type() {
// register the "book" custom post type
register_post_type( 'book', ['public' => 'true'] );
}
add_action( 'init', 'pluginprefix_setup_post_type' );

function pluginprefix_install() {
// trigger our function that registers the custom post type
pluginprefix_setup_post_type();

// clear the permalinks after the post type has been registered
flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'pluginprefix_install' );

//停用插件时的处理
function pluginprefix_deactivation() {
// unregister the post type, so the rules are no longer in memory
unregister_post_type( 'book' );
// clear the permalinks to remove our post type's rules from the database
flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'pluginprefix_deactivation' );

如果您不熟悉注册自定义帖子类型,请不要担心 - 稍后将对此进行介绍。使用这个例子只是因为它很常见。

注:这部分看不懂也没关系,这两个钩子也并不是必须的,如果你要做一些必要的前置工作,比如说启用插件时,创建一个新的数据表,初始化一些变量之类的前置操作来保证插件的正常运行,可以使用这个钩子,如果没有这样的操作,这个钩子不用也可以。

3.插件的卸载

从站点卸载插件时,您的插件可能需要进行一些清理。

如果用户已停用插件,则会认为已卸载插件,然后单击WordPress管理中的删除链接。

卸载插件时,您需要清除插件和/或其他数据库实体(如表)的任何插件选项和/或设置。

卸载插件有两种方法:

  • 系统的钩子函数

    1
    register_uninstall_hook(__FILE__, 'pluginprefix_function_to_run');
  • 自定义卸载脚本uninstall.php

你需要在你插件的根目录创建一个uninstall.php文件

示例:

示例脚本演示了一个删除自定义表的清理工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// if uninstall.php is not called by WordPress, die
// 防止误操作直接访问该文件
if (!defined('WP_UNINSTALL_PLUGIN')) {
die;
}

$option_name = 'wporg_option';

//这两行是删除插件的一些附加配置,后边我会继续说这个
delete_option($option_name);

// for site options in Multisite
delete_site_option($option_name);

// drop a custom database table
global $wpdb;
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}mytable");

这是wordpress插件开发流程梳理的第一篇,就先这样,后续会继续梳理。本文的示例和描述,大部分来自官方文档。

如何修改layer/layui中的confirm

需求:

原始图改成修改后

背景:

这个confirm是layui中的layer弹出框,要想修改这个弹出框的内容岂不是要去修改源码?当我在源码里扒拉半天梳理好了逻辑之后,突然意识到,其实我本可以不必这么麻烦的,直接找到这个弹窗append元素进去就不就完了么?卧槽!
所以我在代码里加了一行注释 浪费在这里的时间=2h

10分钟可以搞定的解决方案:

1
2
3
4
5
6
7
var option = {1:'筛选项1',2:'筛选项2'};
var optionString = '';
for(let i in option) {
optionString =optionString+'<option value="'+i+'">'+option[i]+"</option>";
}
//一定要给加入的元素加入id,提交的时候取值方便
$(".layui-layer-content").append("<br/><select id='reinvest_type'>"+optionString+"</select>");

结语

尽可能的不要犯蠢吧,有些问题并不像看上去那么难。

当然修改源码也是可以的,而且还能做成一个通用方案,不过相当耗时。问题是没必要,整个项目就一处需要这样干,我们尽可能选择效率最高的那种方案。

论好的代码习惯的养成/做一个优雅的coder

1.先说一下以前被滴滴大佬教育的事情:

以前写代码的时候,因为只需要取特定的几个字段,所以经常这么写

1
2
3
4
5
6
7
8
//Request $request for example
$parameters = $request->all();
$data['name'] = $parameters['name'];
$data['email'] = $parameters['email'];
$data['tel'] = $parameters['tel'];
$data['address'] = $parameters['address'];
$data['birthday'] = $parameters['birthday'];
$data['sex'] = $parameters['sex'];

后来,大佬说,事实上你可以这样写:

1
2
3
4
5
6
7
//Request $request

$column = ['name','email','tel','address','sex','birthday'];
$data = [];
foreach ($column as $v) {
$data[$v] = $request[$v];
}

emmmm,好像确实要精简一点哈。。。。

2.再说一下最近被老大@的事情

因为对字符串函数用的比较多,我下意识的会把数组解开处理,已经形成思维定式了,拿到东西优先转成自己最熟悉的那种形态,但实际上,完全没有这么麻烦,比如下边的代码:
被老大@了

其实完全可以这样:

1
2
3
//Request $request
$search = $request->all();
$data['query'] = http_build_query($search);

或者说,本来就应该这么写,有自带的函数可以完成这样的功能,我们就不要自己再造轮子了。(我是真的菜哈。。。)

使用vagrant一键部署本地php开发环境(二)制作自己的vagrant box

在上篇的基础上 ,我们已经安装好了virtualbox和vagrant,没有安装的话,参照上篇

使用vagrant一键部署本地php开发环境(一)

1.从网易镜像或阿里等等镜像下载Centos7
http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso

2.打开virtualbox进行虚拟机安装
——————具体步骤自己百度,没什么难的。

3.虚拟机安装好之后
1)以root用户登陆
登陆

登陆之后依次执行 adduser vagrantpasswd vagrant命令,创建vagrant用户密码也设置为vagrant。

为vagrant用户配置sudo免密权限:

1
2
chmod 0777 /etc/sudoers
vim /etc/sudoers

依次执行这两个命令
设置免密

在root行下新增vagrant用户,参照图片设置。完事esc :wq保存退出

执行chmod 0440 /etc/sudoers 恢复默认权限

2)配置ssh

执行 yum install openssh-server 如果没安装的话安装一下,如图是已经安装过的。
安装openssh

安装完毕之后执行 vim /etc/ssh/sshd_config
配置ssh

打开监听和端口,并把允许root用户远程登陆打开。

4.下载官方公钥配置 vagrant ssh
1). 下载官方公钥

1
wget https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub

2). 重命名authorized_keys,移动到.ssh文件下

mv vagrant.pub .ssh/authorized_keys

3). 修改authorized_keys文件权限 除了属主vagrant以外,group和其他用户都不可写

chmod go-w /home/vagrant/.ssh/authorized_keys

5.安装virtualbox增强工具,为共享目录做准备
1).点击菜单中的 设备 > 安装增强功能

2).切换到根目录创建cdrom目录

cd / && mkdir cdrom && mount /dev/cdrom /cdrom

3).切换到/cdrom并安装高级功能

cd /cdrom && ./VBoxLinuxAdditions.run

4).安装完成关闭虚拟机

6.设置网络规则
网卡1按照如下设置,端口转发规则2222-》22
设置端口映射

网卡2设置:
设置网络

7.打包制作box
在本地主机的任意目录 执行

1
vagrant.exe package --base  centos(virtualbox中显示的虚拟机的名称)  --output  centos-lnmp.box(你给box起的名字,随意),该操作会在当前目录下生成  centos-lnmp.box

接下来你懂的。就又回到第一篇,如何使用box上了

使用vagrant一键部署本地php开发环境(一)

一:我们为什么需要用这玩意

我们在开发中经常会面临的问题:环境不一致,有人用Mac有人用Windos还有几个用linux的,而我们的服务器都是linux。
在我本地是可以的啊,我测了都,没有问题啊,然后看着上线之后的500错误懵比。It works on my pc .

二:vagrant是什么东西

Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。——————-来自百度百科。

直白的说是一键生成特定虚拟机的工具。详细的我们下边会说。

三:所需的软件:

1、virtualBox
可以到VirtualBox的官网进行下载:
https://www.virtualbox.org/wiki/Downloads

2、vagrant
可以到vagrant官网下载
https://www.vagrantup.com/downloads.html

这个下载特别慢,这里放出百度云的链接

链接: https://pan.baidu.com/s/1Toy3SRRACOWa8g0ybUHD8Q 密码: puwm

3、vagrant box
vagrant部署环境,需要一个box文件。如果在公司里面,可以从他们那里拷一个box文件安装。这样安装的环境与他们的开发环境是一致的。box文件也可以在网上下载。搜索:vagrantbox

http://www.vagrantbox.es/

(备注:这个地址实际上是失效的,很多box文件都找不到资源了,不过不要紧,因为我们可以自己做一个box,这个在下一篇文章我会讲如何定制一个自己的box,顺道放一个我制作好的基于centos7且安装好lnmp1.5的box)链接: Centos-lnmp.box密码: tssp

四:工作流程

工作流程

五:vagrant的日常使用

下载以上vagrant和virtualbox之后,一路next安装,安装完成之后。

在任意位置新建一个文件夹,来管理你的box ,比如我们在D盘新建一个vagrant文件夹

1.把你下载的box文件扔进来,如图:

2.我们在这个位置打开git-bash,或者用cmd切换到这个目录,我们以git-bash为例:

1)执行

1
vagrant.exe  box add centos centos-lnmp.box

该命令是给box起名并添加到box列表

需要注意的就是在cmd命令窗口下可以不用.exe 直接执行

1
vagrant box add {name(你要起的名字随意)}  {url/file(本地文件地址或远程地址)}

执行效果
2)执行命令

1
vagrant.exe init {centos(刚刚add操作时起的名字)}

初始化虚拟机

就像这样,这个命令会初始化box并生成一个Vargrantfile的配置文件,在这个文件里我们可以 设置一些配置信息,比如共享主机目录到虚拟机目录,网络,虚拟机ip等信息。

打开配置文件
修改配置文件

这些配置项默认都是注释掉的,我们需要找到这两行进行设置。其中共享目录的配置我们可以这样写,第一个参数为本地目录,第二个参数是虚拟机目录,/ 代表了虚拟机下的根目录。

通过共享目录设置,我们可以把我们的项目开发目录映射到虚拟机目录,通过虚拟机配置nginx,来让项目直接跑在虚拟机中。

1
config.vm.synced_folder "D:/data", "/vagrant_data"

3)部署环境

执行命令

1
vagrant.exe up

就可以一键部署虚拟机环境了

启动虚拟机

4)虚拟机管理

执行命令 vagrant.exe ssh

vagrant.exe ssh
就能直接链接到虚拟机的系统了,目录已经挂载好了,接下来就是考验你linux操作能力的时候了,我们可以在这上边查看日志等等一系列事情。

备注:你也可以通过xshell来链接你的虚拟机,ip就是你配置的ip端口22,用户名密码均为vagrant

一般来说虚拟机启动之后就不需要管了。不过对于项目开发而言,你还需要做的一件事就是修改本地的hosts文件,让你请求的虚拟域名指向你的虚拟机ip。

六:vagrant常用命令

  • vagrant init # 初始化
  • vagrant up # 启动虚拟机
  • vagrant halt # 关闭虚拟机
  • vagrant reload # 重启虚拟机
  • vagrant ssh # SSH 至虚拟机
  • vagrant status # 查看虚拟机运行状态
  • vagrant destroy # 销毁当前虚拟机
  • vagrant box list # 查看本地box列表
  • vagrant box add # 添加box到列表
  • vagrant box remove # 从box列表移除

微信支付秘钥绝对路径问题

如果你使用了微信的官方SDK,那我想其实你很容易发现这个问题

图

在微信官方PHPSDK中WxPay.Api.php这个文件中,微信支付秘钥这里的路径写的是相对路径
图

这样这样

点开路径之后我们看到的是这样这样:
图

然而我们在生产环境的时候,微信要求这个路径为绝对路径,所以我们需要对WxPay.Api.php文件的以下两行内容做修改,改成绝对路径。
图

用PHP自带函数对二维数组进行排序

经常会面临这样的需求,虽然有时候我们可以在数据库查询的时候,直接对数据进行排序,但还是无法满足日益复杂的业务需求。

这里边会用到两个函数

  • 一个是array_column()函数,这个函数是从二维数组中抽出一个键的值,作为一个新的数组返回。

  • 另一个是array_multisort()函数,这个函数是一个排序函数,它会依照第一个参数数组的排序规则,依照第一个参数数组的值在第三个参数重的位置对第三个参数进行排序。

听不明白吧?听不明白就对了,还是直接看代码来的实在:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$orgin = array(
array(
'id' => 5698,
'first_name' => 'Bill',
'last_name' => 'Gates',
),
array(
'id' => 4767,
'first_name' => 'Steve',
'last_name' => 'Jobs',
),
array(
'id' => 3809,
'first_name' => 'Mark',
'last_name' => 'Zuckerberg',
)
);

$idArr = array_column($orgin, 'id');
array_multisort($idArr,SORT_ASC,$orgin);
var_dump($orgin);
// 这个打印的结果是:

array (size=3)
0 =>
array (size=3)
'id' => int 3809
'first_name' => string 'Mark' (length=4)
'last_name' => string 'Zuckerberg' (length=10)
1 =>
array (size=3)
'id' => int 4767
'first_name' => string 'Steve' (length=5)
'last_name' => string 'Jobs' (length=4)
2 =>
array (size=3)
'id' => int 5698
'first_name' => string 'Bill' (length=4)
'last_name' => string 'Gates' (length=5)

这样是不是就清楚的多了?

两个比较好用的mysql函数

我们经常会面临要从数据库里**判断时间,取出特定日期的查询。但是数据库里储存的都是unix时间戳,处理起来并不是特别友好。幸而MYSQL提供了几个处理时间戳的函数,可以帮助我们在查询的时候,就将时间戳格式化。用法举例如下:

1.FROM_UNIXTIME()函数

FROM_UNIXTIME(unix_timestamp,format)

  • 参数unix_timestamp 时间戳 可以用数据库里的存储时间数据的字段

  • 参数format  要转化的格式 比如“”%Y-%m-%d“” 这样格式化之后的时间就是 2017-11-30

可以有的形式:

  • %M 月名字(January~December)
  • %W 星期名字(Sunday~Saturday)
  • %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
  • %Y 年, 数字, 4 位
  • %y 年, 数字, 2 位
  • %a 缩写的星期名字(Sun~Sat)
  • %d 月份中的天数, 数字(00~31)
  • %e 月份中的天数, 数字(0~31)
  • %m 月, 数字(01~12)
  • %c 月, 数字(1~12)
  • %b 缩写的月份名字(Jan~Dec)
  • %j 一年中的天数(001~366)
  • %H 小时(00~23)
  • %k 小时(0~23)
  • %h 小时(01~12)
  • %I 小时(01~12)
  • %l 小时(1~12)
  • %i 分钟, 数字(00~59)
  • %r 时间,12 小时(hh:mm:ss [AP]M)
  • %T 时间,24 小时(hh:mm:ss)
  • %S 秒(00~59)
  • %s 秒(00~59)
  • %p AM或PM
  • %w 一个星期中的天数(0=Sunday ~6=Saturday )
  • %U 星期(0~52), 这里星期天是星期的第一天
  • %u 星期(0~52), 这里星期一是星期的第一天
  • %% 一个文字%

使用举例:

1
2
3
4
5
6
7
8
9
SELECT
username,
FROM_UNIXTIME(create_time, "%Y-%m-%d") AS dat
FROM
`wp_user`

GROUP BY 

dat

这样就能查出每天有哪些用户注册了。按天分组,你可以将数据导出后进行其他操作。

2.UNIX_TIMESTAMP()

UNIX_TIMESTAMP(date)

  • 其中date可以是一个DATE字符串,一个DATETIME字符串,一个TIMESTAMP或者一个当地时间的YYMMDD或YYYMMDD格式的数字

  • 用这个函数可以帮助我们在时间戳中筛选出某些天的数据。

比如说:

1
2
3
4
5
6
7
8
9
10
11
SELECT
username,
FROM_UNIXTIME(create_time, "%Y-%m-%d") AS dat
FROM
`wp_user`
WHERE
create_time >=UNIX_TIMESTAMP(''2017-11-29')
AND
create_time <UNIX_TIMESTAMP(''2017-11-30')
GROUP BY 
dat
  • 这个查询可以让我们查出29号那一天的用户注册记录。

善用这两个MYSQL函数可以帮助我们提高处理数据的效率。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×