WordPress remove_meta_box()函数

说明

可以移除文章、页面编辑界面的Meta模块,还可以移除仪表盘的Meta模块。
定义在: wp-admin/includes/template.php

用法

1
<?php remove_meta_box( $id, $page, $context ); ?>

参数

$id (字符串)(必需)所要移除的Meta模块的HTML 的 id 属性。
部分可用的 id 如下:
‘authordiv’ – 作者模块
‘categorydiv’ – 分类模块
‘commentstatusdiv’ – 评论状态模块
‘commentsdiv’ – 评论模块
‘formatdiv’ – 文章格式模块
‘pageparentdiv’ – 页面属性模块
‘postcustom’ – 自定义字段模块
‘postexcerpt’ – 摘要模块
‘postimagediv’ – 特色图像模块
‘revisionsdiv’ – 版本模块
‘slugdiv’ – 别名模块
‘submitdiv’ – 发布 模块
‘tagsdiv-post_tag’ – 标签模块
‘trackbacksdiv’ – 发送 trackback 模块

默认值:无

$page (字符串)(必需)要从那个编辑界面移除Meta模块,
可用值:
‘post’ – 文章编辑界面
‘page’ – 页面编辑界面
‘attachment’ – 附件编辑界面
‘link’ – 链接编辑界面
‘dashboard’ – 仪表盘
或者已注册的自定义文章类型的编辑界面,例如 ‘my-product’
默认值:无

$context(字符串)(必需)所要删除的Meta模块所在的位置,
可选值: ‘normal’, ‘advanced’, or ‘side’.
默认值:无

示例

在文章编辑界面移除自定义字段模块:

1
2
3
4
5
6
<?php 
function remove_post_custom_fields() {
	remove_meta_box( 'postcustom' , 'post' , 'normal' ); 
}
add_action( 'admin_menu' , 'remove_post_custom_fields' );
?>
发表在 WordPress教程 | 标签为 | WordPress remove_meta_box()函数已关闭评论

add_filter()使用与解析

常用函数-add_filter()

说明

将函数连接到特定过滤器动作。

过滤器是WordPress发布的一种hook,在不同类别的文本被添加到书库据或发送到浏览器窗口前对这些文本进行修改。插件可用过滤器API规定在修改特定类型的文本时,执行一个还是多个PHP函数。在Plugin API上查阅过滤器hook列表。

用法

<?php add_filter($tag,  $function_to_add,  $priority = 10,  $accepted_args = 1); ?>

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
add_filter( 'bloginfo', 'mybloginfo', 1, 2 );
add_filter( 'bloginfo_url', 'mybloginfo', 1, 2 );
 
function mybloginfo( $result='', $show='' ) {
	switch ( $show ) {
		case 'wpurl':
			$result = SITE_URL;
			break;
		case 'template_directory':
			$result = TEMPL_DIR;
			break;
		default: 
	}
	return $result;
}

参数

$tag

(字符串)(必需)连接到$function_to_add的过滤器名称

默认值:None

$function_to_add

(回调)(必需)应用过滤器时被调用函数的名称

默认值:None

$priority

(整数)(可选)用于规定函数被执行的顺序,函数与特定动作关联。较小的数字匹配较早的执行,同等优先级的函数按加入action的顺序被执行。

默认值:10

$accepted_args

(整数)(必需)函数所接受参数的数量。在WordPress 1.5.1及之后版本中,连接的函数可吸收其它在调用do_action() 或 apply_filters()时设置的参数。

默认值:None

用户还需要为过滤器回调时函数的命名空间提供一个指示器,如:

<?php add_filter(‘media_upload_newtab’, array(&$this, ’media_upload_mycallback’)); ?>

否则WordPress会为函数查找自备命名空间,从而引发异常状况。

返回的值

