月度归档: 2018 年 9 月

  • Discuz!  经典代码 PHP加密解密函数

    Discuz! 经典代码 PHP加密解密函数

    加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。
    非常给力的authcode加密函数,Discuz!经典代码(带详解):

    function _authcode($string, $operation = 'DECODE', $key = 'laoji.org', $expiry = 0) {
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 
    	$ckey_length = 4;
    // 密匙 
    	$key = md5($key ? $key : UC_KEY);
    // 密匙a会参与加解密
    	$keya = md5(substr($key, 0, 16));
    // 密匙b会用来做数据完整性验证  
    	$keyb = md5(substr($key, 16, 16));
    // 密匙c用于变化生成的密文 
    	$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
    // 参与运算的密匙
    	$cryptkey = $keya.md5($keya.$keyc);
    	$key_length = strlen($cryptkey);
    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
    //解密时会通过这个密匙验证数据完整性 
    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确   
    	$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
    	$string_length = strlen($string);
    ?
    	$result = '';
    	$box = range(0, 255);
    ?
    	$rndkey = array();
    // 产生密匙簿 
    	for($i = 0; $i <= 255; $i++) {
    		$rndkey[$i] = ord($cryptkey[$i % $key_length]);
    	}
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度   
    	for($j = $i = 0; $i < 256; $i++) {
    		$j = ($j + $box[$i] + $rndkey[$i]) % 256;
    		$tmp = $box[$i];
    		$box[$i] = $box[$j];
    		$box[$j] = $tmp;
    	}
    // 核心加解密部分   
    	for($a = $j = $i = 0; $i < $string_length; $i++) {
    		$a = ($a + 1) % 256;
    		$j = ($j + $box[$a]) % 256;
    		$tmp = $box[$a];
    		$box[$a] = $box[$j];
    		$box[$j] = $tmp;
    // 从密匙簿得出密匙进行异或,再转成字符  
    		$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    	}
    ?
    	if($operation == 'DECODE') {
    // 验证数据有效性,请看未加密明文的格式   
    		if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
    			return substr($result, 26);
    		} else {
    				return '';
    			}
    	} else {
    // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因   
    // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码   
    		return $keyc.str_replace('=', '', base64_encode($result));
    	}
    ?}

    使用方法

    $str = 'abcdef'; 
    $key = 'gdd.gd'; 
    $authcode =  authcode($str,'ENCODE',$key,0); //加密 
    echo $authcode;
    echo authcode($authcode,'DECODE',$key,0); //解密 
  • PHP实现域名授权的两种方法 图文教程

    PHP实现域名授权的两种方法 图文教程

    在线校验域名授权的方法

    客户端代码:

    <?php
    //获取不带端口号的域名前缀
    $servername = trim($_SERVER['SERVER_NAME']);
    //获取服务端授权文件校验
    $verifyurl = file_get_contents('http://laoji.org/copyright.php?domain='.$servername);
    if(!empty($verifyurl)){
    	echo "已授权!";    //授权成功
    }else{
    	die("未授权!");    //授权失败
    }
    ?>

    服务端代码:

    <?php
    //获取域名
    $domain = $_GET['domain'];
    //授权域名列表
    $Array = array('127.0.0.1','localhost');
    //校验结果
    echo in_array($domain, $Array) ? 'yes' : '';
    ?>

    域名授权代码可封装进函数,或者进行加密,对于常用的PHP加密形式,都有其破解的方法,比如ZendGuard、ionCube等,如果授权的域名较多,可以在项目中增加域名字段,将域名写入数据库再进行读取和校验。

    独立校验域名授权的方法

    <?php
    function allow_domain(){
    	$is_allow=false;
    	//获取不带端口号的域名前缀
    	$servername=trim($_SERVER['SERVER_NAME']);
    	//授权域名列表
    	$Array=array("localhost","127.0.0.1");
    	//遍历数组
    	foreach($Array as $value){
    		$value=trim($value);
    		$domain=explode($value,$servername);
    		if(count($domain)>1){
    			$is_allow=true;
    			break;
    		}
    	}
    	if(!$is_allow){
    		die("域名未授权!");    //授权失败
    	}else{
    		echo "域名已授权!";    //授权成功
    	}
    }
    allow_domain();
    ?>

    域名授权的目的在于保护知识产权,鼓励开发者能够发布更多优秀的作品,推动整个网络社会的文化发展与科技进步,有着十分重要的意义。

  • WordPress 在插件或模板开发中使用 session 图文教程

    WordPress 在插件或模板开发中使用 session 图文教程

    我们在WordPress的主题或者插件开发中,可能需要是用到session,百度了一圈居然搜不到内容,这里记录一下具体方法。

    注册session

    function register_session(){
        if( !session_id() )
            session_start();
    }
    add_action('init','register_session');

    本方法在主题functions.php或者插件的函数中使用。

    使用session

    设置值

    $_SESSION['myKey'] = "Some data I need later";

    在其他地方使用

    if(isset($_SESSION['myKey'])) {
        $value = $_SESSION['myKey'];
    } else {
        $value = '';
    }

    销毁session

    add_action('wp_login', 'myEndSession');
    function myEndSession() {
        session_destroy ();
    }
  • MacOS 下修改 iTunes 备份文件路径 图文教程

    MacOS 下修改 iTunes 备份文件路径 图文教程

    如果你也像我一样装了移动硬盘里,或者想更改默认itunes备份路径已便于备份。这个帖子将教你如何实现。

    需要使用到MacOS的终端。

    备注:ji:用户名

    删除默认的iTunes备份同步文件

    rm -rf /Users/ji/Library/Application\ Support/MobileSync

    创健新的备份文件夹

    mkdir -p /Volumes/My\ Passport/iTunes/MobileSync

    创建软连接

    ln -sf /Volumes/My\ Passport/iTunes/MobileSync /Users/ji/Library/Application\ SupportMobileSync

     

  • BT宝塔面板 磁盘爆满处理方法 图文教程

    BT宝塔面板 磁盘爆满处理方法 图文教程

    今天偶尔打开图床的时候,发现图床挂了,以为是PHP或者APACHE出了问题,赶忙重启两个服务,但是网站还是打不开,随后访问BT宝塔面板首页,看到上图箭头所指内容为全红,所剩空间为0,尝试重启MYSQL已经无法重启,多方查阅资料后,总结如下:

    清理网站日志/php站点session/系统邮件/临时文件

    cd /www/server/panel && python tools.pyc clear

    清空面板回收站

    rm -rf /www/Recycle_bin/*

    清除mysql二进制日志(操作过程中会停止重启数据库)

    /etc/init.d/mysqld stop

    rm -f /www/server/data/ib_logfile*

    rm -f /www/server/data/mysql-bin.*

    /etc/init.d/mysqld start

    需要注意的是 执行rm命令时是不会返回任何提示的,直到能再次输入命令之前它都是正在删除文件的状态
    能输入命令的时候即删除完成

    检查磁盘剩余空间

    df -h

    只要Use%这一列没有一个达到100%就可以了
    一般只需要关注系统盘,即第一行,若有挂载数据盘到www目录,也要注意。

    BT宝塔面板inodes爆满处理方法

    如果还不能找到问题,请移步:Linux查找/根目录依次查找大文件 思路分析

  • WordPress 插件开发 支持多语言 国际化 图文教程

    WordPress 插件开发 支持多语言 国际化 图文教程

    博主写了一个WordPress采集插件 WP-JPost,我们这里记录一下WordPress插件多语言开发,国际化。

    添加多语言动作

    WordPress函数:load_plugin_textdomain 插件多语言 国际化 本地化


    // 多语言
    function plugin_languages_init(){
    load_plugin_textdomain( 'wp-jpost', false, basename( dirname( __FILE__ ) ) . '/languages/' );
    }
    add_action('plugins_loaded', 'plugin_languages_init');

    配置输出

    插件中多语言使用,函数:__(); , _e(); ,例:__('Task List','wp-jpost');_e('Task Name','wp-jpost');

    __() 相当于php中的返回翻译后的字符。
    _e() 相当于php中的输出翻译后的字符。

    注意:这里的第二个参数必须与load_plugin_textdomain的第一个参数一致~~~

    Poedit 语言包

    WordPress 主题插件的多语言工具poedit包最新汉化版使用 图文教程

    这里我们只需要“新建现有的WordPress翻译”,然后选择到插件文件夹,poedit会自动载入所有的需要翻译的字符。

    注意:保存语言包时必须保存在插件文件夹中的 languages 文件夹中,必须使用 wp-jpost打头。如:wp-jpost-zh_CN.po

  • WordPress函数:load_plugin_textdomain 插件多语言 国际化 本地化

    WordPress函数:load_plugin_textdomain 插件多语言 国际化 本地化

    描述

    加载翻译后的插件字符串。

    如果未给出路径,默认路径为插件根目录。.mo文件路径基于带有破折号的域名命名,域名后应跟有一个破折号,破折号后为本地语言简码。 这里的本地语言简码是指你在wp-config.php中填写的 WPLANG 的值,比如你填写的是 zh_CN ,那么就该使用 zh_CN,如果你的插件的 text domain 为 “my-plugin”,那么语言包的名字应该为 “my-plugin-zh_CN.mo”和 “my-plugin-zh_CN.po”。

    用法

    <?php load_plugin_textdomain( $domain, $abs_rel_path, $plugin_rel_path ) ?>

    参数

    $domain

    (字符串)(必需)用以检索被翻译字符串的唯一标识符

    默认值:None

    $abs_rel_path

    (字符串)(可选).mo文件所在文件夹的ABSPATH的相对路径。该参数已弃用,但在WP 2.7前仍然有效。

    默认值:false

    $plugin_rel_path

    (字符串)(可选)WP_PLUGIN_DIR的相对路径。推荐使用该参数,其优先级高于$abs_rel_path。

    默认值:false

    返回的值

    (空)

    该函数不返回任何值

    例子

    function myplugin_init() {
      load_plugin_textdomain( 'my-plugin', false, dirname( plugin_basename( __FILE__ ) ) ); 
    }
    add_action('plugins_loaded', 'myplugin_init');

    或者你打算将语言包放在一个子文件夹 languages :

    load_plugin_textdomain( 'my-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );

    注释

    l10n是localization的缩写形式

    函数历史

    始见于1.5.0版本

    2.7.0 版本以后,$abs_rel_path 参数被弃用!

    源文件

    load_plugin_textdomain() 位于 wp-includes/110n.php中。

  • CentOS下安装Apache Bench进行网站压力测试 ab工具使用 图文教程

    CentOS下安装Apache Bench进行网站压力测试 ab工具使用 图文教程

    ApacheBench (简称ab)是一个指令列程式,可用于网站压力测试。如果已经安装过Apache,会自带ab工具,如果不想安装Apache,又想使用ab命令的可通过下面的方法单独安装ApacheBench

    安装

    #安装相关依赖
    yum -y install apr-util
    yum -y install yum-utils
    #创建临时目录
    mkdir abtmp && cd abtmp
    #安装
    yumdownloader httpd-tools*
    rpm2cpio httpd-tools-*.rpm |cpio -idmv
    #拷贝
    cp usr/bin/ab /usr/bin
    

    输入上面的命令,一行一个,不出意外的情况下输入ab -V就能查看到相关信息了,如下截图。

    网站压力测试

    输入命令ab -n 1000 -c 50 https://www.baidu.com/进行测试,这句话的意思是对www.baidu.com发起1000个请求,并发数为50,常用的参数基本就下面两个:

    • -n:指定测试会话使用的请求数;
    • -c:指定一次向服务器发出请求数;

    如果需要查看更多的参数说明,请访问:ab命令
    通过日志分析,发现刚刚ab命令发送了大量请求过来,如下截图,相当于网站正在遭受小规模的CC攻击。

    总结

    ApacheBench可用户网站压力测试,亦可用于发起CC攻击,请不要滥用哦。

  • WordPress函数:add_theme_page()后台添加设置页面

    WordPress函数:add_theme_page()后台添加设置页面

    函数add_theme_page 会在后台“外观”菜单项下面新建一个菜单项,有助于我们自己看法主题时功能的扩展。

    函数介绍

    <?php
    add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function);
    //page_titile-title标签的内容   
    //menu_title-显示在后台左边菜单的标题   
    //capability-访问这个页面需要的权限   
    //menu_slug-别名,需要独一无二哦   
    //function-执行的函数   
    ?>

    参数详解

    $page_title(字符串)(必须)标签的内容
    Default: None
    $menu_title(字符串)(必须)显示在后台左边菜单的标题
    Default: None
    $capability(字符串)(必须)能力这个菜单显示给用户的要求。
    $menu_slug(字符串)(必须)别名,需要独一无二哦 。
    Default: None
    $function(回调)(可选择的)被称为输出此网页的内容的功能,执行的函数。
    Default: ‘ ‘

    添加设置页面举例

    我们可以把以下代码直接复制在万能的functions.php文件下面,但是为了减少文件的代码,我们可以在主题的根目录下再建立一个文件夹,比如叫inc,在这个文件夹下面建立我们主题自己的bootstrapwp-functions.php文件,然后在functions.php文件中引入

    require get_template_directory() . '/inc/bootstrapwp-functions.php';

    代码

    <?php
    add_action('admin_menu', 'my_plugin_menu');
    function my_plugin_menu() {
    	add_theme_page('My Plugin Theme', 'Bwp主题设置', 'administrator', 'Bwp_slug', 'display_function');
    }
    function display_function(){
        echo '<h1>我是外观下面的子菜单-Bwp主题设置</h1>';
    }
    ?>

    add_theme_page

    官方文档

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

  • WordPress函数:load_theme_textdomain()(载入本地化语言文件)

    WordPress函数:load_theme_textdomain()(载入本地化语言文件)

    WordPress 做一个多语言网站,或者让我们的主题支持多种语言,那么就可以使用load_theme_textdomain()函数来定义主题的语言路径,只要将语言放到该目录下面且命名正确,就可以生效。

    描述

    加载翻译后的主题文件语言包文件

    用法

    <?php load_theme_textdomain( $domain, $path ) ?>

    参数

    $domain
    (字符串)(必需)用以检索被翻译字符串的唯一标识符
    默认值: None
    $path
    (未知)(可选)语言包 .mo 文件所在的目录(没有结尾的斜线)
    默认值:false

    返回值

    (布尔)
    如果 textdomain 可以正常加载,返回 TRUE ;反之返回 FALSE

    实例

    load_theme_textdomain() 必须在?after_setup_theme?动作钩子后调用。
    在主题的functions.php中加入以下代码:

    add_action('after_setup_theme', 'wpdocs_theme_setup');
    /**
    * Load translations for wpdocs_theme
    */
    function wpdocs_theme_setup(){
        load_theme_textdomain('wpdocs_theme', get_template_directory() . '/languages');
    }

    以上例子,指明主题的语言目录位于该主题的 languages 文件夹。
    需要注意的是,WordPress主题语言包不像插件语言包,如果你将主题语言包命名为my_theme-zh_CN.mo ,它是没办法使用的。正确的命名方式是根据本地语言设置命名来命名,比如 zh_CN.mo
    如果主题页面中提供语言切换的功能,可通过http://youdomain/?lan=zh-CN的形式切换语言,则需要在functions.php中加入:

    // 必须在 load_theme_textdomain() 的前面调用
    add_filter( 'locale', 'my_theme_localized' );
    function my_theme_localized($locale) {
        if (isset($_GET['lan'])) {
            return $_GET['lan'];    
        }    
        return $locale;
    }
    load_theme_textdomain( 'my_theme', get_template_directory(). '/languages' );

    由于加载语言包会让你的网页加载速度变慢,如果你不想加载语言包,在functions.php中加入以下代码即可:

    add_filter( 'locale', 'wpjam_locale' );
    function wpjam_locale($locale) {
        $locale = ( is_admin() ) ? $locale : 'en_US';
    }

    让插件调用语言包需在插件的主文件中加入以下代码:

    add_action('plugins_loaded', 'plugin_languages_init');
    function plugin_languages_init(){
        load_plugin_textdomain( 'plugin', false,dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
    }

    需要注意的是,和主题语言包不同,插件语言包的一般命名包含两大部分:插件主文件名+语言及国别简码。如index-zh_CN.po和zh_CN.mo

    源文件

    load_theme_textdomain() 位于 wp-includes/l10n.php

    官方文档:http://codex.wordpress.org/Function_Reference/load_theme_textdomain

  • WordPress函数:wp_tag_cloud(标签云)详解和举例

    WordPress函数:wp_tag_cloud(标签云)详解和举例

    wp_tag_cloud() 函数的作用是用来标签云的,可以根据每个标签所关联的文章次数来定义字体大小、标签排序等属性。从 2.8 版本开始,添加了 分类法(taxonomy)参数,这就意味着,除了 标签(tags)以外,还可以将 分类(Categories) 或其他 自定义分类法(Custom Taxonomies)作为“云”显示。

    用法

    <?php wp_tag_cloud( $args ); ?>

    默认用法

    <?php $args = array(
    	'smallest'                  => 8,
    	'largest'                   => 22,
    	'unit'                      => 'pt',
    	'number'                    => 45,
    	'format'                    => 'flat',
    	'separator'                 => "\n",
    	'orderby'                   => 'name',
    	'order'                     => 'ASC',
    	'exclude'                   => null,
    	'include'                   => null,
    	'topic_count_text_callback' => default_topic_count_text,
    	'link'                      => 'view',
    	'taxonomy'                  => 'post_tag',
    	'echo'                      => true,
    	'child_of'                  => null, // see Note!
    ); ?>

    注: child_of 不是一个直接的 wp_tag_cloud 数组的键(Key),但由于这个函数使用 wp_parse_args() 和 get_terms() ,你可以通过 get_terms() 使用所有的数组键。

    默认情况下的输出内容:

    smallest

      —— 最小的标签(使用次数最少)显示大小为8

    largest

      ——最大的标签(使用次数最多)显示大小为22

    vunit

      —— 最大值最小值的单位为’pt’

    number

      —— 至多显示45个标签

    format

      —— 以平面形式显示所有标签(标签之间用空格隔开)

    separator

      —— 显示标签之间的空格

    orderby

      —— 按名称为标签排序

    order

      —— 以升序排列

    exclude

      —— 不排除任何标签

    include

      —— 包括所有标签

    topic_count_text_callback

      —— 使用函数 default_topic_count_text

    vlink

      —— 可视

    taxonomy

      —— 用文章的标签作为云基础

    echo

      —— 输出结果

    参数

    smallest
    (整数)(可选)使用次数最少的标签的字号大小(单位由unit参数决定)
    默认值:8
    largest
    (整数)(可选)使用次数最多的标签的字号大小(单位由unit参数决定)
    默认值:22
    unit
    (字符串)(可选)对smallest与largest的值的测量单位。可以是任何CSS长度单位,如pt, px, em, %。
    默认值:’pt’

    number

    (整数)(可选)显示在云中的实际标签数。(值为’0’时显示所有标签)

    默认值:45

    format

    (字符串)(可选)所显示的云的格式。

    ‘flat’ (默认值)标签被“separator”参数所定义的空格分隔
    ‘list’ 标签与class=’wp-tag-cloud’ 共同在UL中
    ‘array’ 标签在数组中,函数以数组方式返回标签云,以用在PHP中。注意:数组被返回,而非显示。
    separator

    (字符串)(可选)标签之间的文本/空格。

    默认值:’\n’ (空格)

    orderby

    (字符串)(可选)标签的排列依据。有效值包括:

    ‘name’ (默认值)
    ‘count’
    order

    (字符串)(可选)排列顺序(升序或降序)。有效值包括(必须大写):

    ‘ASC’ ——升序(默认值)
    ‘DESC’ ——降序
    ‘RAND’ —— 随机
    exclude

    (字符串)(可选)将要被排除的标签(term_id)的ID,各ID用逗号隔开。如 ‘exclude=5,27’表示不显示term_id为5或27的标签。默认值为不排除任何标签。

    include

    (字符串)(可选)要包含的标签(term_id)列表,各ID用逗号隔开。例如, ‘include=5,27’ 表示只显示term_id为5或27的标签。默认为包含所有链接。

    topic_count_text_callback

    (字符串)(可选)给出标签所关联的文章数,返回标签链接的用于 tooltip 的文本。

    默认值: default_topic_count_text

    link

    (字符串)(可选)设置链接,允许编辑某个指定标签。有效值包括:

    ‘view’ (默认值)
    ‘edit’
    taxonomy

    (字符串)(可选)用以生成云的分类法。

    ‘post_tag’ —— (默认值)将文章标签当作云的来源
    ‘category’ —— 用文章分类生成云
    ‘link_category’ —— 用链接分类目录生成云
    任何其他已注册的分类法
    或者一组 分类法 (注:此参数引入于 3.1 版本)
    echo

    (布尔型)(可选)显示结果,或将结果保留在变量中。默认值为true(显示标签云)。有效值包括:

    1 (true) —— 默认值
    0 (false)

    例子

    1、显示标题为Popular Tags的云

    <?php if ( function_exists( 'wp_tag_cloud' ) ) : ?>
    <h2>Popular Tags</h2>
    <ul>
    <li><?php wp_tag_cloud( 'smallest=8&largest=22' ); ?></li>
    </ul>
    <?php endif; ?>

    2、限制标签大小且以使用次数而非名称排列标签的云

    <?php wp_tag_cloud( 'smallest=15&largest=40&number=50&orderby=count' ); ?>

    3、以数组形式返回云,但不显示

    在变量$tag中包含标签云,以用在其它PHP代码中

     <?php $tag = wp_tag_cloud('format=array' );?>

    4、显示分类云

    使用分类法(taxonomy)参数定义显示分类云

    <?php
    wp_tag_cloud( array( 'taxonomy' => 'category' ) );
    ?>

    5、显示分类和标签云

    使用分类法数组将分类和标签显示为云

    <?php
      $args = array(
        'taxonomy'  => array('post_tag','category'),
       );
      wp_tag_cloud($args);
    ?>

    6、更改云链接的标题文本

    使用 topic_count_text_callback 参数传递一个新的返回函数。原始函数 default_topic_count_text() 位于 /wp-includes/category-template.php 。这个例子使用“pictures”替换默认的“topics”:

    <?php
    wp_tag_cloud( array( 'topic_count_text_callback' => 'my_tag_text_callback' ) );
    function my_tag_text_callback( $count ) {
        return sprintf( _n('%s picture', '%s pictures', $count), number_format_i18n( $count ) );
    }
    ?>

    从 2.3 版本开始,标签云可以制作成一个标签存档页面。这就意味着,用户可以点击某个标签,然后查看到该使用该标签的所有文章。根据 模板层级(Template_Hierarchy),如果tag.php模板不存在,那么就使用archives.php模板。通过tag,php模板你可以自定义标签存档索引的样式,为方便导航,模板会在最上方包含标签云。

    要将标签云显示在模板上方,你需要将一个新模板添加到主题文件中。模板、模板层级 中有相关介绍。基础步骤包括:

    1. 用下面的内容创建一个文件,命名为tag.php

    2. 将新文件上传到主题目录下

    3. 如果你希望在页面导航中加入一个指向标签索引的链接,可进行第三步骤,否则点击某个标签时会使用新模板。

    用新模板新建一个空白页面,将页面命名为标签存档索引。
    对第三步的进一步阐述:

    WordPress可为不同页面使用不同页面模板。在 页面>添加新页面 界面的最下方(或是侧边栏,取决于你安装的WordPress版本)有一个名为“页面模板”的下拉式菜单。你可以在这里选择显示某个页面所用的模板。

    <?php /*
    Template Name: Tag Archive
    */ ?>
    <div>
    <?php get_header(); ?>
    <h2>Tag Archive</h2>
    <?php wp_tag_cloud(''); ?>
    	<div class="navigation">
    <div class="alignleft"><?php next_posts_link('? Older Entries') ?></div>
    <div class="alignright"><?php previous_posts_link('Newer Entries ?') ?></div>
    	</div>
    <?php if (have_posts()) : ?>
    		<?php while (have_posts()) : the_post(); ?>
    		<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
    	<div class="entry">
    	<?php the_content('Read the rest of this entry ?'); ?>
    	</div>
    	<?php endwhile; ?>
    	<?php endif; ?>
    </div>
    <?php get_footer(); ?>

    注意:模板还没有添加样式。通过查看single.php主题文件可以了解你的主题所用的结构。

    函数历史

      ◆3.1 添加传递分类法数组的功能参数
      ◆2.9 添加 separator 参数
      ◆2.8 添加 taxonomy 和 echo 参数
      ◆2.7 添加 link 参数
      ◆2.5 在order参数下新增’RAND’顺序 ;format=array 返回数组
      ◆该标签始见于WordPress 2.3

    源文件

    wp_tag_cloud() 位于 wp-includes/category-template.php

    参考文档:https://www.uedsc.com/wordpress-wp_tag_cloud.html

  • WordPress函数:register post type (自定义文章类型)用法和范例

    WordPress函数:register post type (自定义文章类型)用法和范例

    register post type() 函数支持我们创建一个自定义的文章类型,或者修改已有的文章类型,该函数不能在init动作之前使用。

    用法

    <?php register_post_type( $post_type, $args ); ?>

    参数

    $post_type
    (string) (必选) 文章类型。(最多20个字符)
    Default: 空
    $args
    (array) (可选) 一个数组参数。
    Default: 空

    $args参数说明
    label
    (string) (可选) 是新类型的别名标记
    默认值: $post_type
    labels
    (array) (可选) 该新类型的数组参数。默认文章类型是 non-hierarchical type,页面类型是hierarchical ones。
    默认:如果为空,则name为label的值,singular_name则为name的值

    ◆ ‘name’ – 新类型的名字, 可以使用$post_type_object->label重新赋值。
    ◆ ‘singular_name’ – 新类型的对象名. 默认是name的值。
    ◆ ‘add_new’ – ‘Add New’的翻译文字. 默认值是 ‘Add New’ . 在国际化这个字符串,请使用 gettext context匹配你的文章类型。例如: _x(‘Add New’, ‘product’);
    ◆ ‘add_new_item’ – 添加新项的文本. 默认值是 Add New Post/Add New Page
    ◆ ‘edit_item’ – 编辑项文本。 默认值是 Edit Post/Edit Page
    ◆ ‘new_item’ – 新的项目文本。 默认值是 New Post/New Page
    ◆ ‘view_item’ – 查看项目文本。 默认值是 View Post/View Page
    ◆ ‘search_items’ – 检索项的文本。默认值是 Search Posts/Search Pages
    ◆ ‘not_found’ – 未发现的文本。默认值是 No posts found/No pages found
    ◆ ‘not_found_in_trash’ – 未发现垃圾文本。默认值是 No posts found in Trash/No pages found in Trash。
    ◆ ‘parent_item_colon’ – 父文本。 该字符串不能使用到non-hierarchical 类型上 。在 hierarchical ones 默认值是 Parent Page。
    ◆ ‘menu_name’ – 菜单的文本。 这个字符串是给菜单项的名字。 默认值是 name 的值。
    description
    (string) (可选) 对新类型的简短描述.
    Default: blank
    public
    (boolean) (可选) 为下列全部参数设置一个默认值: publicly_queriable, show_ui, show_in_nav_menus and exclude_from_search.
    默认值: false
    ‘false’ – 不显示此类型的用户界面 (show_ui=false), 该类型无法从前端进行查询 (publicly_queryable=false), 在搜索结果中排除该类型文章 (exclude_from_search=true),在导航菜单中隐藏 (show_in_nav_menus=false)
    ‘true’ – show_ui=true, publicly_queryable=true, exclude_from_search=false, show_in_nav_menus=true
    publicly_queryable
    (boolean) (可选) 该类型查询允许从前端进行。
    默认值: public的参数值
    exclude_from_search
    (boolean) (importance) 是否将该类型的文章从搜索结果中排除
    默认值: public 参数的值
    show_ui
    (boolean) (可选) 是否使用默认的ui界面. Note that _built-in post types, such as post and page, are intentionally set to false.
    默认值: public 参数的值
    ‘false’ – 不显示该类型的用户界面
    ‘true’ – 显示该类型的用户界面 (admin panel)
    show_in_menu
    (boolean or string) (可选) 是否显示该类型菜单,并设置显示的地方。 show_ui 必须为 true.
    默认值: null
    ‘false’ – 不显示在管理菜单。
    ‘true’ – 作为顶级菜单显示。
    ‘some string’ – 作为顶级页面,像 ‘tools.php’ or ‘edit.php?post_type=page’
    注意: 当使用’some string’为菜单页面通过插件创建顶级菜单项,该菜单项将会成为第一个菜单项。如果这不是你想要的结果。该插件创建菜单页面需要用add_action 将 admin_menu 设置为9或更低的优先级。
    menu_position
    (integer) (可选) 该菜单项的位置紧跟在哪个菜单项后面。
    默认值: null – 默认位置为评论( Comments)后面

    ◆ 5 – below Posts(文章后面)
    ◆ 10 – below Media(多媒体后面)
    ◆ 15 – below Links(连接后面)
    ◆ 20 – below Pages(页面后面)
    ◆ 25 – below comments(评论后面)
    ◆ 60 – below first separator(第一个分隔后面)
    ◆ 65 – below Plugins(插件后面)
    ◆ 70 – below Users(用户后面)
    ◆ 75 – below Tools(工具后面)
    ◆ 80 – below Settings(设置后面)
    ◆ 100 – below second separator(第二个分隔后面)
    menu_icon
    (string) (可选) 菜单图标.
    默认值: null – 默认使用文章图标
    capability_type
    (string or array) (可选) 该字符用于建立 read, edit, delete 功能。也可以通过传递数组来初始化功能,例如 array(‘story’, ‘stories’).
    默认值: “post”
    capabilities
    (array) (可选) 该类型的功能数组.
    默认值: capability_type
    默认情况下该数组有7个键可以接受参数:

    ◆ edit_post, read_post, 和 delete_post – 这是三个元功能,通常根据上下文映射到相应的原始功能 。例如,文章被被编辑/读/删除前,先要对用户或角色进行权限检查。因此,这些功能通常不会直接授予用户或角色。
    ◆ edit_posts – 控制是否有多个此类型的对象被编辑。
    ◆ edit_others_posts – 控制此类型的文章可以被非所有者编辑.如果文章类型不支持作者,那么这将像edit_posts。
    ◆ publish_posts – 控件对象发布文章类型。
    read_private_posts – 控制是否私有对象可以读。

    注意: 后面的四项功能会在核心的不同位置检查。
    也有其他七个原始的功能不是直接用在核心,但在map_meta_cap()。上述三个元功能,将它们转换成一个或多个原始的功能,就必须根据上下文对用户或角色的检查。这些额外的功能只用于map_meta_cap()。因此,如果该类型已经注册,“map_meta_cap” 默认值将为 true,否则默认为false。

    read – 控制是否可以读取.

    ◆ delete_posts – 控制是否可以删除
    ◆ delete_private_posts – 控制是否可以删除私有的。
    ◆ delete_published_posts – 控制是否可以删除已发布的。
    ◆ delete_others_posts – 控制非所有者是否可以删除. 如果文章类型不支持作者,那么这将像delete_posts。
    ◆ edit_private_posts – 控制是否可以编辑私有的。
    ◆ edit_published_posts – 控制是否可以编辑已发布的。
    map_meta_cap
    (boolean) (可选) 是否使用内置默认的元功能。
    默认值: false
    hierarchical
    (boolean) (可选) 是否此类型支持层级和允许被指定为父级

    默认值: false
    supports
    (array) (可选) 调用 add_post_type_support() 的别名。
    默认值: title 和 editor

    ◆ ‘title’
    ◆ ‘editor’ (content)
    ◆ ‘author’
    ◆ ‘thumbnail’ (featured image, current theme must also support post-thumbnails)
    ◆ ‘excerpt’
    ◆ ‘trackbacks’
    ◆ ‘custom-fields’
    ◆ ‘comments’ (also will see comment count balloon on edit screen)
    ◆ ‘revisions’ (will store revisions)
    ◆ ‘page-attributes’ (template and menu order, hierarchical must be true to show Parent option)
    ◆ ‘post-formats’ add post formats, see Post Formats
    register_meta_box_cb
    (string) (可选) 提供一个回调函数来控制页面。可以在该函数中使用 remove_meta_box() 和 add_meta_box() .
    默认值: None
    taxonomies
    (array) (可选) 此类型支持的已注册分类法类型数组,如 category 或 post_tag 。 雷同register_taxonomy_for_object_type() 。分类法可以使用 register_taxonomy()来注册。

    默认值: None
    permalink_epmask
    (string) (可选) The default rewrite endpoint bitmasks. For more info see Trac Ticket 12605.
    Default: EP_PERMALINK
    has_archive
    (boolean or string) (可选) 如果允许该类型归档,将会使用字符串作为连接,如果支持url重写,该url将会被重写 。
    默认值: false
    rewrite
    (boolean or array) (可选) url重写的规则. False 将不支持重写.
    默认值: true 并使用类型作为连接
    $args array

    ◆ ‘slug’ -默认使用此类型的 name , 自定义使用 array(‘slug’=>$slug)
    ◆ ‘with_front’ – 允许在连接上添加前缀 (例如:如果前缀是 /blog/, 你的连接: false->/news/, true->/blog/news/) – 默认为true
    ◆ ‘feeds’ – 默认是has_archive 的值
    ◆ ‘pages’ – 默认值 true
    query_var
    (boolean or string) (可选) False 不允许被查询, 否则该字符串值将会成为此类型的查询后的对象
    默认: true – 设置 $post_type 为查询结果
    can_export
    (boolean) (可选) 此类型是否可以输出.
    默认值: true
    show_in_nav_menus
    (boolean) (可选) post_type是否可在导航菜单选择。
    Default: public 参数的值
    _builtin
    (boolean) (not for general use) Whether this post type is a native or “built-in” post_type. Note: this Codex entry is for documentation – core developers recommend you don’t use this when registering your own post type
    Default: false
    ‘false’ – default this is a custom post type
    ‘true’ – this is a built-in native post type (post, page, attachment, revision, nav_menu_item)
    _edit_link
    (boolean) (not for general use) Link to edit an entry with this post type. Note: this Codex entry is for documentation ‘-‘ core developers recommend you don’t use this when registering your own post type
    Default:
    ‘post.php?post=%d’

    范例

    注册一个文章类型叫 “book”的范例,包括提供上下文帮助:

    <?php
    add_action('init', 'my_custom_init');
    function my_custom_init()
    {
      $labels = array(
        'name' => _x('Books', 'post type general name'),
        'singular_name' => _x('Book', 'post type singular name'),
        'add_new' => _x('Add New', 'book'),
        'add_new_item' => __('Add New Book'),
        'edit_item' => __('Edit Book'),
        'new_item' => __('New Book'),
        'view_item' => __('View Book'),
        'search_items' => __('Search Books'),
        'not_found' =>  __('No books found'),
        'not_found_in_trash' => __('No books found in Trash'),
        'parent_item_colon' => '',
        'menu_name' => 'Books'
      );
      $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'has_archive' => true,
        'hierarchical' => false,
        'menu_position' => null,
        'supports' =>array('title','editor','author','thumbnail','excerpt','comments')
      );
      register_post_type('book',$args);
    }
    //添加过滤器,以确保课本用户更新时会显示。
    add_filter('post_updated_messages', 'book_updated_messages');
    function book_updated_messages( $messages ) {
      global $post, $post_ID;
      $messages['book'] = array(
        0 => '', // 未使用。信息开始在索引1。
        1 => sprintf( __('Book updated. <a href="%s">View book</a>'), esc_url( get_permalink($post_ID) ) ),
        2 => __('Custom field updated.'),
        3 => __('Custom field deleted.'),
        4 => __('Book updated.'),
        /* translators: %s: date and time of the revision */
        5 => isset($_GET['revision']) ? sprintf( __('Book restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
        6 => sprintf( __('Book published. <a href="%s">View book</a>'), esc_url( get_permalink($post_ID) ) ),
        7 => __('Book saved.'),
        8 => sprintf( __('Book submitted. <a target="_blank" href="%s">Preview book</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
        9 => sprintf( __('Book scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview book</a>'),
          // translators: Publish box date format, see http://php.net/date
          date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
        10 => sprintf( __('Book draft updated. <a target="_blank" href="%s">Preview book</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
      );
      return $messages;
    }
    //显示图书上下文帮助
    add_action( 'contextual_help', 'add_help_text', 10, 3 );
    function add_help_text($contextual_help, $screen_id, $screen) {
      //$contextual_help .= var_dump($screen); // use this to help determine $screen->id
      if ('book' == $screen->id ) {
        $contextual_help =
          '<p>' . __('Things to remember when adding or editing a book:') . '</p>' .
          '<ul>' .
          '<li>' . __('Specify the correct genre such as Mystery, or Historic.') . '</li>' .
          '<li>' . __('Specify the correct writer of the book.  Remember that the Author module refers to you, the author of this book review.') . '</li>' .
          '</ul>' .
          '<p>' . __('If you want to schedule the book review to be published in the future:') . '</p>' .
          '<ul>' .
          '<li>' . __('Under the Publish module, click on the Edit link next to Publish.') . '</li>' .
          '<li>' . __('Change the date to the date to actual publish this article, then click on Ok.') . '</li>' .
          '</ul>' .
          '<p><strong>' . __('For more information:') . '</strong></p>' .
          '<p>' . __('<a href="http://codex.wordpress.org/Posts_Edit_SubPanel" target="_blank">Edit Posts Documentation</a>') . '</p>' .
          '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>' ;
      } elseif ( 'edit-book' == $screen->id ) {
        $contextual_help =
          '<p>' . __('This is the help screen displaying the table of books blah blah blah.') . '</p>' ;
      }
      return $contextual_help;
    }

    开始版本
    WP 2.9

    源文件

    register_post_type() is located in wp-includes/post.php.

    官方文档

    http://codex.wordpress.org/zh-cn:函数参考/register_post_type

WeChat