标签归档:Wordpress

自定义WordPress主题widgets

将以下代码添加到functions.php:

function widget_footer_copyright() {
register_sidebar(array(
'id'=>'widget_footer_copyright',
'name'=>'页脚版权信息'
));
}
add_action('widgets_init','widget_footer_copyright');

在模板文件中使用:
<ul><?php dynamic_sidebar(‘widget_footer_copyright’); ?></ul>

在WordPress主题中使用自定义Shortcode

WordPress 的 Shortcode 常用的主要有3种:
[shortcode foo=”bar”]
[shortcode]text[/shortcode]
[shortcode foo=”bar”]text[/shortcode]

这里简单介绍第一种的定制方法,编辑以下代码到functions.php:

// [redirect url="?page_id=100"]
function sc_redirect( $atts ){
extract( shortcode_atts( array(
'url' => 'http://mimiz.cn',
), $atts ) );

$result = ‘window.location.href=”‘.home_url(‘/’).$url.'”;’;

return $result;
}
add_shortcode( ‘redirect’, ‘sc_redirect’ );

以上代码作用是创建一个重定向的shortcode。

需要进一步了解shortcode请移步官方文档:
http://codex.wordpress.org/Shortcode_API

在WordPress主题中自定义菜单

1. 首先在主题的functions.php中注册菜单:

register_nav_menus(array(
'primary_nav' => 'Primary Navigation',
'secondary_nav' => 'Primary Navigation'
));

2. 在后台的 Appearance -> Menus 中设置菜单项。

3. 在主题中显示菜单:

wp_nav_menu( array('menu_class' => 'primary_nav', 'theme_location' =>'primary_nav') );

wp_nav_menu(); 函数支持丰富的参数,详情参考官方文档:
http://codex.wordpress.org/Function_Reference/wp_nav_menu

在WordPress中创建自定义的文章类型

例如我想创建一个Events类型,用来发布企业活动事件,其实异常简单,我们分三步来操作:

一、创建Events类型:
编辑functions.php 文件,插入以下代码:

add_action('init', 'register_events');

function register_events() {
register_post_type('events', array(
'labels' => array(
'name' => 'Events',
'singular_name' => 'Event',
'add_new' => 'Add Event',
'add_new_item' => '',
'edit_item' => 'Edit Event',
'new_item' => 'New Event',
'view_item' => 'See Event',
'search_items' => 'Search in Event',
'not_found' => 'No Event',
'not_found_in_trash' => 'No Event'
),
'public' => true,
'taxonomies' => array('category'),
'supports' => array('title','editor','excerpt','thumbnail')
));
}

二、定义Events类型的显示模板:
把single.php复制并命名为single-events.php,自定义HTML显示方式。

三、创建Events文章的列表页面:
1. 创建模板文件page-events.php,插入以下代码:

<?php
/***
Template Name: Events
*/
get_header(); ?>
<?php query_posts(array('post_type'=>'events')); ?>
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
<?php endwhile; ?>
<?php get_footer(); ?>

2. 创建一个page页面,并选择模板为Event。

从wordpress分类列表的widget中移除某个分类的插件

WordPress的分类小工具会把所有的分类都显示出来,
有时候我们只想显示其中的几个分类,或者隐藏某个分类。
对于这种需求,可以使用wp_list_categories($args)这个模板标签来控制它。

例如只想显示ID为1、3、5的分类:
wp_list_categories('include=1,3,5');

不显示ID为2、4的分类且显示每个分类的日志数:
wp_list_categories('exclude=2,4&show_count=1');

详细说明请参考官方文档:
http://codex.wordpress.org/Template_Tags/wp_list_categories

由于某种原因,我不能直接在模板文件中使用wp_list_categories,
只好把它做成插件的形式使用,翻了下官方的API,
发现wp-includes/default-widgets.php中有个WP_Widget_Categories类是控制分类小工具输出的,
直接毫不犹豫的Copy出来修改wp_list_categories函数,按照插件机制,做成小插件。
以下是插件代码:(也可以从这里下载)

