月度归档: 2018 年 9 月

  • WordPress 函数:get_template_part()调用你的自定义模板

    WordPress 函数:get_template_part()调用你的自定义模板

    get_template_part() 函数用于调用自定义模板文件,也可以引入自定义名字的文件。使用get_template_part()函数,可以更灵活的控制主题,我觉得get_template_part()函数最大的好处就是大大的减少了代码的重写量。

    我们知道,调用header.php可以用get_header()方法,调用footer.php可以用get_footer()方法,调用 sidebar.php可以用get_sidebar()方法,那么,调用自定义模板文件的时候,我们需要用get_template_part()函 数。
    这好比如比如原生的php就有require及include两种引入文件方法一个道理。

    为什么要自定义模板文件?

    比如,分类页、标签页、作者页、甚至首页可能都需要用到一段共同的代码——以摘要方式输出文章。那么,我们可以将这段代码放到content.php中,然后在分类、标签、作者和首页模板文件调用content.php,以减少代码重写量。

    get_template_part()函数用法

    get_template_part()函数的使用很灵活,不仅仅是加载一个模板文件进来,而且还有备用的选项,调用代码如下:

    1. get_template_part( $slug, $name );

    参数:

    $slug (必须) 通用的模板名
    (字符串)要引入的模板的文件名,不包括后缀名 .php,也就是如果需要引入当前主题根目录的 loop.php 文件 $slug 填写 “loop” 即可。
    $name (可选) 指定的模板名
    (字符串)要引入的模板的文件的副文件名,如果要引入当前主题根目录的 loop-img.php 文件 $slug 参数填写 “loop”,$name 参数填写 “img”。

    示例

    1、如果content-loop.php存在,则调用content-loop.php,否则,就调用content.php

    get_template_part( 'content', 'loop' );

    2、引入当前主题根目录的 tags.php文件:

    get_template_part( 'tags' );

    3、引入当前主题 inc 目录的 myfunctions.php 文件:

    get_template_part( 'inc/myfunctions' );

    4、调用主题partials文件夹下content-page.php

    php get_template_part( 'partials/content', 'page' );

    源文件

    get_template_part() 位于 wp-includes/general-template.php.
    原文参考:http://codex.wordpress.org/Function_Reference/get_template_part

  • Linux命令详解:crontab 定时任务

    Linux命令详解:crontab 定时任务

    crontab是一个用来设置、删除或显示供守护进程cron执行的定时任务的命令。每一个用户都可以拥有属于自己的定时任务,定时任务文件默认以用户名命名,并放在/var/spool/cron目录,该目录普通用户无访问权限。

    可以通过cron.allow 和 cron.deny文件管理用户使用cron服务的权限。如果cron.allow存在,用户必须列在其中才会被允许使用cron服务;如果cron.deny存在,被列在其中的用户禁止使用cron服务;如果两者都不存在,只有超级用户才能使用cron服务。在CentOS中,这两个文件放在/etc中,默认只存在cron.deny文件,且为空。这就表示在CentOS中,默认所有的用户均有cron的使用权限。

    命令格式

    crontab [-u user] file
    crontab [-u user] [-l | -r | -e] [-i] [-s]
    crontab -n [ hostname ]
    crontab -c

    命令功能

    为个人用户维护定时任务文件

    命令选项

    -u user

    编辑某个用户的cron,只用root可以使用此参数为别的用户设置cron服务。也可用于给用户指定crontab文件。

    -l

    列出当前用户的crontab。

    -r

    删除当前用户的crontab。

    -e

    编辑当前用户的crontab,默认使用vi,或者是由?VISUAL或EDITOR环境变量指定的编辑器。

    -i

    与-r一起使用,用来询问用户是否直接删除crontab。

    实例

    实例1:列出当前用户的定时任务

    [22:30:17][dodmaster@mha3 ~]$ crontab -l
    0 1 * * 1 $HOME/.DailyShell/hislogclear.sh 
    0 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/voice
    20 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/data/
    40 * * * * $HOME/.DailyShell/mvcdr2bak.sh $HOME/data/message/sms/

    实例2:root用户编辑用户martin的定时任务

    [22:30:17][root@mha3 ~]# crontab -u martin -e

    实例3:为用户martin指定定时任务文件

    [22:30:17][root@mha3 ~]# crontab -u martin martincron

    cron文件语法

    首先,我们打开/etc/crontab文件,我们将会看到如下内容:

    [20:40:30][dodmaster@mha3 etc]$ cat /etc/crontab 
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/
    # For details see man 4 crontabs
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name command to be executed

    该文件是存放系统执行的定时计划,其中前四行用于设置cron服务运行的环境变量:SHELL、PATH、HOME分别指定了cron服务运行时的SHELL环境变量、PATH环境变量和HOME环境变量,这里不再赘述。MAILTO则表示cron运行的任务输出以电子邮件的形式发送到指定用户,如果该变量的值为空,则不会发送邮件。余下几行的内容说明了系统定时任务的具体书写格式。

    ?minute?分钟,取值范围0-59
    ?hour?小时,取值范围0-23
    ?day of month?日,取值范围1-31
    ?month?月,取值范围1-12,或者使用英文缩写jan,feb,mar,apr …
    ?day of week?星期,取值范围0-6,0或7表示星期日,或者使用英文缩写sun,mon,tue,wed,thu,fri,sat
    ?user-name?执行该定时任务的用户
    ?command?具体执行的命令,可以是一个简单的命令,也可以是一个脚本,或者是一个目录。如果是一个目录,则表示执行目录中的所有脚本,目录的前面必须加上run-parts。

    1)星号(*)表示取值范围内的所有值。例如,*在hour的位置,表示每小时执行一次。

    2)连字符(-)表示一个范围。例如,8-12表示8、9、10、11、12。

    3)逗号(,)表示分割指定的数值。例如:3,5-7,9表示3,5,6,7,9。

    4)正斜杠(/)表示步进值。例如,分钟的位置为*/5,表示每五分钟执行一次。

    除了root用户以外的所有用户定义的crontab计划任务都存放在/var/spool/cron目录,通过crontab -e命令编辑,格式与/etc/crontab相同,可以不用指定user-name。

    cron服务会每分钟检查一次/etc/crontab、/etc/cron.d/和/var/spool/cron/中的所有文件,并依此执行。

    实例

    实例1:每周末的凌晨一点钟执行一次系统的raid-check

    0 1 * * Sun root /usr/sbin/raid-check

    实例2:每天的4:02am分root用户执行/etc/cron.daily目录下的所有脚本,run-parts参数表示执行后面目录中的所有脚本。

    02 4 * * * root run-parts /etc/cron.daily

    实例3:每天的8-18每四小时,dodmaster用户执行hislogclear.sh脚本,即8:44,12:44,16:44,20:44四个时间点,会执行该脚本。

    [21:57:56][dodmaster@mha3 ~]$ crontab -l
    44 8-20/4 * * * $HOME/.DailyShell/hislogclear.sh

    实例4:每五分钟执行一次

    */5 * * * * echo "every five minute to do it" >> time.txt
    

    实例5:每个工作日下午八点执行

    0 20 * * 1-5 echo "every workday 20:00 to do it" >> time.txt

    实例6:每分钟的30秒时执行,因为cron服务是每分钟被唤醒一次,所以要执行精确到秒的任务需要借助sleep命令。

    * * * * * sleep 30; echo "every minute 30 second to do it" >> time.txt

    实例7:每20秒执行一次,即表示在每分钟的0秒、20秒、40秒各执行一次(也可以是其他的步长是20秒的值,例如:5s、25s、45s)

    * * * * * echo "every 20 second to do it" >> time.txt
    * * * * * sleep 20; echo "every 20 second to do it" >> time.txt
    * * * * * sleep 40; echo "every 20 second to do it" >> time.txt
  • WordPress 函数:add_theme_support()让你的主题支持特定的功能

    WordPress 函数:add_theme_support()让你的主题支持特定的功能

    add_theme_support() 用于在我们的当前使用的主题添加一些特殊的功能,函数一般写在主题的functions.php文件中,当然也可以再插件中使用钩子来调用该函数,如果是挂在钩子上,那他必须挂在after_setup_theme钩子上,因为 init hook 对于一些功能来说,已经太迟了.

    用法

    <?php add_theme_support( $feature ); ?>

    参数

    $feature
    (string) (必须) 需要添加特殊功能名称,可以是以下参数:

    ‘post-thumbnails’

      —– 增加缩略图支持

    ‘automatic-feed-links’

      自动输出RSS

    ‘post-formats’

      —– 增加文章格式功能

    ‘custom-background’

      —– 增加自定义背景

    ‘custom-header’

      —– 增加自定义顶部图像

    ‘menus’

      ——自定义导航菜单

    默认: None
    也就是说你可以如下使用:

    add_theme_support( 'post-thumbnails' );
    add_theme_support( 'automatic-feed-links' );
    add_theme_support( 'post-formats', array( 'aside', 'gallery' ) );
    add_theme_support(
        'custom-background',
        array(
            'default-color' => '0B3B41',
            'default-image' => get_template_directory_uri().'/images/bg.jpg',
        )
    );
    add_theme_support( 'custom-header' );

    Post Thumbnails(启用文章缩略图功能)

    从WordPress2.9版本开始,可以给模板添加文章缩略图功能。操作方法很简单,只需要把下面的代码添加到functions.php里面。

    add_theme_support( 'post-thumbnails' );

    然后在要显示缩略图的地方放置下面的代码即可。

    <?php the_post_thumbnail(); ?>

    在 Wp 2.9 版本后,我们可以给 ‘post-thumbnails’ 即缩略图功能增加一个限定的参数,举例如下:

    //常规用法,在所有样式的文章、页面日志中使用缩略图功能
    add_theme_support( 'post-thumbnails' );
    //仅在post中使用缩略图功能
    add_theme_support( 'post-thumbnails', array( 'post' ) );
    //仅在page中使用缩略图功能
    add_theme_support( 'post-thumbnails', array( 'page' ) );
    //仅在 post 和 movies 中使用
    add_theme_support( 'post-thumbnails', array( 'post', 'movie' ) );

    在需要显示缩略图的文章页面中我们要检查是否已经设置日志缩略图:

    if ( has_post_thumbnail() ) {
    	the_post_thumbnail();
    }

    设置缩略图大小

    set_post_thumbnail_size( 120, 120, true );
    //前面两个参数分别为-宽、高
    //后面参数为是否裁剪图片到这么大 true为裁剪

    注意,设置了缩略图大小之后,并不是说你输出特色图像的时候就直接输出这个大小,这个代码的功能只是在你设置缩略图的时候将那个图片生成了一个你设定大小的图片。输出特色图像的时候还是要加上大小,不然就会输出原图。

    Custom Background(持定义背景)

    3.4 版本引进让主题支持定义背景。

    add_theme_support( 'custom-background' );

    设置默认背景的参数:

    $defaults = array(
    	'default-color'          => '',
    	'default-image'          => '',
    	'wp-head-callback'       => '_custom_background_cb',
    	'admin-head-callback'    => '',
    	'admin-preview-callback' => ''
    );
    add_theme_support( 'custom-background', $defaults );

    Custom Header(支持自定义头部图像)

    3.4 版本引进的让主图支持自定义头图。

    add_theme_support( 'custom-header' );

    请注意您可以添加的默认参数列表:

    $defaults = array(
    	'default-image'          => '',     //默认图像
    	'random-default'         => false,  //是否默认随机
    	'width'                  => 0,      //宽度
    	'height'                 => 0,      //高度
    	'flex-height'            => false,
    	'flex-width'             => false,
    	'default-text-color'     => '',     //默认文本颜色
    	'header-text'            => true,   //顶部文本开关
    	'uploads'                => true,   //是否允许上传
    	'wp-head-callback'       => '',
    	'admin-head-callback'    => '',
    	'admin-preview-callback' => '',
    );
    add_theme_support( 'custom-header', $defaults );

    Feed Links(头部自动生成 RSS 地址)

    这个功能让 WordPress 自动在主题 head 添加 日志和留言的 RSS feed links。这个功能是在 3.0 版本引进的。

    add_theme_support( 'automatic-feed-links' );

    需要在你的主题头部位置放置头部钩子,这样才会自动生成rss地址。

    <head >
    wp_head();
    </head >

    源文件

    wp-includes/theme.php
    官方文档:http://codex.wordpress.org/zh-cn:函数参考/add_theme_support

  • WordPress MYSQL 数据库及各表结构

    WordPress MYSQL 数据库及各表结构

    WordPress使用MySQL数据库。想成为一个开发者,我们必须掌握WordPress数据库的基本结构,并在自己的插件或主题中使用他们,写入或读出数据。下面我们详细列出WordPress的表结构

    截至WordPress4.52版本,WordPress一共有以下12个表。这里加上了默认的表前缀 wp_

      ◆ wp_commentmeta:存储评论的元数据
      ◆ wp_comments:存储评论
      ◆ wp_links:存储友情链接
      ◆ wp_options:存储WordPress系统选项和插件、主题配置
      ◆ wp_postmeta:存储文章(包括页面、上传文件、修订)的元数据
      ◆ wp_posts:存储文章(包括页面、上传文件、修订)
      ◆ wp_terms:存储每个目录、标签
      ◆ wp_termmeta:存储每个目录、标签的ID,key,value
      ◆ wp_term_relationships:存储每个文章、链接和对应分类的关系
      ◆ wp_term_taxonomy:存储每个目录、标签所对应的分类
      ◆ wp_usermeta:存储用户的元数据
      ◆ wp_users:存储用户

    详细了解各个表中的子项

    wp_categories: 用于保存分类相关信息的表。包括了5个字段,分别是:

      ■ cat_ID – 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment。
      ■ cat_name – 某个分类的名称,为一个varchar(55)值。
      ■ category_nicename – 指定给分类的一个便于记住的名字,也就是所谓的slug,这是一个varchar(200)值。
      ■ category_description – 某个分类的详细说明,longtext型值。
      ■ category_parent – 分类的上级分类,为一个int(4)值,对应是的当前表中的cat_ID,即wp_categories.cat_ID。无上级分类时,这个值为0。

    wp_comments: 用于保存评论信息的表。包括了15个字段,分别为:

      ◆ comment_ID – 每个评论的唯一ID号,是一个bigint(20)值。带有附加属性auto_increment。
      ◆ comment_post_ID – 每个评论对应的文章的ID号,int(11)值,等同于wp_posts.ID。
      ◆ comment_author – 每个评论的评论者名称,tinytext值。
      ◆ comment_author_email – 每个评论的评论者电邮地址,varchar(100)值。
      ◆ comment_author_url – 每个评论的评论者网址,varchar(200)值。
      ◆ comment_author_IP – 每个评论的评论者的IP地址,varchar(100)值。
      ◆ comment_date – 每个评论发表的时间,datetime值(是加上时区偏移量后的值)。
      ◆ comment_date_gmt – 每个评论发表的时间,datetime值(是标准的格林尼治时间)。
      ◆ comment_content – 每个评论的具体内容,text值。
      ◆ comment_karma – 不详,int(11)值,默认为0。
      ◆ comment_approved – 每个评论的当前状态,为一个枚举值enum(’0′,’1′,’spam’),0为等待审核,1为允许发布,spam为垃圾评论。默认值为1。
      ◆ comment_agent – 每个评论的评论者的客户端信息,varchar(255)值,主要包括其浏览器和操作系统的类型、版本等资料。
      ◆ comment_type – 不详,varchar(20)值。
      ◆ comment_parent – 某一评论的上级评论,int(11)值,对应wp_comment.ID,默认为0,即无上级评论。
      ◆ user_id – 某一评论对应的用户ID,只有当用户注册后才会生成,int(11)值,对应wp_users.ID。未注册的用户,即外部评论者,这个ID的值为0。

    wp_linkcategories: 用于保存在WP后台中添加的链接的相关信息的表。包括13个字段:

      ■ cat_id – 每个链接分类的唯一ID,bigint(20)值,为一个自增量auto_increment。
      ■ cat_name – 每个链接分类的名字,tinytext值。
      ■ auto_toggle -这个字段所包含的是一个比较特别的属性。如果为Y,则当该分类中加入了新链接时,其它的链接会变为不可见。它是一个枚举型的值enum(’Y’,’N’),默认为N。
      ■ show_images – 该字段也是枚举值enum(’Y’,’N’),默认为Y。用户指定是否允许在该链接分类显示图片链接。
      ■ show_description – 该字段指定相应的链接分类下的链接,是否再专门[换行]显示它们的说明,这是一个枚举型值enum(’Y’,’N’),默认为N,即不显示说明(但会通过title属性中显示说明)。
      ■ show_rating – 显示该分类下链接的等级。它也是一个枚举值enum(’Y’,’N’),默认为Y。此时,你可以用链接等级的方式来对该链接分类下的链接进行排序。
      ■ show_updated – 指定该链接分类有更新是,是否进行显示,枚举值enum(’Y’,’N’),默认为Y。
      ■ sort_order – 指定该链接分类中链接的排序依据,varchar(64)值。一般用链接的名字(name,即wp_links.link_name)或ID(id,即wp_links.link_id)。
      ■ sort_desc – 指定链接分类的排序方式,枚举值enum(’Y’,’N’),默认为N,即用降序。
      ■ text_before_link – 该链接分类下每个链接的前置html文本,varchar(128)值,默认是’列表开始标签’。
      ■ text_after_link – 该链接分类下每个链接的中,链接与说明文字(wp_links.link_description)之间的html文本,varchar(128)值,默认是’换行标签’。
      ■ text_after_all – 该链接分类下每个链接的后置html文本,varchar(128)值,默认是’列表结束标签’。
      ■ list_limit – 用于规定某一链接分类中显示的(可设定的?)链接的个数,int(11)值,默认为-1,即对链接分类下链接的个数无限制。

    wp_links :用于保存用户输入到Wordpress中的链接(通过Link Manager)的表。共14个字段:

      ◆ link_id – 每个链接的唯一ID号,bigint(20)值,附加属性为auto_increment。
      ◆ link_url – 每个链接的URL地址,varchar(255)值,形式为http://开头的地址。
      ◆ link_name – 单个链接的名字,varchar(255)值。
      ◆ link_image – 链接可以被定义为使用图片链接,这个字段用于保存该图片的地址,为varchar(255)值。
      ◆ link_target – 链接打开的方式,有三种,_blank为以新窗口打开,_top为就在本窗口中打开并在最上一级,none为不选择,会在本窗口中打开。这个字段是varchar(25)值。
      ◆ link_category – 某个链接对应的链接分类,为int(11)值。相当于wp_linkcategories.cat_id。
      ◆ link_description – 链接的说明文字。用户可以选择显示在链接下方还是显示在title属性中。varchar(255)值。
      ◆ link_visible – 该链接是否可以,枚举enum(’Y’,’N’)值,默认为Y,即可见。
      ◆ link_owner – 某个链接的创建人,为一int(11)值,默认是1。(应该对应的就是wp_users.ID)
      ◆ link_rating – 链接的等级,int(11)值。默认为0。
      ◆ link_updated – 链接被定义、修改的时间,datetime值。
      ◆ link_rel – 链接与定义者的关系,由XFN Creator设置,varchar(255)值。
      ◆ vlink_notes – 链接的详细说明,mediumtext值。
      ◆ link_rss – 该链接的RSS地址,varchar(255)值。

    wp_options: 用于保存Wordpress相关设置、参数的表,共11个字段。最重要是的option_value字段,里面包括了大量的重要信息。

      ■ option_id – 选项的ID,bigint(20)值,附加auto_increment属性。
      ■ blog_id – 不详。或许用在单在用户的WP版本上并不重要吧,或许是针对不同用户的Blog来设置的一个值。int(11)值,默认为0,即当前blog。
      ■ option_name – 选项名称,varchar(64)值。
      ■ option_can_override – 该选项是否可被重写、更新,枚举enum(’Y’,’N’)值,默认为Y,即可被重写、更新。
      ■ option_type – 选项的类型,作用不详,int(11)值,默认为1。
      ■ option_value – 选项的值,longtext值,这个字段的内容比较重要。Wordpress初始化时就会设定好约70个默认的值,这里暂不介绍。
      ■ option_width – 选项的宽(?),作用不详。int(11)值,默认为20。
      ■ option_height – 选项的高(?),作用不详。int(11)值,默认为8。
      ■ option_description – 针对某个选项的说明,tinytext值。
      ■ option_admin_level – 设定某个选项可被操纵的用户等级(详情见我的相关文章),int(11)值,默认为1。
      ■ autoload – 选项是否每次都被自动加载,枚举enum(’yes’,’no’)值,默认为yes。

    wp_postmeta: 用于保存文章的元信息(meta)的表,四个字段:

      ◆ meta_id – 元信息ID,bigint(20)值,附加属性为auto_increment。
      ◆ post_id – 文章ID,bigint(20)值,相当于wp_posts.ID。
      ◆ meta_key – 元信息的关键字,varchar(255)值。
      ◆ meta_value – 元信息的值,text值。这些内容主要是在文章及页面编辑页(Write Post, Write Page)的”Add a new custom field to this post(page):”下进行设定的。meta_key就对应名为”key”的下拉列表中的项,而值由用户自己填上(某些时候,wp也会自动加入,如文章中有的音频媒体)。

    wp_posts: 用于保存你所有的文章(posts)的相关信息的表,非常的重要。一般来讲,它存储的数据是最多的。一共包括了21个字段。

      ■ ID – 每篇文章的唯一ID,bigint(20)值,附加属性auto_increment。
      ■ post_author – 每篇文章的作者的编号,int(4)值,应该对应的是wp_users.ID。
      ■ post_date – 每篇文章发表的时间,datetime值。它是GMT时间加上时区偏移量的结果。
      ■ post_date_gmt – 每篇文章发表时的GMT(格林威治)时间,datetime值。
      ■ post_content – 每篇文章的具体内容,longtext值。你在后台文章编辑页面中写入的所有内容都放在这里。
      ■ post_title – 文章的标题,text值。
      ■ post_category – 文章所属分类,int(4)值。
      ■ post_excerpt – 文章摘要,text值。
      ■ post_status – 文章当前的状态,枚举enum(’publish’,’draft’,’private’,’static’,’object’)值,publish为已发表,draft为草稿,private为私人内容(不会被公开) ,static(不详),object(不详)。默认为publish。
      ■ comment_status – 评论设置的状态,也是枚举enum(’open’,’closed’,’registered_only’)值,open为允许评论,closed为不允许评论,registered_only为只有注册用户方可评论。默认为open,即人人都可以评论。
      ■ ping_status – ping状态,枚举enum(’open’,’closed’)值,open指打开pingback功能,closed为关闭。默认值是open。
      ■ post_password – 文章密码,varchar(20)值。文章编辑才可为文章设定一个密码,凭这个密码才能对文章进行重新强加或修改。
      ■ post_name – 文章名,varchar(200)值。这通常是用在生成permalink时,标识某篇文章的一段文本或数字,也即post slug。
      ■ to_ping – 强制该文章去ping某个URI。text值。
      ■ pinged – 该文章被pingback的历史记录,text值,为一个个的URI。
      ■ post_modified – 文章最后修改的时间,datetime值,它是GMT时间加上时区偏移量的结果。
      ■ post_modified_gmt – 文章最后修改的GMT时间,datetime值。
      ■ post_content_filtered – 不详,text值。
      ■ post_parent – 文章的上级文章的ID,int(11)值,对应的是wp_posts.ID。默认为0,即没有上级文章。
      ■ guid – 这是每篇文章的一个地址,varchar(255)值。默认是这样的形式: http://your.blog.site/?p=1,如果你形成permalink功能,则通常会是: 你的Wordpress站点地址+文章名。
      ■ menu_order – 不详,int(11)值,默认为0。
      ■ post_type – 文章类型,具体不详,varchar(100)值。默认为0。
      ■ post_mime_type – 不详。varchar(100)值。
      ■ comment_count – 评论计数,具体用途不详,bigint(20)值。

    wp_usermeta : 用于保存用户元信息(meta)的表,共4个字段:

      ◆ umeta_id – 元信息ID,bigint(20)值,附加属性auto_increment。
      ◆ user_id – 元信息对应的用户ID,bigint(20)值,相当于wp_users.ID。
      ◆ meta_key – 元信息关键字,varchar(255)值。
      ◆ meta_value – 元信息的详细值,longtext值。

    wp_users:用于保存Wordpress使用者的相关信息的表。

      ■ ID – 用户唯一ID,bigint(20)值,带附加属性auto_increment。
      ■ user_login – 用户的注册名称,varchar(60)值。
      ■ user_pass – 用户密码,varchar(64)值,这是经过加密的结果。好象用的是不可逆的MD5算法。
      ■ user_nicename – 用户昵称,varchar(50)值。
      ■ user_email – 用户电邮地址,varchar(100)值。
      ■ user_url – 用户网址,varchar(100)值。
      ■ user_registered – 用户注册时间,datetime值。
      ■ user_level – 用于等级,int(2)值,可以是0-10之间的数字,不同等级有不同的对WP的操作权限。
      ■ user_activation_key – 用户激活码,不详。varchar(60)值。
      ■ user_status – 用户状态,int(11)值,默认为0。
      ■ display_name – 来前台显示出来的用户名字,varchar(250)值。

    在WordPress的数据库结构中,存储系统选项和插件配置的wp_options表是比较独立的结构,在后文中会提到,它采用了key-value模式存储,这样做的好处是易于拓展,各个插件都可以轻松地在这里存储自己的配置。

    post,comment,user 则是三个基本表加上拓展表的组合。以wp_users为例,wp_users已经存储了每个用户会用到的基本信息,比如 login_name、display_name、 password、email等常用信息,但如果我们还要存储一些不常用的数据,最好的做法不是去在表后加上一列,去破坏默认的表结构,而是将数据存在wp_usermeta中。wp_usermeta这个拓展表和wp_options表有类似的结构,我们可以在这里存储每个用户的QQ号码、手机号码、登录WordPress后台的主题选项等等。

    比较难以理解的是term,即wp_terms、wp_term_relationships、wp_term_taxonomy。在WordPress的系统里,我们常见的分类有文章的分类、链接的分类,实际上还有TAG,它也是一种特殊的分类方式,我们甚至还可以创建自己的分类方法。WordPress将所有的分类及分类方法、对应结构都记录在这三个表中。wp_terms记录了每个分类的名字以及基本信息,如本站分为“WordPress开发”、“WPCEO插件”等,这里的分类指广义上的分类,所以每个TAG也是一个“分类”。wp_term_taxonomy记录了每个分类所归属的分类方法,如“WordPress开发”、“WPCEO插件”是文章分类(category),放置友情链接的“我的朋友”、“我的同事”分类属于友情链接分类(link_category)。wp_term_relationships记录了每个文章(或链接)所对应的分类方法

  • WordPress判断文章分类函数in_category和is_category区别

    WordPress判断文章分类函数in_category和is_category区别

    WordPress中我们通常使用判断文章所属分类函数 in_category,来实现文章页自定义,单很多时候我们会和is_category函数混淆,小编特意做一个总结和举例,希望对你制作wordpress主题文件有所帮助。

    概述

    in_category:判断当前文章或指定文章是否属于某个指定类别,只有直属的类别,不包括直属类别的父辈类别;可以在循环内使用,也可以独立使用。

    is_category:判断是否正在显示一个类别归档页面。

    in_category函数

    in_category() 函数可以通过分类别名或ID判断当前文章所属的分类,用这个功能实现特定分类使用自定义模板或内容等,而且可以直接在循环(Loop)内部和外部使用。
    1、如果是单个分类 ID ,比如ID 为 2 ,可以这样写

    in_category(2)
    

    2、如果是单个分类别名,比如别名为 themes,可以这样写

    in_category('themes')
    

    3、如果是多个ID,可以这样写

    in_category( array('1', '2', '3') )
    

    4、如果是多个别名,可以这样写

    in_category( array( 'themes','plugins','develop') )
    

    5、综合举例
    in_category函数通常用于主循环中,根据当前文章的类别采取不同的行动,在循环前我们判断分类如果是 fruit 就调用 single-fruit.php,如果是 vegetables 就调用 single-vegetables.php

    if ( in_category('fruit') ) {
    ????include 'single-fruit.php';
    } elseif ( in_category('vegetables') ) {
    ????include 'single-vegetables.php';
    } else {
    ????// Continue with normal Loop
    ????if ( have_posts() ) : while ( have_posts() ) : the_post();
    ????// ...
    }

    6、综合举例2

    if ( in_category( 'linux' )) {
    ????// 如果这篇文章属于linux类,此处添加要执行的内容。
    } elseif ( in_category( array( 'apache', 'nginx' ) )) {
    ????// 如果这篇文章同时属于apache和nginx分类,此处添加要执行的内容。
    } else {
    ????// etc.
    }

    is_category函数

    方法

    < ?php is_category($category); ?>

    参数
    $category,也就是说这个参数可以嵌入单个分类归档的ID或标题,也可以嵌入多个分类组合的ID或标题。当然,这个参数的默认值是None。
    返回值
    要么是真(True),要么是假(False)
    举例

    < ?php
    	if(is_category())
    	//如果这是一个分类归档页面,此处添加要执行的内容。?
    	if(is_category('1'))
    	//如果这是一个分类ID为1的分类归档页面,此处添加要执行的内容。?
    	if(is_category('internet')){
    	//如果这是一个分类URL为internet的分类归档页面,此处添加要执行的内容。?
    	if(is_category('电子商务'))
    	//如果这是一个分类标题为电子商务的分类归档页面,此处添加要执行的内容。?
    	if(is_category(1,2,3)){
    	//如果这是一个分类ID分别为1,2,3的数组型分类归档页面,此处添加要执行的内容。
    ?>

    总结

    在wordpress里面判断某个东西是否属于某分类,则用in_category,而如果是想判断某个分类的表现,那就要用is_category函数。总之,分类页判断分类用is_category(), 内容页判断分类需用in_category()。

  • WordPress分类列表函数:wp_list_categories用法及参数详解举例

    WordPress分类列表函数:wp_list_categories用法及参数详解举例

    wp_list_categories 函数 是 WordPress 中用来罗列系统中分类链接的函数,将分类以列表的形式显示为链接。点击分类的链接,就可以访问该分类下的所有文章的存档页面。

    注意:

    1、 wp_list_categories() 和 list_cats() 以及 wp_list_cats() 的使用类似,但是后面 2 个已经弃用。

    2、如果你希望不格式化输出分类,请使用 get_categories()

    3、因为 WordPress 中内置扩展的小工具功能,所以我们不经任何函数就可以在边栏或是其他我们想要的位置显示一个分类列表,所以wp_list_categories函数就很少有人用到。

    4、该函数使用起来有点类似于wp_list_bookmarks()

    5、该函数输出 应当包含在 ul 标签内

    使用方法

    wp_list_categories( string|array $args = '' )

    默认用法

    <?php
     wp_list_categories( $args );
    $args = array(
     'show_option_all'  => '',//是否列出分类链接
     'orderby'      => 'name',//按名称排列
     'order'       => 'ASC',//升、降序
     'style'       => 'list',//是否用列表(ul>li)
     'show_count'     => 0,//是否显示文章数量
     'hide_empty'     => 1,//是否显示无日志分类
     'use_desc_for_title' => 1,//是否显示分类描述
     'child_of'      => 0,//是否限制子分类
     'feed'        => '',//是否显示rss
     'feed_type'     => '',//rss类型
     'feed_image'     => '',//是否显示rss图片
     'exclude'      => '',//排除分类的ID,多个用',(英文逗号)'分隔
     'exclude_tree'    => '',//排除分类树,即父分类及其下的子分类
     'include'      => '',//包括的分类
     'hierarchical'    => true,//是否将子、父分类分级
     'title_li'      => __( 'Categories' ),//列表标题的名称
     'show_option_none'  => __('No categories'),//无分类时显示的标题
     'number'       => null,//显示分类的数量
     'echo'        => 1,//是否显示,显示或者返回字符串
     'depth'       => 0,//层级限制
     'current_category'  => 0,//添加一个没有的分类
     'pad_counts'     => 0,//这个我也不明白
     'taxonomy'      => 'category',//使用的分类法
     'walker'       => null//用于显示的类
    ?>

    用法举例

    1、包含或排除某分类:
    意思就是把分类ID为3,5,9,16的分类按名称顺序来排序:

    <?php wp_list_categories('orderby=name&include=3,5,9,16'); ?>

    或者

    <ul>
    ????<?php wp_list_categories( array(
    ????????'orderby' => 'name',
    ????????'include' => array( 3, 5, 9, 16 )
    ????) ); ?>
    </ul>

    2、按名称排列,并显示每个分类的日志总数,并不显示ID为10的分类:

    <?php wp_list_categories('orderby=name&show_count=1&exclude=10'); ?>

    或者

    <ul>
    ????<?php wp_list_categories( array(
    ????????'orderby'??? => 'name',
    ????????'show_count' => true,
    ????????'exclude'??? => array( 10 )
    ????) ); ?>
    </ul>

    3、显示或隐藏列表标题:
    过滤ID为4和7的分类,并且列表标题设置为“511遇见”:

    1. <?php wp_list_categories('exclude=4,7&title_li=511遇见'); ?>

    4、列表中只显示ID为5、9、23的分类,并把列表标题改为 Poetry (下面的格式是为了把“要显示的数据”和“标签参数区分开来”)

    <?php wp_list_categories('include=5,9,23&title_li=<h2>' . __('Poetry') . '</h2>' ); ?>

    或者

    <ul>
    ????<?php wp_list_categories( array(
    ????????'include'? => array( 5, 9, 23 ),
    ????????'title_li' => '<h2>' . __( 'Poetry', 'textdomain' ) . '</h2>'
    ????) ); ?>
    </ul>

    title_li参数设置或隐藏一个标题或标题wp_list_categories生成的类别列表。它默认为”(__(类别)”,即它显示这个词“类别”列表的标题。如果这个参数设置为null或空值,不显示标题。下面的示例代码不包括类别id 4和7和隐藏列表标题:

    <ul>
        <?php wp_list_categories( array(
            'exclude'  => array( 4,7 ),
            'title_li' => ''
        ) ); ?>
    </ul>

    5、只显示指定分类的子分类

    显示ID为 8 的分类的子分类,根据ID排序,显示文章数,并且将分类描述作为连接的 title属性。注意:如果父分类没有文章,将不显示父分类。

    <ul>
    <?php wp_list_categories('orderby=id&show_count=1&use_desc_for_title=0&child_of=8'); ?>
    </ul>


    或者:

    <ul>
    ????<?php wp_list_categories( array(
    ????????'orderby'??????????? => 'id',
    ????????'show_count'???????? => true,
    ????????'use_desc_for_title' => false,
    ????????'child_of'?????????? => 8
    ????) ); ?>
    </ul>

    6、移除分类计数的括号
    当 show_count=1 ,每个分类的后面都将显示文章数,同时使用括号包含。如果你要移除括号,可以使用下面的代码

    <ul>
    <?php
    $variable = wp_list_categories( array(
    ????'echo' => false,
    ????'show_count' => true,
    ????'title_li' => '<h2>' . __( 'Categories', 'textdomain' ) . '</h2>'
    ) );
    $variable = preg_replace( '~\((\d+)\)(?=\s*+<)~', '$1', $variable );
    echo $variable;
    ?>
    </ul>

    7、显示分类和 RSS Feed 连接
    根据分类名称进行排序,显示文章数量,并且显示每个分类的 RSS 订阅链接:

    <ul>
    ????<?php wp_list_categories( array(
    ????????'orderby'??? => 'name',
    ????????'show_count' => true,
    ????????'feed'?????? => 'RSS'
    ????) ); ?>
    </ul>

    使用Feed 图标替换文本,可以使用下面的代码:

    <ul>
    ????<?php wp_list_categories( array(
    ????????'orderby'??? => 'name',
    ????????'show_count' => true,
    ????????'feed_image' => '/images/rss.gif'
    ????) ); ?>
    </ul>

    显示自定义分类法的项目:

    在3.0版本添加了taxonomy 参数到? wp_list_categories() 。让你可以通过 taxonomy 参数来设置要显示的是哪种分类法下的分类项目。比如要显示分类法为 genre 的分类列表:

    // List terms in a given taxonomy using wp_list_categories (also useful as a widget if using a PHP Code plugin)
    $taxonomy???? = 'genre';
    $orderby????? = 'name';
    $show_count?? = false;
    $pad_counts?? = false;
    $hierarchical = true;
    $title??????? = '';
    $args = array(
    ??'taxonomy'???? => $taxonomy,
    ??'orderby'????? => $orderby,
    ??'show_count'?? => $show_count,
    ??'pad_counts'?? => $pad_counts,
    ??'hierarchical' => $hierarchical,
    ??'title_li'???? => $title
    );
    ?>
    <ul>
    ????<?php wp_list_categories( $args ); ?>
    </ul>

    显示文章对应的分类:

    根据父-子关系来排序文章的分类。类似于 get_the_category_list() 函数(根据名称排序分类)。这个例子必须使用内循环。

    $taxonomy = 'category';
    // Get the term IDs assigned to post.
    $post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
    // Separator between links.
    $separator = ', ';
    if ( ! empty( $post_terms ) && ! is_wp_error( $post_terms ) ) {
    ????$term_ids = implode( ',' , $post_terms );
    ????$terms = wp_list_categories( array(
    ????????'title_li' => '',
    ????????'style'??? => 'none',
    ????????'echo'???? => false,
    ????????'taxonomy' => $taxonomy,
    ????????'include'? => $term_ids
    ????) );
    ????$terms = rtrim( trim( str_replace( '<br />',? $separator, $terms ) ), $separator );
    ????// Display post categories.
    ????echo? $terms;
    }

    标记和样式化分类列表

    默认情况下, wp_list_categories() 生成的是无序列表(ul),使用 li 标签来包含每个分类,而且列表的标题为”Categories”。

    你可以通过设置 title_li 为空值来隐藏标题。你可以自定义包装 有序列表或无序列表。如果你不需要以列表输出分类,可以将 style 参数设置为 none。

    你可以根据下面的CSS选择器来样式化输出:

    li.categories { ... }? /* outermost list item */
    li.cat-item { ... }
    li.cat-item-7 { ... }? /* category ID #7, etc */
    li.current-cat { ... }
    li.current-cat-parent { ... }
    ul.children { ... }

    小结

    1、官方文档:https://developer.wordpress.org/reference/functions/wp_list_categories/

    2、因为我们没有必要再使用这个函数,最让我们心动的就是最后这个CSS的改变,这样可以让你更灵活的显示在前台,比如有人问,如何去掉函数中封装的 li 标签,这样问的原因我猜主要是它的布局不是采用了 li 标签,或者一些样式加布进去,所以你多多研究一下总后一个例子还是很有必要的。

    3、如何去掉li

    <?php wp_list_categories('style=none'); ?>
  • wordpress函数:get_permalink()获取文章页面的固定链接

    wordpress函数:get_permalink()获取文章页面的固定链接

    get_permalink() 用来根据固定连接返回文章或者页面的链接。在获取链接时 get_permalink() 函数需要知道要获取的文章的 ID,如果在循环中则自动默认使用当前文章。 如果文章ID正确,那么将返回该ID文章的URL,如果文章不存在,那么将返回False,在Plugin或者Theme中,他可以被setup_theme动作使用,任何先前的使用,引入plugins_loaded将产生一个致命的错误。请注意,当一个文章页面循环之外使用(例如index、achive)没有ID参数,它将返回的最后一文章的URL,但是可能并不是当前页的永久链接。

    用法

    get_permalink( $id, $leavename );

    参数

    $id

    (混合)(可选)文章或者页面的 ID(整数);还可以是文章对象。

    默认值:在循环中自动调用当前的文章

    $leavename

    (布尔)(可选)转化成链接是是否忽略文章别名。如果设置成 True,那么将返回 http://www.example.com/%postname% 而不是 http://www.example.com/my-post-name

    默认值:None

    返回值

    (字符串 | 布尔)成功获取链接则返回链接,失败则返回 False.

    例子

    1、默认用法
    获取当前文档的永久链接(在循环中使用),作为标签不显示permalink,该示例使用PHP的echo命令。

    <?php echo get_permalink();?>

    2、根据 ID 获取文章或页面的链接:

    <a href="<?php echo get_permalink( 268 ); ?>">获取指定 ID 的文章或页面链接</a>

    3、循环中获取当前文章的链接:

    <?php echo get_permalink(); ?>

    4、根据页面标题获取页面链接:

    <a href="<?php echo esc_url( get_permalink( get_page_by_title( '留言板' ) ) ); ?>">留言板</a>

    5、获取特殊页面的URL
    返回Post ID为1和10的文章永久链接,作为列表信息的一部分项目。

    <ul>
        <li><?php esc_html_e( 'MyBlog info:', 'textdomain' ); ?>
            <ul>
                <li><a href="<?php echo esc_url( get_permalink(1) ); ?>"><?php esc_html_e( 'About MyBlog', 'textdomain' ); ?></a></li>
                <li><a href="<?php echo esc_url( get_permalink(10) ); ?>"><?php esc_html_e( 'About the owner', 'textdomain' ); ?></a></li>
            </ul>
        </li>
    </ul>

    6、通过Post对象而不是Post的ID
    这说明你可以用代替的ID页面标题获得永久链接。

    <a href="<?php echo esc_url( get_permalink( get_page_by_title( 'Monthly Events' ) ) ); ?>">
    <?php esc_html_e( 'Monthly Events', 'textdomain' ); ?>
    </a>

    源文件

    此函数位于:wp-includes/link-template.php

  • WordPress函数:wp_get_archives根据日期显示日志归档详解举例

    WordPress函数:wp_get_archives根据日期显示日志归档详解举例

    wp_get_archives函数可以让是实现年度归档、月度归档、周归档、日归档等等,配合 Limit 使用限定显示数量,甚至可以制作网站地图!wp_get_archives()可用在模板中的任何位置。

    WordPress的widget里提供的文章索引模板,他可以让你的WordPress博客的侧边栏按月度存档,方便读者,方便搜索引擎。但默认显示的是所有月度归档,这对有着两年,甚至两年以上历史的老博客来说,无疑是一种负担。那长长的一竖排,无表情的竖在那里,显的呆板缺少灵气;再者较老的日志也不能适应现在的需要。当一片技术日志让留言者被挖祖坟般挖了出来,你几乎都产生了这日志是否是你写的这种错觉时,隐藏部分月度归档显得尤为重要了。

    用法

    <?php wp_get_archives( $args ); ?>

    默认设置

    <?php $args = array(
    	'type'            => 'monthly',
    	'limit'           => '',
    	'format'          => 'html',
    	'before'          => '',
    	'after'           => '',
    	'show_post_count' => false,
    	'echo'            => 1,
    	'order'           => 'DESC'
    );
    wp_get_archives( $args ); ?>

    默认情况下,使用显示:

      ◆ 每月档案链接显示
      ◆ 显示所有档案(不限数字)
      ◆ 依次在HTML列表显示档案
      ◆ 没有显示之前或之后的每一个链接
      ◆ 不显示数量的帖子

    参数

    type

      (字符串) 显示列表的类型。默认的WordPress设置。有效值:
      ■ yearly
      ■ monthly – 默认值
      ■ daily
      ■ weekly
      ■ postbypost (按照发布时期排序)
      ■ alpha (例如 postbypost 但是文章按照文章标题排序)

    limit

      (整数) 获得的文章数量,默认没有限制。

    format

      ◆ (字符串) 文章的列表格式。有效值:
      1. ◆ html – 在HTML的列表中

    <li>

      标签和前后字符串。这是默认的。
      1. ◆ option – 在选项

    <select>

      1. 标签或者是下来菜单选项中

    <option>

      1. ◆ link – 内链

    <link>

      标签中。
      ◆ custom – 自定义列表使用前后字符串。

    before

      (字符串) 在使用该链接时文本到地方 html 或者 custom 格式选项。没有默认值。

    after

      (字符串) 在使用该链接时文本到地方 html 或者 custom 格式选项。没有默认值。

    show_post_count

      (布尔值) 是否在列表中显示的文章的数目。除了使用所有类型 ‘postbypost’.
      ■ 1 (True)
      ■ 0 (False) – 默认值

    echo

      (布尔值) 返回值是否直接显示在网页中。
      ◆ 1 (True) – 默认值
      ◆ 0 (False)

    order

      (string) 如何排列查询到的文章 (since Version 3.5)
      ■ ASC – 升序排列 (A-Z).
      ■ DESC – 降序排列 (Z-A) – 默认值

    wp_get_archives调用实例:

    1、以月归档方式显示十二个月的归档
    按月份显示存档列表,只显示最后十二个月的文章。

    <?php wp_get_archives( array( 'type' => 'monthly', 'limit' => 12 ) ); ?>

    2、过去十六天
    显示归档列表的日期,显示的最后十六天。

    <?php wp_get_archives( array( 'type' => 'daily', 'limit' => 16) ); ?>

    3、最后二十个文章
    显示最近二十个最新文章标题所列出的存档列表。

    <?php wp_get_archives( array( 'type' => 'postbypost', 'limit' => 20, 'format' => 'custom' ) ); ?>

    4、下拉框
    显示每月档案的下拉框,在选定的标签,并统计每月日志数量。

    <select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">
      <option value=""><?php echo esc_attr( __( 'Select Month' ) ); ?></option>
      <?php wp_get_archives( array( 'type' => 'monthly', 'format' => 'option', 'show_post_count' => 1 ) ); ?>
    </select>

    5、显示所有文章按字母顺序
    显示所有文章按标题方式排列显示所有日志,特别是如果你想有一个日志档案,就像一个sitemap。

    <?php wp_get_archives('type=alpha'); ?>

    源文件

    wp_get_archives() is located in wp-includes/general-template.php.

  • wordpress使用register_post_type 函数创建自定义文章类型

    wordpress使用register_post_type 函数创建自定义文章类型

    WordPress自定义文章类型 是WordPress自3.0版本以后新增的一个非常实用的特色功能。WordPress内置的两种文章类型:Post(文章)和 Page(页面),Post一般作为经常更新的文章使用(如博客日志),Page一般作为静态页面使用(如网站的关于和联系页面)。那么使用WordPress自定义文章类型就可以实现更多除Post、Page等以外的更多自定义文章类型,而且你可以设置各不同文章类型的诸多属性。

    以下文章类型被保留,因为已经被WordPress使用了。

      ◆ post(文章)∶在WordPress的博客使用的主要类型,通常按时间的倒序来排序。文章也用来生成feed。
      ◆ page(页面)∶和post有向类似,只不过是独立的,有自己的url地址,在wordpress常用来制作一些特殊的页面。
      ◆ attachment(附件)∶attachment是通过上传然后引用到post或者page的一些多媒体。
      ◆ revision(校订)∶revision的作用是用来保存文章草稿以及一些修改过的文章版本。
      ◆ nav_menu_item(导航菜单项)∶nav_menu_item是用来保存导航菜单信息。

    除了在wordpress中已经被使用的保留文章类型,那我们也可以自定义类型,wordpress强大之处就在这里,扩展性超强。
    除了以上的保留文章类型外,为了满足多样化需求,我们可以自定义一些文章类型,例如:公告、视频、专题等等。自定义文章类型的实际用途很广,可以制作出复杂多变的表现形式。先来看看一个简单自定义类型的例子:
    创建一个新的 Post Type 需要使用 register_post_type 函数来注册一下。需要在你主题的 functions.php 文件下调用该函数:

    register_post_type( $post_type, $args );

    $post_type 参数就是你自定义 Post Type 的名称,Post Type 可以自定义的功能非常多,所以这个函数里面的 $args 参数会很多。所以通常会用下面这种格式来注册:
    建议你阅读 WordPress函数:register post type (自定义文章类型)用法和范例

    function my_custom_post_product() {
        $args = array();
        register_post_type( 'product', $args );
    }
    add_action( 'init', 'my_custom_post_product' );

    包裹在一个函数中,定义一个数组,然后挂靠到 init 这个 action 上。这样 WordPress 在初始化的时候,就会执行这个函数注册一个自定义 Post Type,因为调用 register_post_type() 的时候,必须要在 admin_menu action 之前,在 after_setup_theme action 之后,所以这里最好挂靠到 init action 上。

    /*
    ?* 自定义内容类型 - 电影
    ?*/
    function movietalk_custom_post_type_movie() {
      $labels = array(
        'name'               => '电影',
        'singular_name'      => '电影',
        'add_new'            => '添加电影',
        'add_new_item'       => '添加电影资料',
        'edit_item'          => '编辑电影资料',
        'new_item'           => '新电影',
        'all_items'          => '所有电影',
        'view_item'          => '查看电影',
        'search_items'       => '搜索电影',
        'not_found'          => '没找到电影资料',
        'not_found_in_trash' => '回收站里没找到电影资料',
        'menu_name'          => '电影'
      );
      $args = array(
        'public'        => true,
        'labels'        => $labels,
        'menu_position' => 5,
        'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions' ),
        'has_archive'   => true,
        'rewrite'       => array( 'slug'  => 'movie', 'with_front'  => false ),
       );
      register_post_type( 'movie', $args );
    }
    add_action( 'init', 'movietalk_custom_post_type_movie' );

    自定义文章类型

    就电影来说,可以分为科幻、动作、战争等类别,那么我们就为自定义的 电影 添加分类功能,这样就可以编辑新分类以及归类我们的电影了。这个分类跟文章里面的分类性质是一样的。

    /*
    ?* 自定义分类法 - 电影类型
    ?*/
    function my_taxonomies_movie() {
      $labels = array(
        'name'              => _x( '电影分类', 'taxonomy 名称' ),
        'singular_name'     => _x( '电影分类', 'taxonomy 单数名称' ),
        'search_items'      => __( '搜索电影分类' ),
        'all_items'         => __( '所有电影分类' ),
        'parent_item'       => __( '该电影分类的上级分类' ),
        'parent_item_colon' => __( '该电影分类的上级分类:' ),
        'edit_item'         => __( '编辑电影分类' ),
        'update_item'       => __( '更新电影分类' ),
        'add_new_item'      => __( '添加新的电影分类' ),
        'new_item_name'     => __( '新电影分类' ),
        'menu_name'         => __( '电影分类' ),
      );
      $args = array(
        'labels' => $labels,
        'hierarchical' => true,
      );
      register_taxonomy( 'movie_category', 'movie', $args );
    }
    add_action( 'init', 'my_taxonomies_movie', 0 );

    自定义文章类型

    我们想要添加的电影类型不能仅仅只有正文内容,我们还需要额外添加一些 导演 之类的有关内容。那么就需要添加自定义 Meta Box,Meta Box 可以在文章发表页面中添加自定义的表单,编写文章的时候可以填写额外的信息然后在前端调用出来。

    自定义 Meta Box 需要用到 add_meta_box 函数:

    add_meta_box( $id, $title, $callback, $post_type, $context,$priority, $callback_args );

    注册一个 Meta Box :

    add_action( 'add_meta_boxes', 'movie_director' );
    function movie_director() {
        add_meta_box(
            'movie_director',
            '电影导演',
            'movie_director_meta_box',
            'movie',
            'side',
            'low'
        );
    }

    然后在配置参数里面指定了回调函数 movie_director_meta_box,我们需要在这个函数里面创建表单:

    function movie_director_meta_box($post) {
        // 创建临时隐藏表单,为了安全
        wp_nonce_field( 'movie_director_meta_box', 'movie_director_meta_box_nonce' );
        // 获取之前存储的值
        $value = get_post_meta( $post->ID, '_movie_director', true );
        ?>
        <label for="movie_director"></label>
        <input type="text" id="movie_director" name="movie_director" value="<?php echo esc_attr( $value ); ?>" placeholder="输入导演名称" >
        <?php
    }

    这样就可以在文章界面边栏显示出来刚刚创建的表单了:

    自定义文章类型

    但是这时候,你的表单是没法用的,因为你提交文章之后并没有保存这个 Meta Box 的内容,下面是验证保存内容的代码:

    /*
    ?* 保存 Meta Box 表单内容
    ?*/
    function movie_director_save_meta_box($post_id){
        // 安全检查
        // 检查是否发送了一次性隐藏表单内容(判断是否为第三者模拟提交)
        if ( ! isset( $_POST['movie_director_meta_box_nonce'] ) ) {
            return;
        }
        // 判断隐藏表单的值与之前是否相同
        if ( ! wp_verify_nonce( $_POST['movie_director_meta_box_nonce'], 'movie_director_meta_box' ) ) {
            return;
        }
        // 判断该用户是否有权限
        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return;
        }
        // 判断 Meta Box 是否为空
        if ( ! isset( $_POST['movie_director'] ) ) {
            return;
        }
        $movie_director = sanitize_text_field( $_POST['movie_director'] );
        update_post_meta( $post_id, '_movie_director', $movie_director );
    }

    自定义文章类型

    /*
    ?* 列表显示自定义Meta Box字段
    ?*/
    add_action("manage_posts_custom_column",  "movie_custom_columns");
    add_filter("manage_edit-movie_columns", "movie_edit_columns");
    function movie_custom_columns($column){
        global $post;
        switch ($column) {
            case "movie_director":
                echo get_post_meta( $post->ID, '_movie_director', true );
                break;
        }
    }
    function movie_edit_columns($columns){
        $columns['movie_director'] = '导演';
        return $columns;
    }

    自定义文章类型

    如果你的网站设置了固定连接,当你新建了 Post Type 之后,你必须要在后台更新一下固定连接设置才行。找到后台固定连接,再点击一下下面的“保存设置”,之后就可以正常访问了。

  • wordpress使用query_posts()函数WP_Query类获取指定分类中的日志 代码示例

    wordpress使用query_posts()函数WP_Query类获取指定分类中的日志 代码示例

    wordpress 获取指定分类中的日志列表常常用于显示指定分类下的日志,适合于CMS,或者网站地图之类的,我们常用的函数是query_posts()函数,使用WP_Query类也有更多的优点。

    利用query_posts()函数

    query_posts()是wordpress用来显示内容的最容易的方法之一,它可以通过各种灵活的方式检索或过滤你所需要的内容。

    $args = 'cat=61&posts_per_page=10';
    query_posts( $args );
    while ( have_posts() ) : the_post();
        echo '<li>';
        the_title();
        echo '</li>';
    endwhile;
    wp_reset_query();

    query_posts函数虽好用,但在使用该函数时,我们仍需要注意和尽量减少使用该函数的频率。同时,在官方文档中,这样强调:“如果我们不得不用到query_posts(),必须确保每次使用query_posts()后同时执行wp_reset_query();”。这就是为什么我在上面的代码中加上了wp_reset_query()的原因。

    另外,大多数使用wordpress的朋友们,可能都对wp-pagenavi这个插件不再陌生。这是作为辅助分页的插件成为很多wper的常用工具之一。其作者在自己的博客中,分析并强调了部分朋友在分页时会出现数据差异情况的原因,并提出了正确使用query_posts()函数的方法。
    综合以上几点,加上易维护性的目的,我们重新来理一下代码:

        $args = array(
            'cat'   => 61,
            'posts_per_page'    => 10,
            'paged'             => get_query_var('page') //如果需要分页,则加上这一句
        );
        query_posts( $args );
        while ( have_posts() ) : the_post();
            echo '<li>';
            the_title();
            echo '</li>';
        endwhile;
        wp_reset_query();

    WP_Query类

    WP_Query类被设定用来处理wordpress众多复杂的数据库处理,未来一段时间都将被提倡的使用方法之一。
    按我个人的习惯和对wordpress的浅显认识,建议放弃烂用query_posts(),而改用WP_Query().尽管看上去有一点点烦。

        $args = array(
            'cat'   => 61,
            'posts_per_page'    => 10,
        );
        $tech = new WP_Query( $args );
        if ( $tech -> have_posts() ) {
            while ( $tech -> have_posts() ) : $tech ->the_post();
                echo '<li>';
                the_title();
                echo '</li>';
            endwhile;
        }else {
            echo 'no posts in current category!';
        }

    这样独立来调用数据,即安全易维护,又比较明晰;

    以上两种方式中,$args所具有的内定参数,包括category__in, category__not_in, post__in, post__not_in等等可以至官方文档,作进一步了解:http://codex.wordpress.org/Class_Reference/WP_Query#Parameters

    参考:

    http://codex.wordpress.org/Function_Reference/query_posts

    http://codex.wordpress.org/Class_Reference/WP_Query#Parameters

  • WordPress函数:add meta box(自定义添加Meta模块)

    WordPress函数:add meta box(自定义添加Meta模块)

    add_meta_box() 函数是在 WordPress 2.5 添加的,它的主要作用就是为插件开发人员提供一个接口,可以为你所发布的文章,页面,链接添加一些自定义的字段,用来给插件开发者添加 Meta模块 到管理界面。

    用法

    <?php
       add_meta_box( $id, $title, $callback, $post_type, $context,$priority, $callback_args );
    ?>

    参数

    $id

    (字符串)(必需)Meta模块的 HTML“ID”属性

    $title

    (字符串)(必需)Meta模块的标题,对用户可见

    $callback

    (回调)(必需)为Meta模块输出 HTML代码的函数

    $post_type

    (字符串)(必需)显示Meta模块的文章类型,可以是文章(post)、页面(page)、链接(link)、附件(attachment) 或 自定义文章类型(自定义文章类型的别名)

    $context

    (字符串)(可选)Meta模块的显示位置(’normal’,’advanced’, 或 ‘side’)

    默认值:’advanced’

    $priority

    (字符串)(可选)Meta模块显示的优先级别(’high’, ‘core’, ‘default’or ‘low’)

    默认值: ‘default’

    $callback_args

    (数组)(可选)传递到 callback 函数的参数。callback 函数将接收 $post 对象和其他由这个变量传递的任何参数。

    源文件

    wp-admin/includes/template.php

    示例

    /**
    ?* Register meta box(es).
    ?*/
    function wpdocs_register_meta_boxes() {
        add_meta_box( 'meta-box-id', __( 'My Meta Box', 'textdomain' ), 'wpdocs_my_display_callback', 'post' );
    }
    add_action( 'add_meta_boxes', 'wpdocs_register_meta_boxes' );
    /**
    ?* Meta box display callback.
    ?*
    ?* @param WP_Post $post Current post object.
    ?*/
    function wpdocs_my_display_callback( $post ) {
        // Display code/markup goes here. Don't forget to include nonces!
    }
    /**
    ?* Save meta box content.
    ?*
    ?* @param int $post_id Post ID
    ?*/
    function wpdocs_save_meta_box( $post_id ) {
        // Save logic goes here. Don't forget to include nonce checks!
    }
    add_action( 'save_post', 'wpdocs_save_meta_box' )

    官方文档

    add_meta_box()

  • WordPress 开发必了解 过滤器(Filters):apply_filters和add_filter 用法和实例

    WordPress 开发必了解 过滤器(Filters):apply_filters和add_filter 用法和实例

    过滤器(Filters)对于WordPress来说是非常重要的,它极大地扩展了WordPress的定制能力,提高了WordPress的灵活性。无论是制作主题还是开发插件,我们基本上都会或多或少地使用到过滤器,以实现我们的一些特殊需求。WordPress过滤器的使用非常简单,我们经常用到的也就两个函数而已,它们就是apply_filters和add_filter。

    过滤器钩子及相关函数:

    过滤器(Filters),就是过滤的意思。 过滤器也叫过滤器钩子,它和动作钩子一样,基本的也有两个函数,动作钩子有do_action它有apply_filters函数,也是创建并执行一个过滤器函数,不同的是动作钩子仅仅是执行一些函数,而过滤器它要做的是改变对象或变量的值,就相当于把对象或变量过滤,然后返回。 过滤器就是注册到过滤器钩子(Filter Hook)的函数,过滤器钩子都有一个名字,在WordPress中,一般使用变量$tag来标识这个名字。所有挂接到过滤器钩子上的函数都是过滤器。

    过滤器钩子和动作钩子一样,基本的函数有两个,动作钩子有do_action函数,它就有apply_filters函数,该函数是用于执行相应的过滤器函数,不同的是动作钩子仅仅是执行函数(或者称为动作,更为贴切),而过滤器钩子它要做的是通过执行过滤器函数来改变对象或变量的值,就相当于对变量或者对象进行过滤,然后再返回。

    简单地说,动作钩子要的是过程(仅仅执行代码块)而不是结果(输出值/返回值),过滤器钩子要的是结果而不是过程。

    apply_filters()函数的用法:

    <?php
        apply_filters( $tag, $value, $var ... );
        //$tag (字符串)(必需)过滤器钩子的名称,默认值:None
        //$value (混合)(必需),可以被过滤器函数修改的值要过滤的值,如果没人过滤则直接返回这个值。
        //$var (混合) (可选)传给过滤函数额外的变量参数,辅助过滤函数对返回值进行操作,可以添加无限个。
        //返回值 (混合)过滤后的值,如果没人过滤则直接返回 $value 的值。
    ?>

    add_filter()函数的用法:

    同理,动作钩子有个函数是add_action,相应地,过滤器钩子也有个函数是add_filter。这两个函数的用法就完全一样了,实质上,add_action就是直接调用add_filter来实现的。add_filter函数的用法:

    <?php
        add_filter( $tag, $function_to_add, $priority, $accepted_args );
        //$tag 必需,过滤器钩子的名称
        //$function_to_add 必需,要添加的过滤器函数
        //$priority 可选,过滤器函数的优先级,默认值为10
        //$accepted_args 可选,过滤器函数接受的参数数量,默认值为1

    要注意的是,我们在前面说过,过滤器(过滤器函数)的任务是要改变对象或变量的值,所以通过add_filter函数添加的过滤器必须要有个返回值,也就是函数$function_to_add必需有返回值。

    过滤器应用实例:

    我们以wp_title()函数为例,为大家讲一下过滤器的实际用法,这个函数的定义在wp-includes/general-template.php文件中。在该函数的定义中,调用了apply_filters函数来执行相应的过滤器函数。代码如下:

    $title = apply_filters('wp_title', $title, $sep, $seplocation);
    //这里会执行过滤器函数,对变量$title进行过滤
    //正因为这行代码的存在,你可以把你的过滤器函数添加进来,实现对$title的定制

    那么,我们可以在该过滤器钩子(wp_title)上添加一个过滤器来改变$title的值。代码如下:

    <?php
        add_filter('wp_title', 'mytitle');
        //把函数mytitle挂接到过滤器钩子wp_title上
        //定义过滤器函数mytitle
        function mytitle($title) {
            $title = '过滤替换后的标题';
            return $title;
        }

    上面这些代码就会把wp_title()函数的返回值$title改为“过滤替换后的标题”,调用wp_title()函数得到的输出就是“过滤替换后的标题”了,不管在什么页面调用都是如此,所有文章的标题都被替换成“过滤替换后的标题”。把这段代码添加到主题的functions.php文件中,你就能看到效果了(如果你的主题使用了wp_title函数)。

    通过本文的介绍,相信大家都明白了什么是过滤器以及过滤器的用法。 在官网中搜索,过滤器相关的函数还有 has_filter() current_filter() merge_filters() remove_filter() remove_all_filters()…

    参考手册

    • http://codex.wordpress.org/Function_Reference/apply_filters
    • http://codex.wordpress.org/Function_Reference/add_filter
    • http://codex.wordpress.org/Plugin_API
WeChat
↑