通常在wordpress下发表(或编辑)page 时有一个可以选择 templage 的功能,通过选择不同的 template 我们可以为每个page指定不同的模板,这样以来各个page就不会显得过于呆板,这个功能如此方便好用,只可惜的是在发表(或编辑)post 的时候默认却是没有这个功能的,虽然wp默认没有这个功能,但并不代表我们就不能使用类似page 的template选择功能,通过plugin扩展的方式,我们还是可以很方便的在post下模拟出类似page的模板选择功能。以下是代码:
<?php
/**
Plugin Name: Single template plugin
Plugin URI: http://www.ifcode.com/
Description: Post 模板选择插件
Version: 1.0
Author: Zhang Zhao
Author URI: http://www.ifcode.com/
*/
function get_single_templates() {
$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];
$page_templates = array ();
if ( is_array( $templates ) ) {
foreach ( $templates as $template ) {
$template_data = implode( '', file(WP_CONTENT_DIR.$template ));
$name = '';
if ( preg_match( '|Post Name:(.*)$|mi', $template_data, $name ) )
$name = _cleanup_header_comment($name[1]);
if ( !empty( $name ) ) {
$page_templates[trim( $name )] = basename( $template );
}
}
}
return $page_templates;
}
function single_template_dropdown( $default = '' ) {
$templates = get_single_templates();
ksort( $templates );
foreach (array_keys( $templates ) as $template )
: if ( $default == $templates[$template] )
$selected = " selected='selected'";
else
$selected = '';
echo "/n/t<option value='".$templates[$template]."' $selected>$template</option>";
endforeach;
}
function single_templates($post){
$post->single_template = get_post_meta( $post->ID, '_single_template', true );
if ( 0 != count( get_single_templates() ) ) { ?>
<label for="page_template"><?php _e('Post Template') ?></label>
<select name="single_template" id="single_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php single_template_dropdown($post->single_template); ?>
</select>
<?php
}
}
function add_single_meta_box()
{
if(!function_exists('add_meta_box'))
return false;
add_meta_box('singletemplate', __('Template'), 'single_templates', 'post', 'side', 'core');
}
function save_post_templatedata($postID)
{
if(isset($_POST['single_template']))
if ( !update_post_meta($postID, '_single_template', $_POST['single_template']) )
add_post_meta($postID, '_single_template', $_POST['single_template']);
}
function select_single_template()
{
global $post;
$template = get_post_meta($post->ID, '_single_template', true);
if($template && 'default' != $template) {
$style = substr($template, 0, -4);
$style .= '.css';
if(file_exists(TEMPLATEPATH .'/styles/' . $style)) {
add_action('wp_head', 'single_template_style');
}
return TEMPLATEPATH .'/'. $template;
}
if(file_exists(TEMPLATEPATH .'/single.php')) {
return TEMPLATEPATH .'/single.php';
}
}
function single_template_style()
{
global $post;
$template = get_post_meta($post->ID, '_single_template', true);
$style = substr($template, 0, -4);
$style .= '.css';
echo '<link rel="stylesheet" type="text/css" href="' .get_bloginfo('template_directory'). '/styles/' .$style. '" media="screen" />';
}
add_action('admin_menu', 'add_single_meta_box');
add_action('save_post', 'save_post_templatedata');
add_filter("single_template", 'select_single_template');
?>
使用方法:
使用方法:
1、将插件复制到 wp-content/plugins/ 目录下
2、激活插件
3、在当前使用的 theme 目录下重新建立自己 post template.
比如:在default theme下建立一个新的php 文件,名为:single-test.php,文件内容大致如下:
<?php
/**
* Post Name: Single test
*/
get_header();
?>
<div id="content" role="main">
Single template plugin
</div>
<?php get_footer(); ?>
所有的文件必须要以
/**
* Post Name: Single test
*/
开头,插件是以 Post Name: 来对模板进行识别的,后面的插件名字可以自己随便起。
可以在当前使用的 theme 目录下定义针对模板的css文件,css文件存放在css/目录下,文件名同 post template 模板文件名相同即可(程序会自动访问并加载同名的css文件)。
例如为上面single-test.php定义一个css文件 css/single-test.css
插件下载点这里
文章来源:http://www.ifcode.net/?p=212