<?php
/*
* Plugin Name: Categories Widget Exclude ID
* Plugin URI: http://mimiz.cn
* Description: A simple plugin allow you remove some of the categories from categories widget.
* Author: Zhang Cheng
* Version: 0.1
* Author URI: http://mimiz.cn
*/
class limited_catagories_list_widget extends WP_Widget {

private $_exclude_id = ‘1’; // Categories ID, you want to remove.

function __construct() {
$widget_ops = array( ‘classname’ => ‘widget_categories’, ‘description’ => __( “A list or dropdown of categories” ) );
parent::__construct(‘categories’, __(‘Categories’), $widget_ops);
}

function widget( $args, $instance ) {
extract( $args );

$title = apply_filters(‘widget_title’, empty( $instance[‘title’] ) ? __( ‘Categories’ ) : $instance[‘title’], $instance, $this->id_base);
$c = ! empty( $instance[‘count’] ) ? ‘1’ : ‘0’;
$h = ! empty( $instance[‘hierarchical’] ) ? ‘1’ : ‘0’;
$d = ! empty( $instance[‘dropdown’] ) ? ‘1’ : ‘0’;

echo $before_widget;
if ( $title )
echo $before_title . $title . $after_title;

$cat_args = array(‘orderby’ => ‘name’, ‘show_count’ => $c, ‘hierarchical’ => $h);

if ( $d ) {
$cat_args[‘show_option_none’] = __(‘Select Category’);
wp_dropdown_categories(apply_filters(‘widget_categories_dropdown_args’, $cat_args));
?>

/* 0 ) {
location.href = “/?cat=”+dropdown.options[dropdown.selectedIndex].value;
}
}
dropdown.onchange = onCatChange;
/* ]]> */

<?php
} else {
?>
<ul>
<?php
$cat_args[‘title_li’] = ”;
$cat_args[‘exclude’] = $this->_exclude_id;
wp_list_categories(apply_filters(‘widget_categories_args’, $cat_args));
?>
</ul>
<?php
}

echo $after_widget;
}

function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance[‘title’] = strip_tags($new_instance[‘title’]);
$instance[‘count’] = !empty($new_instance[‘count’]) ? 1 : 0;
$instance[‘hierarchical’] = !empty($new_instance[‘hierarchical’]) ? 1 : 0;
$instance[‘dropdown’] = !empty($new_instance[‘dropdown’]) ? 1 : 0;

return $instance;
}

function form( $instance ) {
//Defaults
$instance = wp_parse_args( (array) $instance, array( ‘title’ => ”) );
$title = esc_attr( $instance[‘title’] );
$count = isset($instance[‘count’]) ? (bool) $instance[‘count’] :false;
$hierarchical = isset( $instance[‘hierarchical’] ) ? (bool) $instance[‘hierarchical’] : false;
$dropdown = isset( $instance[‘dropdown’] ) ? (bool) $instance[‘dropdown’] : false;
?>
<p><label for=”<?php echo $this->get_field_id(‘title’); ?>”><?php _e( ‘Title:’ ); ?></label>
<input class=”widefat” id=”<?php echo $this->get_field_id(‘title’); ?>” name=”<?php echo $this->get_field_name(‘title’); ?>” type=”text” value=”<?php echo $title; ?>” /></p>

<p><input type=”checkbox” class=”checkbox” id=”<?php echo $this->get_field_id(‘dropdown’); ?>” name=”<?php echo $this->get_field_name(‘dropdown’); ?>”<?php checked( $dropdown ); ?> />
<label for=”<?php echo $this->get_field_id(‘dropdown’); ?>”><?php _e( ‘Display as dropdown’ ); ?></label><br />

<input type=”checkbox” class=”checkbox” id=”<?php echo $this->get_field_id(‘count’); ?>” name=”<?php echo $this->get_field_name(‘count’); ?>”<?php checked( $count ); ?> />
<label for=”<?php echo $this->get_field_id(‘count’); ?>”><?php _e( ‘Show post counts’ ); ?></label><br />

<input type=”checkbox” class=”checkbox” id=”<?php echo $this->get_field_id(‘hierarchical’); ?>” name=”<?php echo $this->get_field_name(‘hierarchical’); ?>”<?php checked( $hierarchical ); ?> />
<label for=”<?php echo $this->get_field_id(‘hierarchical’); ?>”><?php _e( ‘Show hierarchy’ ); ?></label></p>
<?php
}

}