$function_to_add成功添加到$tag过滤器时返回true。返回函数可接受的参数数量。在WordPress 1.5.1及之后版本中,连接的函数可吸收其它在调用do_action() 或 apply_filters()时设置的参数。例如,comment_id_not_found动作将传递任何函数,若该函数将所请求的评论编号连接到该动作。

常用的tag

bloginfo
the_content
the_title
bloginfo

更多可到这里查看:http://adambrown.info/p/wp_hooks

发表在 WordPress教程 | 标签为 | add_filter()使用与解析已关闭评论

wordpress特色图像功能补充说明

博客的观感很大取决于图片的数量,所以为wordpress中的文章设置缩略图是非常重要的。
我在wordpress文章缩略图的实现一文中曾经介绍过wordpress中如何使用特色图像功能来实现wordpress缩略图。今天对wordpress的特色图像功能做一些补充。

调用不同wordpress特色图像

在后台-设置-多媒体中我们可以设置3种尺寸的worpdress缩略图,以下代码即可分别调用这3种缩略图:

1
2
3
4
5
6
7
8
9
the_post_thumbnail(); // 默认显示缩略图
 
the_post_thumbnail(‘thumbnail’); // 显示缩略图
 
the_post_thumbnail(‘medium’); // 显示中等尺寸
 
the_post_thumbnail(‘large’); // 显示大尺寸
 
the_post_thumbnail( array(200,200) ); // 自定义尺寸

为特色图像添加Alt属性

WordPress特色图像功能,默认并没有Alt属性,大家知道,搜索引擎对图片的识别还是主要依赖于alt属性,所以添加该属性很有必要。

1
the_post_thumbnail('thumbnail' ,array('alt'=> trim(strip_tags( $post->post_title )), 'title'=> trim(strip_tags( $post->post_title ))));

这样就能为特色图像添加alt属性了。

发表在 WordPress教程 | 标签为 | wordpress特色图像功能补充说明已关闭评论

wordpress主题文件的调用方式

今天看到有人问这个问题,刚开始学习wordpress的时候在我爱水煮鱼的教程里看到过,现在一时间也记不起来了,好记性不如烂笔头果然不假。

wordpress主题文件概述

wordpress主题文件调用有固有的方式,即使调用时没有找到需要的文件,也会调用替代文件。wordpress有两个必须的文件:index.php和 style.css。大家可以看下面这幅图:

WP_CheatSheet_TemplateMap
(ps:这个图应该从上至下,从左往右看。)

从这张图上大家可以看出来如果所需的文件没有找到,都将会使用index.php替代。

wordpress主题文件调用详述

下面具体介绍下各类主题文件的调用层次。

1、首页
调用顺序依次是:
front-page.php
home.php
index.php
当客户端请求主页时,WP将搜索front-page.php。 如果不存在,它将会使用home.php。如果 home.php存在,它会用到它。否则,它会默认采用index.php。

2、单篇日志
调用顺序依次是:
single-[post-type].php
single.php
index.php
只要你需要,WordPress可以有各种日志类型。这将会更容易使得所有/一些日志类型可以有不同的设计。默认情况下“post”是WP主要和默认的日志类型。
这样,举例来说,如果你的自定义日志类型是 product ,那么它的模板将会是single-product.php。

3、单个静态页面
调用顺序依次是:
[custom-template].php
page-[slug].php
page-[id].php
page.php
index.php
与post类型一样,类型,我们可以使用自定义页模板让page类型的页面有不同的页面布局。WP首先搜索指定的页面模板文件(如果存在)。
如果没有找到,它将寻找带有当前页面别名(slug)的模板文件。基本上,如果别名是aboutus,那么它将在当前主题文件夹中搜索文件page-aboutus.php。
WP将像搜索别名页面模板一样搜索文件ID模板。

4、分类
调用顺序依次是:
category-[slug].php
category-[id].php
category.php
archive.php
index.php

5、标签
调用顺序依次是:
tag-[slug].php
tag-[id].php
tag.php
archive.php
index.php

