Home >php教程 >php手册 >wordpress 后台页面模板动态切换

wordpress 后台页面模板动态切换

WBOY
WBOYOriginal
2016-06-06 20:08:152074browse

简单的说明下. 在后台 新建页面 的时候, 有个页面属性 - 模板, 想必大家都知道这是什么功能. 但是页面可能是多样化..比如: 很多时候..可能不同 页面, 需要不同的定制, 所有我考虑到这个. 就想出了一个办法. 就是 当我选择 模板?的时候就让后台的 项目自动添

简单的说明下.

在后台 新建页面 的时候, 有个页面属性 -> 模板, 想必大家都知道这是什么功能.

未命名

但是页面可能是多样化..比如:

未命名

很多时候..可能不同 页面, 需要不同的定制, 所有我考虑到这个. 就想出了一个办法. 就是 当我选择 模板?的时候就让后台的 项目自动添加需要的 模块

未命名

比如我选择了一个 茶园页面模板 就刷出 一个本类介绍模块?.

未命名

好了..直接上代码吧.

首先要后台加载 javascript select事件?触发重新提交URL. 这一步要写个 js 后台的时候导入:

define('MTHEME_JS', get_template_directory_uri() . '/js' );
function admin_enqueue_scripts(){
	wp_enqueue_script( 'jquery' );
	wp_enqueue_script( 'template', MTHEME_JS . '/admin/template.js', 'jquery', COAUTHORS_PLUS_VERSION, true);
}
add_action( 'admin_enqueue_scripts', 'admin_enqueue_scripts' );

?tempate.js:

jQuery(document).ready(function($) {
	if($('#page_template').length > 0){
		var uri = new Uri(window.location.href);
		var val = uri.getQueryParamValue('temp');
		$('#page_template').on('change', function(){
			var v = $(this).val();
			if(v != 'default'){
				v = v.split('/');
				//v = encodeURIComponent(v);
				//v = URLencode(v);
				if(uri.getQueryParamValue('temp')){
					window.location.href = uri.replaceQueryParam('temp', v[0]+"_"+v[1]);
				}else{
					window.location.href = uri.addQueryParam('temp', v[0]+"_"+v[1]);
				}
			}
		});
		if(val){
			$('#page_template').val(val.replace(/_/g, '/'));
		}
	}
});

这样给 选择模板 下拉框绑定了事件, ?当你选择的时候 模板 的时候.会发现页面重定向了 多了一个参数?&temp=XXXX.php?那我们在?functions.php?里就可以写入判断了. 下面是完整的 PHP

<?php /**
 * 后台初始化编辑器默认内容布局
 * 通过 temp 变量动态修改默认编辑器布局
 * 
 */