function register_category_exclude_widget(){
register_widget(‘limited_catagories_list_widget’);
}

add_action(‘widgets_init’, ‘register_category_exclude_widget’);

?>

配置 WordPress 网络(多站点)功能 及 域名映射

自从Wordpress 3.0开始,新增了很多令人惊喜的特性,比如自定义POST类型,分类升级,自定义菜单,增加网络功能等,其中的网络功能即是传说中的多站点了,它整合了Wordpress MU的核心代码,让我们可以只用一套程序实现像WP MU一样的站群系统。

一、安装:
正常安装Wordpress,如果已经安装过,请先备份网站,然后停用所有插件。

二、激活多站点模式:
编辑文件 wp-config.php
在/* That’s all, stop editing! Happy blogging. */这一行之前加入以下代码:
/* allow multisite */
define(‘WP_ALLOW_MULTISITE’, true);

三、后台配置:
登录WP后台,进入Tools——>Network Setup选择网站地址形式,有子域名和子目录两种,
点击Install按钮后,会提示你继续修改 wp-config.php 文件,
按照提示,首先创建在 wp-content目录中创建 blogs.dir 文件夹,
然后根据说明修改 wp-config.php 和 .htaccess 文件,
最后重新登录系统,登陆地址是:
worpress_url/wp-admin/network/
到这一步,Wordpress网络功能就部署完毕了,
我们可以成功在后台新增二级域名或子目录的站点。

四、新增站点绑定顶级域名:
如果想让子站点绑定独立的顶级域名或其他域名,
需要安装域名映射插件: WordPress MU Domain Mapping
官方下载地址:
http://wordpress.org/extend/plugins/wordpress-mu-domain-mapping/
安装成功后,首先全网络激活插件Network Activate,
然后把插件目录下的 sunrise.php 文件移动到 wp-content/ 目录下,
再次编辑 wp-config.php 文件,增加代码:
define( ‘SUNRISE’, ‘on’ );
刷新一下管理后台,在Settings中新增了2个项目,
在Settings——>Domain Mapping中设置服务器IP和CNAME,
在Settings——>Domains中可以添加新的域名,
Site ID就是需要绑定域名站点在数据库中的ID值,在All Sites中可以看到。
同样的,你也可以进入子站点的控制面板中,
在Tools——>Domain Mapping里面设置需要绑定的域名。

注意事项:
1. 服务器空间需要支持.htaccess 。
2. 开启 WordPress Network 功能后,最好不要把WP放在子目录。
3. 在本机测试时,不要使用127.0.0.1,用localhost代替。

— over —

WordPress 模板机制

这是 WordPress 模板的工作原理,从 WordPress 中文 找到的,
原作是一位国外友人,Tigerkin 做了重绘,在此感谢。
图示 简洁明了,一目了然,被奉为经典,今转帖于此,便于以后查阅。
:mrgreen:
最近在用WordPress开发通用型企业站,越来越体验到WordPress的灵活易用,
比那些所谓万能的CMS强多了,我还是同意那个观点:
“‘CMS要有很多复杂的功能’是蒙人的。”
毕竟,能提高生产力的工具才是大众所需。

wp-theme

 

whichtemplate-large

WordPress模板标签手册

这是我在开发Wordpress模板过程中收集的一些常用函数模板标签。
整理出来 给需要的朋友看,也为以后自己查阅方便。
更多详细信息请参考WordPress官方文档(http://codex.wordpress.org/Template_Tags)。

常用的模板标签函数:

: 博客名称
: 博客 Url
: 博客描述
: CSS文件路径
: PingBack Url
: 模板文件路径
: WordPress版本
: Atom Url
: RSS 2.o Url
: 网页Html类型
: 网页编码
: 特定内容页(Post/Page)的标题
: 调用Header模板
: 调用Sidebar模板
: 调用Footer模板
: 显示内容(Post/Page)
: 显示时间,具体参考PHP相关函数
: 正文中的留言链接,在当前窗口打开。
: 正文中的留言链接,在新窗口中打开。
: 内容页(Post/Page)标题
: 内容页(Post/Page) Url
: 特定内容页(Post/Page)所属Category
: 作者
: 特定内容页(Post/Page) ID
: 如果用户已登录并具有权限,显示编辑链接
: 显示Blogroll中的链接
: 调用留言/回复模板
: 显示Page列表
: 显示Categories列表
: 下一篇文章链接
: 上一篇文章链接
: 日历
: 显示内容存档
: 导航,显示上一篇/下一篇文章链接
: 嵌入其他文件,可为定制的模板或其他类型文件
: 输出相应信息
: 显示注册链接
: 显示登录/注销链接
: 将当前内容分页
: 将当前内容截断,以不在主页/目录页显示全部内容
: 网页加载时间(秒)
: 网页加载查询量

传说中的主循环:

基本条件判断:

is_home() : 是否为主页
is_single() : 是否为内容页(Post)
is_page() : 是否为页面页(Page)
is_category() : 是否为分类页(Category/Archive)
is_tag() : 是否为Tag存档页
is_date() : 是否为指定日期存档页
is_year() : 是否为指定年份存档页
is_month() : 是否为指定月份存档页
is_day() : 是否为指定日存档页
is_time() : 是否为指定时间存档页
is_archive() : 是否为存档页
is_search() : 是否为搜索结果页
is_404() : 是否为 “404: Not Found” 错误页
is_paged() : Home/Category/Archive页是否以多页显示

WordPress Tags 变成数字的解决方法

最近Blog换了服务器,使用Wordpress导出WXR然后导入,
问题来了,Tags竟然都变成了数字,
在Wordpress论坛发现也有人遇到了同样问题,已经有了解决方法,
WordPress trac上面有相关说明,修正方法在这里

1. 打开/wp-admin/import/wordpress.php文件。
2. 查找搜索,将 $post_tags[] = $tag_id; 修改为 $post_tags[] = intval($tag_id);
3. 重新导入WordPress WXR。
4. OK!

把 WordPress 的首页 index.php 放在其他目录

通常情况下,Wordpress的首页文件index.php默认放在程序根目录,

这意味着如果想把 WordPress 作为网站的首页,那么站点的根目录将会非常杂乱,

按照下面的方法将 WordPress 程序文件放在一个子目录,同时使首页index.php位于站点根目录。

  1. 将 WordPress 程序文件,存放在一个子目录中,以 wp 文件夹为例。
  2. 从 wp 文件夹中复制 index.php 和 .htaccess 文件到网站根目录。
  3. 用文本编辑器打开 index.php 文件,修改 require(‘./wp-blog-header.php’); 为 require(‘./wp/wp-blog-header.php’);
  4. 登陆后台,进入”Options”面板,中文大概是 “设置” –> “常规”。
  5. 将”WordPress address (URL)” 修改为WordPress程序文件所在的文件夹。例如:http://MiMiz.cn/wp/
  6. 将 “Blog address (URL)” 修改为网站的根目录。例如:http://MiMiz.cn/
  7. 点击 “Update”更新设置。
  8. 搞定^_^