6、其它分类(Taxonomy)
调用顺序依次是:
taxonomy-[tax]-[term].php
taxonomy-[tax].php
taxonomy.php
archive.php
index.php

7、作者
调用顺序依次是:
author-[author-nicname].php
author-[author-id].php
author.php
archive.php
index.php

8、附件
调用顺序依次是:
[mime-type].php
attachment.php
single.php
index.php

9、日期
调用顺序依次是:
date.php
archive.php
index.php

10、存档
调用顺序依次是:
archive.php
index.php

11、搜索
调用顺序依次是:
search.php
index.php

12、404页面
调用顺序依次是:
404.php
index.php

小结

在我的主题里主要用到了其中绝大部分的文件,用到的文件越多代表你的主题越丰富。
参考文章:The WordPress Theme Files Execution Hierarchy

发表在 WordPress教程 | 标签为 | wordpress主题文件的调用方式已关闭评论

WordPress get_query_var()函数

本来想介绍下Wordpress最新文章的实现,后来发现了个函数get_query_var(),觉得有必要来讲一下。Wordpress里面函数确实多,以后重要的我都会介绍下。

说明

get_query_var函数的最主要作用就是能够查询得到当前文章的分类及分页。
定义在:wp-includes/query.php
原始定义:

1
2
3
4
5
function get_query_var($var) {
	global $wp_query;
 
	return $wp_query->get($var);
}

用法

1
<?php get_query_var( $var ) ?>

参数

$var(必选) 用于查询的参数

如下所示:

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
’error’
’m’
‘p’
’post_parent’
’subpost’
’subpost_id’
 ’attachment’
’attachment_id’
’name’
’static’
’pagename’
’page_id’
’second’
’minute’
’hour’
’day’
’monthnum’
’year’
’w’
’category_name’
’tag’
’cat’
’tag_id’
’feed’
’tb’
’paged’
’comments_popup’
’meta_key’
’meta_value’
’preview’
’s’
’sentence’
’fields’

示例

得到当前分页:

1
<?php  get_query_var('paged');  ?>

得到当前分类:

1
<?php  get_query_var('cat');  ?>

小结

用在查询分页及分类的时候非常有用,其它的功能尚有待研究

发表在 WordPress教程 | 标签为 | WordPress get_query_var()函数已关闭评论

去除WordPress脚本和样式表的版本号

用过七牛cdn的同学大概有过这样的经历:在主题里更新了一个js脚本或者css文件后,但是却无法更新七牛那里的缓存文件,因为js脚本或者css文件后面往往添加了?ver=xxx这样的版本号。本文介绍下问题产生的原因及解决办法。

版本号产生原因

这是因为WordPress中使用wp_enqueue_script()和wp_enqueue_style()引入js脚本和css样式表时,会生成一个版本号,如果你不亲自指定,版本号会是WordPress的版本号,比如3.7.1。版本号有好处,可以强制浏览器更新脚本,但有些SEO检测工具会认为带有版本号是非静态化的表现,同样给七牛cdn的缓存更新带来麻烦。

解决办法

在主题的functions.php中加入如下代码,就可以去除版本号:

1
2
3
4
5
6
function sb_remove_script_version( $src ){
    $parts = explode( '?', $src );
    return $parts[0];
}
add_filter( 'script_loader_src', 'sb_remove_script_version', 15, 1 );
add_filter( 'style_loader_src', 'sb_remove_script_version', 15, 1 );

要注意的是,只有通过WordPress的方式引入脚本才会产生版本号,如果自己硬编码进去,这段代码是不起作用的,当然,不推荐硬编码js文件。

小结

本文参考了http://www.solagirl.net/remove-version-string-from-js-css.html这篇文章,确实解决了该问题。

发表在 WordPress教程 | 标签为 | 去除WordPress脚本和样式表的版本号已关闭评论

使用 WP_Query自定义WordPress循环

最近又在学习wordpress基础的知识,虽说这个主题是自己一点一点弄出来的,但是当时写的时候大多是copy现成的代码,要说自己直接写出来几乎不可能。所以就针对这些基础的函数,结构什么的再来研究下。

自定义Wordpress循环是wordpress实现功能的主要构成部分,主要有两种方式实现:一是用query_posts()函数,二是采用WP_Query类。关于使用query_posts()函数的使用,可以参考这篇文章:
[blink]更多文章参考:
自己定义wordpress主循环
[/blink]

query_posts()函数存在的问题

不知道大家有没有这个体会,我是遇到过这个问题:wordpress判断首页函数失效。后来排查后发现在使用query_posts()函数后没有用wp_reset_query()重置查询,从而导致判断首页的函数失效。

query_posts()函数使用有如下几点问题:

  • 会干扰那些用到了 WordPress 循环的插件。
  • 可能使一些 WordPress 条件判断函数失效。如上述我说的首页判断函数
  • 分页将无法正常工作,除非你适当设置 ‘paged’ 查询: adding the paged parameter

如果你在模板页面中使用 query_posts()函数 ,WordPress 就会在 query_posts 时执行数据库查询和检索记录(即它是如何知道是服务于哪个模板页面!)所以,当你使用 query_posts() 覆盖了默认的查询,你基本上就扔掉了默认的查询以及它的结果,并重新对数据库执行了另一个查询。所以很容易扰乱主循环的正常工作。解决这个问题的最好办法就是用wp_reset_query()重置查询。

使用WP_Query自定义WordPress循环

当然,还有一个选择就是使用WP_Query来创建wordpress循环。

首先使用WP_Query创建一个实例:比如我们要创建一个最新日志列表,就可以使用下面的代码:

1
2
3
4
<?php
    $recentPosts = new WP_Query();
    $recentPosts->query('showposts=5');
?>

上面代码定义了一个叫做 recentPosts 的变量,它是WP_Query 类的一个实例。然后我使用了WP_Query的一个方法开始一个查询,我们可以使用和query_posts函数一样的参数。现在就可以开始我们自己的循环了:

1
2
3
<?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>
   <!-- do some stuff here -->
<?php endwhile; ?>

上面我们用了 WP_Query 的两个方法,分别是 have_posts 和 the_post。

这样做的好处是在循环中,我们可以使用标准的 post 模板函数。比如下面是使用自定义的 Loop 先是最新5篇文章的完整代码:

1
2
3
4
5
6
7
8
9
10
11
<h3>最新日志</h3>
<ul>
<?php
    $recentPosts = new WP_Query();
    $recentPosts->query('showposts=5');
?>
<?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>
    <li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
</ul>

小结

其实query_posts()函数也可以看做是 WP_Query的专门针对主循环的一个方法,使用 WP_Query创建实例后再使用query方法则不会影响到主循环。不过,我现在用的query_posts()函数蛮多的。
参考文章:使用 WP_Query 而不是 query_posts 自定义 WordPress 主循环

发表在 WordPress教程 | 标签为 | 使用 WP_Query自定义WordPress循环已关闭评论

wordpress自定义文章类型的介绍与使用说明

如果你使用过wordpress,你应该比较熟悉wordpress的两种文章类型:Post(文章)和Page(页面),用wordpress3.0之前的版本搭建的网站的文章,大多属于这两种类型。Post一般作为经常更新的文章使用(如博客日志),Page一般作为静态页面使用(如网站的关于和联系页面)。

但是偶尔网站要显示一些特殊的内容,这涉及到自定义文章类型,假设我们要创建一个页面,用来记录一些事件(Event),比如个人生日、假日、会议日期等等。在下面的教程里,为了使代码统一,我们使用了wordpress3.0的默认主题。不过,这些技术同样适用于其他主题。

创建自定义文章类型

先看以下代码:

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
add_action( 'init', 'create_events' );
function create_events() {
  $labels = array(
    'name' => _x('Events', 'post type general name'),
    'singular_name' => _x('Event', 'post type singular name'),
    'add_new' => _x('Add New', 'Event'),
    'add_new_item' => __('Add New Event'),
    'edit_item' => __('Edit Event'),
    'new_item' => __('New Event'),
    'view_item' => __('View Event'),
    'search_items' => __('Search Events'),
    'not_found' =>  __('No Events found'),
    'not_found_in_trash' => __('No Events found in Trash'),
    'parent_item_colon' => ''
  );
 
  $supports = array('title', 'editor', 'custom-fields', 'revisions', 'excerpt');
 
  register_post_type( 'event',
    array(
      'labels' => $labels,
      'public' => true,
      'supports' => $supports
    )
  );
}

将上面的代码粘贴到主题文件夹的functions.php中,下面简单讲解一下上面的代码。

add_action告诉wordpress初始化时调用函数create_events

$label数组告诉wordpress如何显示这个文章类型的相关信息

$supports数组告诉wordpress这个文章类型可以支持什么(比如文章摘要excerpt)

register_post_type就是在wordpress注册这个新的文章类型,这个函数有很多选项可用,具体可以参阅相关文章。

一旦我们把代码添加到function.php后,我们可以在后台管理页面看到如下页面:

zdywzlx1

点击添加新事件(Add New)你可以像发表一般文章一样来添加新的事情,如下图:

zdywzlx2

显示自定义文章类型

添加完事件之后发布,然后编辑事件,点击View Event(查看事件),你就可以看到事件就像正常文章一样显示了。

zdywzlx3

当然我们在wordpress自定义文章类型是因为它们和一般的文章是不一样的。wordpress内部有一个很好的机制用来自定义文章类型的外观,如果你曾经做过wordpress主题,应该知道,一般文章(post)对应的模板文件是single.php。wordpress3.0允许你用自定义的模板文件(如single-event.php)来定制我们新的文章类型的外观。

为了简便起见,我们将single.php复制并命名为single-event.php,为了演示看是否生效,我们对代码做一些改动。

原代码:

1
<h1 class="entry-title"><?php the_title(); ?></h1>

新代码:

1
<h1 class="entry-title">Event: <?php the_title(); ?></h1>

回到刚才的事件页面,我们发现标题已经发生了改变。有需要的话我们可以进一步修改single-event.php文件。

zdywzlx4

列出自定义文章类型

前面我们讲解如何创建、显示单个事件,但是如果我们需要像博客日志一样列出所有的事件应该如何操作?

这里有很多方法可以实现这个功能,一个通常使用的方法是通过Page Template(页面模板)来实现,这个方法如果使用几次后发现它并不难,只是需要的步骤多一点。

(1)首先复制一份page.php并将它命名为page-events.php。(可以在wordpress创建很多不同页面模板)。

(2)在page-events.php头部添加一下代码,这些代码告诉wordpress这是一个模板文件,以及这个模板文件的 相关信息。

1
2
3
4
5
6
7
8
9
<?php
/**
 * Template Name: Events Template
 * @package WordPress
 * @subpackage Twenty_Ten
 * @since Twenty Ten 1.0
 */
 
get_header(); ?>

(3)先用下面的代码来获取所有的事件文章.

1
<?php query_posts(array('post_type'=>'event')); ?>

(4)然后用wordpress loop的方法来显示出所有的事件文章。

1
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>

这样我们就创建好了一个自定义的页面模板,接着创建一个Event页面来显示这些事件,进入wordpress后台的页面部分,创建一个新页面命名为Event,然后在页面属性的模板选项里,选择我们刚才创建的模板文件即可。发布完后,到网站查看这个页面,可以发现所有的事件文章都列在上面了。根据不同的主题,你可能需要修改导航栏的相关代码。

zdywzlx5

通过修改page-events..php文件,我们可以自定义这个类型的文章的显示方式,比如为每个事件增加一个日历按钮或者只显示事件标题等。

小结

通过这个实例,我想你已经对自定义文章类型这个概念有一定的了解,并且知道如何在wordpress里创建、显示、列出自定义文章类型。如果你觉得操作这些代码对你有难度,或者你对制作wordpress主题不是很了解,也可以通过插件的形式来自定义文章类型,比如Custom Post Type UI。

参考文章:实例讲解如何在wordpress内自定义文章类型

发表在 WordPress教程 | 标签为 | wordpress自定义文章类型的介绍与使用说明已关闭评论

WordPress工作机制

wordpress作为一个功能丰富的博客程序深受大家喜爱,我也一直在用wordpress,虽然也写了不少关于wordpress的文章,还是局限于wordpress主题的功能,很少涉及到更加深入的东西,所以以后会更多的介绍深入的wordpress知识。

wordpress初始化过程

WP初始化的过程:当你访问wordpress网站的时候,wordpress开始进行初始化,wordpress默认会找根目录下的index.php页面,我们看一下index.php页面:

1
2
3
4
5
<?php
define('WP_USE_THEMES', true);
/** Loads the WordPress Environment and Template */
require('./wp-blog-header.php'); ---/wp-blog-header.php包含进来
?>

你会发现,它会去调用根目录下的wp-blog-header.php,我们继续看wp-blog-header.php:

1
2
3
4
5
6
7
8
<?php
if ( !isset($wp_did_header) ) {
$wp_did_header = true;
require_once( dirname(__FILE__) . '/wp-load.php' );  ---加载wp-load.php
wp();  ---加载function WP();
require_once( ABSPATH . WPINC . '/template-loader.php' );   ---加载模板文件
}
?>

通过wp-load.php,wordpress先后把 wp-config.php ,wp-setting.php ,classes.php ,fucntions.php ,query.php等文件加载进来,并建立了三个全局变量: $wp_the_query, $wp_rewrite和 $wp ,分别为 WP_Query, WP_Rewrite和WP类的实例。

然后 wp-blog-header 执行 wp() 函数,并通过其调用 $wp 所属WP类的main方法, 这个方法又调用一系列方法,但最重要的是 parse_request 方法, WP从这里开始解析URL并建立主循环。 我们看一下wordpress的main方法:

1
2
3
4
5
6
7
8
9
function main($query_args = '') {
$this->init();  --初始化环境
$this->parse_request($query_args);   --解析请求
$this->send_headers();  --发送头信息
$this->query_posts();  --查询日志
$this->handle_404();   --操作404(URL地址不存在)
$this->register_globals();  --注册全局变量
do_action_ref_array('wp', array(&$this));
}

接下来就是加载模板文件,呈现wordpress博客界面。
这基本上就是wordpress初始化时的信息。

wordpress内部运行实例

下面就讨论一下当我们设置自定义的永久链接时,wordpress的运作过程。

当我们使用了自定义的永久链接的时候,wordpress会自动生成.htaccess文件,并且在这个文件中生成相 对应于永久链接的匹配规则,在wordpress/wp-includes/rewrite.php中有针对.htaccess文件的重写规则,其中 $use_verbose_rules 参数规定了输出信息的详尽和简约,默认的情况下为false。输出的信息比较简单, 如下

1
2
3
4
5
6
7
8
9
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

如果想查看完整的匹配规则,就把$use_verbose_rules设置为true。 wordpress在对使用了自定义的永久链接进行处理时,它还是会调用wp-include/classes.php文件中的parse_request函数,对发过来的请求进行解析,无论是否为pathinfo类型的请求,都会被赋值给$request参数,然后调用该参数与.htaccess中的规则进行匹配,如果找到一个匹配就会“发送头信息” 、“查询日志”,如果没有任何匹配就会返回404错误。

小结

以上介绍了用户访问wordpress时它的一系列动作,其实可以看到模板文件加载之前已经加载了很多文件,只有了解这些才能更深入的理解wordpress。

参考文章:wordpress工作原理

发表在 WordPress教程 | 标签为 | WordPress工作机制已关闭评论