if ($_GET ['temp'] || ($_GET ['action'] == 'edit' && $_GET ['post']) || $_POST ['post_type'] == 'page') {
	global $temp_name, $_meta_boxes;
	$_meta_boxes = array (
			// 茶事列表模板
			'page-templates/teamatter-page.php' => array(),
			// 茶人页面模板
			'page-templates/teamasters-page.php' => array(
					'method'	=> 'teamasters',
					'content'	=> '<div class="content-col-main">头部本页介绍</div>
							 <div class="content-col-main">这里可以加入幻灯片</div>
							 <div class="content-col-main">
								<h2>茶人语录</h2>
								<div class="house_list clear">
									<div class="house_list_single alignleft">
										<div class="title clear">
											<p class="alignleft">名称</p>
											<div class="alignleft">
												<h2>
													标题
												</h2>
											</div>
										</div>
										<div class="the_content clear">
											<div class="cthumbnail alignleft">
												上传图片
											</div>
											<div class="c_text alignleft">
												内容
											</div>
										</div>
									</div>
								</div>
						</div>',
					'element' => array(
						"description" => array (
								"name" => "teagarden_information",
								"std" => "这里填默认的网页描述",
								"title" => "本类介绍:"
						)
					)
				),
			// 茶园页面模板
			'page-templates/teagarden-page.php' => array(
					'method'	=> 'teagarden',
					'content'	=> '',
					'element' => array(
						"description" => array (
								'name' => "teagarden_information",
								'std' => "这里填默认的网页描述",
								'title' => "本类介绍:",
								'type'	=> 'editor'
						)
					)
				),
			// 茶礼页面模板
			'page-templates/teaceremony-page.php' => array(),
			// 茶道列表模板
			'page-templates/teataoism-page.php' => array(),
			// 茶道总览模板
			'page-templates/teataoismtotal-page.php' => array(),
			// 茶馆列表模板
			'page-templates/teahouses-page.php' => array(),
			// 茶馆总览模板
			'page-templates/teahouseoverview-page.php' => array(),
	);
	$temp_name = str_replace ( "_", "/", $_GET ['temp'] );
	// 判断是什么类型的
	function return_tepmlate($temp_name) {
		global $current_screen, $temp_name, $_meta_boxes, $temp_css;
		foreach ($_meta_boxes as $k => $_box){
			if($k == $temp_name){
				return $_box['content'];
			}
		}
	}
	function custom_editor_content($content) {
		global $current_screen, $temp_name, $temp_css;
		$content = return_tepmlate ( $temp_name );
		return $content;
	}
	function custom_editor_style() {
		global $current_screen, $temp_css;
		add_editor_style ( array (
				'editor-style.css',
				'editor-style.css' 
		) );
	}
	//返回自定义值
	function _return_defined($defined){
		global $temp_name, $_meta_boxes;
		foreach ($_meta_boxes as $k => $_box){
			if($k == $temp_name){
				return $_box[$defined];
			}
		}
	}
	add_filter ( 'default_content', 'custom_editor_content' );
	add_action ( 'admin_head', 'custom_editor_style' );
	if ($_GET ['post'] && ! $_GET ['temp']) {
		$post = get_page ( $_GET ['post'] );
		$temp_name = $post->page_template;
		$method = _return_defined('method');
		if($method){
			$method();
		}
	} elseif ($_GET ['post'] && $_GET ['action'] == 'edit') {
		$method = _return_defined('method');
		if($method){
			$method();
		}
	} elseif ($_GET ['post_type'] == 'page'){
		$method = _return_defined('method');
		if($method){
			$method();
		}
	}
	if ($_POST) {
		add_action ( 'save_post', 'save_postdata' );
	}
}
function teamasters(){
}
// 茶园
function teagarden() {
	global $temp_name, $_meta_boxes;
	if(!_return_defined('element')){
		return '';
	}
	// 在'add_meta_boxes'挂载 add_xz_box 函数
	add_action ( 'add_meta_boxes', 'add_heads_box' );
	function add_heads_box() {
		add_meta_box ( 'head_box', '本类介绍 - 文章头部内容', 'head_box', 'page', 'advanced', 'core' );
	}
	function head_box($post) { // 显示设置区域的回调函数
		global $temp_name, $_meta_boxes;
		$description = _return_defined('element');
		if($description){
			foreach ( $description as $meta_box ) {
				$meta_box_value = get_post_meta ( $post->ID, $meta_box ['name'] . '_value', true );
				if ($meta_box_value == "")
					$meta_box_value = $meta_box ['std'];
				if($meta_box ['title']){
					echo '<h4>' . $meta_box ['title'] . '</h4>';
				}
				switch ($meta_box['type']){
					case 'textarea':
						echo '<textarea cols="145" rows="6" name="'.$meta_box['name'].'_value">'.$meta_box_value.'</textarea>';
						break;
					case 'text':
						echo '<input type="text" name="' . $meta_box ['name'] . '_value" id="' . $meta_box ['name'] . '_text" value="' . $meta_box_value . '">';
						break;
					case 'editor':
						wp_editor ( str_replace ( '\"', '"', $meta_box_value ), $meta_box ['name'] . '_value', $settings = array (
						quicktags => 1,
						tinymce => 1,
						media_buttons => 0,
						textarea_rows => 4
						) );
						break;
				}
				echo '<input type="hidden" name="' . $meta_box ['name'] . '_noncename" id="' . $meta_box ['name'] . '_noncename" value="' . wp_create_nonce ( plugin_basename ( __FILE__ ) ) . '">';
				// 自定义字段标题
				//echo '<h4>' . $meta_box ['title'] . '</h4>';
				// 自定义字段输入框
				// echo '<textarea cols="145" rows="6" name="'.$meta_box['name'].'_value">'.$meta_box_value.'</textarea><br>';
			}
		}
	}
}
// 保存数据
function save_postdata($post_id) {
	global $post, $_meta_boxes, $temp_name;
	if($_meta_boxes){
		foreach ($_meta_boxes as $key => $value){
			if($key == $post->page_template){
				if($value['element']){
					foreach ( $value['element'] as $meta_box ) {
						if (! wp_verify_nonce ( $_POST [$meta_box ['name'] . '_noncename'], plugin_basename ( __FILE__ ) )) {
							return $post_id;
						}
						if ('page' == $_POST ['post_type']) {
							if (! current_user_can ( 'edit_page', $post_id ))
								return $post_id;
						} else {
							if (! current_user_can ( 'edit_post', $post_id ))
								return $post_id;
						}
						$data = $_POST [$meta_box ['name'] . '_value'];
						if (get_post_meta ( $post_id, $meta_box ['name'] . '_value' ) == "")
							add_post_meta ( $post_id, $meta_box ['name'] . '_value', $data, true );
						elseif ($data != get_post_meta ( $post_id, $meta_box ['name'] . '_value', true ))
						update_post_meta ( $post_id, $meta_box ['name'] . '_value', $data );
						elseif ($data == "")
						delete_post_meta ( $post_id, $meta_box ['name'] . '_value', get_post_meta ( $post_id, $meta_box ['name'] . '_value', true ) );
					}
				}
			}
		}
	}
}

接下来就完事了…..我只是做了一个 例子, 希望大家给点意见或者更好的办法, 也希望我的办法能解决大家和我一样的情况….

忘了说:这只支持3.5版本, 要支持 3.4 需要改这里:

//因为3.5 里面get_page 可以返回 模板的值
$temp_name = $post->page_template;
//而且 3.4 里面并没有所以要用其他函数来获取.
$temp_name = get_post_meta( $post->ID, '_wp_page_template', true );

如上一改就行了~~~~

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn