網站服務項目
當前位置: 首頁 > 建站知識 > wordpress自定義字段(7):創建自定義面版類文件

wordpress自定義字段(7):創建自定義面版類文件

發布于:建站知識來源:郴州網站建設作者:www.5156123.live 點擊: 896 次
  

通過前面幾章有關wordpress自定義字段的介紹,我們了解了如何在wordpress主題中添加wordpress自定義字段面版,wordpress自定義面版包括:文本框、文本域、下拉框、單選框、復選框、編輯器、圖片上傳等一系列表單項,這樣大大豐富了wordpress主題功能的。但是,這樣有時在制作wordpress主題中,總是這樣一點點地添加代碼,有點麻煩,為了讓這些wordpress自定義面版的功能能在以后的wordpress主題制作中方便地利用,我們可以把這些wordpress自定義字段代碼封到一個類中,這樣,想什么時候用就可以輕松地拿出來。下面,就一起來看看怎樣創建wordpress自定義字段面版類文件及怎樣使用。

1、在主題文件夾下創建一個metabox.class.php類文件,然后通過dreamweaver打開這個metabox.class.php文件,將下面這段代碼放進去:

<?php
//文章自定義字段類文倒插門
class ashu_meta_box{
var $options;
var $boxinfo;

//構造函數
function ashu_meta_box($options,$boxinfo){
$this->options = $options;
$this->boxinfo = $boxinfo;

add_action(‘admin_menu’, array(&$this, ‘init_boxes’));
add_action(‘save_post’, array(&$this, ‘save_postdata’));
}

//初始化
function init_boxes(){
$this->add_script_and_styles();
$this->create_meta_box();
}

//加載css和js腳本
function add_script_and_styles(){
if(basename( $_SERVER[‘PHP_SELF’]) == “page.php”
|| basename( $_SERVER[‘PHP_SELF’]) == “page-new.php”
|| basename( $_SERVER[‘PHP_SELF’]) == “post-new.php”
|| basename( $_SERVER[‘PHP_SELF’]) == “post.php”
|| basename( $_SERVER[‘PHP_SELF’]) == “media-upload.php”)
{
//注意加載的腳本的url
wp_enqueue_style(‘metabox_fields_css’, TEMJS_URI. ‘metabox_fields.css’);
wp_enqueue_script(‘metabox_fields_js’,TEMJS_URI. ‘metabox_fields.js’);
wp_enqueue_style(‘thickbox’);
wp_enqueue_script(‘media-upload’);
wp_enqueue_script(‘thickbox’);

if(isset($_GET[‘hijack_target’]))
{
add_action(‘admin_head’, array(&$this,’add_hijack_var’));
}
}
}

/*************************/
function add_hijack_var()
{
echo “<meta name=’hijack_target’ content='”.$_GET[‘hijack_target’].”‘ />\n”;
}

//創建自定義面板
function create_meta_box(){
if ( function_exists(‘add_meta_box’) && is_array($this->boxinfo[‘page’]) )
{
foreach ($this->boxinfo[‘page’] as $area)
{
if ($this->boxinfo[‘callback’] == ”) $this->boxinfo[‘callback’] = ‘new_meta_boxes';

add_meta_box(
$this->boxinfo[‘id’],
$this->boxinfo[‘title’],
array(&$this, $this->boxinfo[‘callback’]),
$area, $this->boxinfo[‘context’],
$this->boxinfo[‘priority’]
);
}
}
}

//創建自定義面板的顯示函數
function new_meta_boxes(){
global $post;
//根據類型調用顯示函數
foreach ($this->options as $option)
{
if (method_exists($this, $option[‘type’]))
{
$meta_box_value = get_post_meta($post->ID, $option[‘id’], true);
if($meta_box_value != “”) $option[‘std’] = $meta_box_value;

echo ‘<div class=”alt kriesi_meta_box_alt meta_box_’.$option[‘type’].’ meta_box_’.$this->boxinfo[‘context’].'”>';
$this->$option[‘type’]($option);
echo ‘</div>';
}
}

//隱藏域
echo'<input type=”hidden” name=”‘.$this->boxinfo[‘id’].’_noncename” id=”‘.$this->boxinfo[‘id’].’_noncename” value=”‘.wp_create_nonce( ‘ashumetabox’ ).'” />';
}

//保存字段數據
function save_postdata() {
if( isset( $_POST[‘post_type’] ) && in_array($_POST[‘post_type’],$this->boxinfo[‘page’] ) && (isset($_POST[‘save’]) || isset($_POST[‘publish’]) ) ){
$post_id = $_POST[‘post_ID’];

foreach ($this->options as $option) {
if (!wp_verify_nonce($_POST[$this->boxinfo[‘id’].’_noncename’], ‘ashumetabox’)) {
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 ;
}
//將預定義字符轉換為html實體
if( $option[‘type’] == ‘tinymce’ ){
$data = stripslashes($_POST[$option[‘id’]]);
}elseif( $option[‘type’] == ‘checkbox’ ){
$data = $_POST[$option[‘id’]];
}else{
$data = htmlspecialchars($_POST[$option[‘id’]], ENT_QUOTES,”UTF-8″);
}

if(get_post_meta($post_id , $option[‘id’]) == “”)
add_post_meta($post_id , $option[‘id’], $data, true);

elseif($data != get_post_meta($post_id , $option[‘id’], true))
update_post_meta($post_id , $option[‘id’], $data);

elseif($data == “”)
delete_post_meta($post_id , $option[‘id’], get_post_meta($post_id , $option[‘id’], true));

}
}
}
//顯示標題
function title($values){
echo ‘<p>’.$values[‘name’].'</p>';
}
//文本框
function text($values){
if(isset($this->database_options[$values[‘id’]])) $values[‘std’] = $this->database_options[$values[‘id’]];

echo ‘<p>’.$values[‘name’].'</p>';
echo ‘<p><input type=”text” size=”‘.$values[‘size’].'” value=”‘.$values[‘std’].'” id=”‘.$values[‘id’].'” name=”‘.$values[‘id’].'”/>';
echo $values[‘desc’].'<br/></p>';
echo ‘<br/>';
}
//文本域
function textarea($values){
if(isset($this->database_options[$values[‘id’]])) $values[‘std’] = $this->database_options[$values[‘id’]];

echo ‘<p>’.$values[‘name’].'</p>';
echo ‘<p><textarea class=”kriesi_textarea” cols=”60″ rows=”5″ id=”‘.$values[‘id’].'” name=”‘.$values[‘id’].'”>’.$values[‘std’].'</textarea>';
echo $values[‘desc’].'<br/></p>';
echo ‘<br/>';
}
//媒體上傳
function media($values){
if(isset($this->database_options[$values[‘id’]])) $values[‘std’] = $this->database_options[$values[‘id’]];

//圖片上傳按鈕
global $post_ID, $temp_ID;
$uploading_iframe_ID = (int) (0 == $post_ID ? $temp_ID : $post_ID);
$media_upload_iframe_src = “media-upload.php?post_id=$uploading_iframe_ID”;
$image_upload_iframe_src = apply_filters(‘image_upload_iframe_src’, “$media_upload_iframe_src&amp;type=image”);

$button = ‘<a href=”‘.$image_upload_iframe_src.’&amp;hijack_target=’.$values[‘id’].’&amp;TB_iframe=true” id=”‘.$values[‘id’].'” class=”k_hijack button thickbox” onclick=”return false;” >上傳</a>';

//判斷圖片格式,圖片預覽
$image = ”;
if($values[‘std’] != ”) {
$fileextension = substr($values[‘std’], strrpos($values[‘std’], ‘.’) + 1);
$extensions = array(‘png’,’gif’,’jpeg’,’jpg’,’pdf’,’tif’);

if(in_array($fileextension, $extensions))
{
$image = ‘<img src=”‘.$values[‘std’].'” />';
}
}

echo ‘<div id=”‘.$values[‘id’].’_div” class=”kriesi_preview_pic”>’.$image .'</div>';
echo ‘<p>’.$values[‘name’].'</p><p>';
if($values[‘desc’] != “”) echo ‘<p>’.$values[‘desc’].'<br/>';
echo ‘<input class=”kriesi_preview_pic_input” type=”text” size=”‘.$values[‘size’].'” value=”‘.$values[‘std’].'” name=”‘.$values[‘id’].'”/>’.$button;
echo ‘</p>';
echo ‘<br/>';
}
//單選框
function radio( $values ){
if(isset($this->database_options[$values[‘id’]]))
$values[‘std’] = $this->database_options[$values[‘id’]];
echo ‘<p>’.$values[‘name’].'</p>';
foreach( $values[‘buttons’] as $key=>$value ) {
$checked =””;
if($values[‘std’] == $key) {
$checked = ‘checked = “checked”‘;
}
echo ‘<input ‘.$checked.’ type=”radio” class=”kcheck” value=”‘.$key.'” name=”‘.$values[‘id’].'”/>’.$value;
}
}
//復選框
function checkbox($values){
echo ‘<p>’.$values[‘name’].'</p>';
foreach( $values[‘buttons’] as $key=>$value ) {
$checked =””;
if( is_array($values[‘std’]) && in_array($key,$values[‘std’])) {
$checked = ‘checked = “checked”‘;
}
echo ‘<input ‘.$checked.’ type=”checkbox” class=”kcheck” value=”‘.$key.'” name=”‘.$values[‘id’].'[]”/>’.$value;
}
echo ‘<label for=”‘.$values[‘id’].'”>’.$values[‘desc’].'</label><br/></p>';
}
//下拉框
function dropdown($values){
echo ‘<p>’.$values[‘name’].'</p>';
//選擇內容可以使頁面、分類、菜單、側邊欄和自定義內容
if($values[‘subtype’] == ‘page’){
$select = ‘Select page';
$entries = get_pages(‘title_li=&orderby=name’);
}else if($values[‘subtype’] == ‘cat’){
$select = ‘Select category';
$entries = get_categories(‘title_li=&orderby=name&hide_empty=0′);
}else if($values[‘subtype’] == ‘menu’){
$select = ‘Select Menu in page left';
$entries = get_terms( ‘nav_menu’, array( ‘hide_empty’ => false ) );
}else if($values[‘subtype’] == ‘sidebar’){
global $wp_registered_sidebars;
$select = ‘Select a special sidebar';
$entries = $wp_registered_sidebars;
}else{
$select = ‘Select…';
$entries = $values[‘subtype’];
}

echo ‘<p><select class=”postform” id=”‘. $values[‘id’] .'” name=”‘. $values[‘id’] .'”> ‘;
echo ‘<option value=””>’.$select .'</option> ‘;

foreach ($entries as $key => $entry){
if($values[‘subtype’] == ‘page’){
$id = $entry->ID;
$title = $entry->post_title;
}else if($values[‘subtype’] == ‘cat’){
$id = $entry->term_id;
$title = $entry->name;
}else if($values[‘subtype’] == ‘menu’){
$id = $entry->term_id;
$title = $entry->name;
}else if($values[‘subtype’] == ‘sidebar’){
$id = $entry[‘id’];
$title = $entry[‘name’];
}else{
$id = $entry;
$title = $key;
}

if ($values[‘std’] == $id ){
$selected = “selected=’selected'”;
}else{
$selected = “”;
}

echo”<option $selected value='”. $id.”‘>”. $title.”</option>”;
}

echo ‘</select>';
echo $values[‘desc’].'<br/></p>';
echo ‘<br/>';
}

//編輯器
function tinymce($values){
if(isset($this->database_options[$values[‘id’]]))
$values[‘std’] = $this->database_options[$values[‘id’]];

echo ‘<p>’.$values[‘name’].'</p>';
wp_editor( $values[‘std’], $values[‘id’] );
//wp_editor( $values[‘std’], ‘content’, array(‘dfw’ => true, ‘tabfocus_elements’ => ‘sample-permalink,post-preview’, ‘editor_height’ => 360) );
//帶配置參數
/*wp_editor($meta_box[‘std’],$meta_box[‘name’].’_value’, $settings = array(quicktags=>0,//取消html模式
tinymce=>1,//可視化模式
media_buttons=>0,//取消媒體上傳
textarea_rows=>5,//行數設為5
editor_class=>”textareastyle”) ); */
}

}

上面這段代碼就是我們前面所介紹過的wordpress自定義字段面版的類,這個類文件包含了我們前介紹過的所有表單項。

2、主題文件夾下創建調用這個類的文件metabox.php,通過dreamweaver打開這個文件,在這個metabox.php文件中添加以下代碼:

<?php
//自定義面板類的實例
$options = array();

$boxinfo = array(‘title’ => ‘meta box’, ‘id’=>’ashubox’, ‘page’=>array(‘page’,’post’), ‘context’=>’normal’, ‘priority’=>’low’, ‘callback’=>”);

$options[] = array( “name” => “標題”,
“type” => “title”);

$options[] = array(
“name” => “文本框”,
“desc” => “”,
“id” => “ashu_text”,
“size”=>”40″,
“std” => “”,
“type” => “text”
);

$options[] = array(
“name” => “文本域”,
“desc” => “”,
“id” => “ashu_textarea”,
“std” => “”,
“type” => “textarea”
);

$options[] = array(
“name” => “圖片上傳”,
“desc” => “”,
“id” => “ashu_upimg”,
“std” => “”,
“button_label”=>’上傳圖片’,
“type” => “media”
);

$options[] = array(
“name” => “單選框”,
“desc” => “”,
“id” => “ashu_radio”,
“std” => 1,
“buttons” => array(‘Yes’,’No’),
“type” => “radio”
);

$options[] = array(
“name” => “復選框”,
“desc” => “喜歡吃啥?”,
“id” => “ashu_checkbox”,
“buttons” => array(‘蘋果’,’香蕉’,’西瓜’,’芒果’),
“type” => “checkbox”
);

$options[] = array(
“name” => “下拉選擇”,
“desc” => “”,
“id” => “ashu_dropdown”,
“subtype”=> array(
‘1’=>’1′,
‘2’=>’2′,
‘3’=>’3′
),
“type” => “dropdown”
);

$options[] = array(
“name” => “選擇分類”,
“desc” => “”,
“id” => “ashu_cat”,
“subtype”=> “cat”,
“type” => “dropdown”
);

$options[] = array(
“name” => “選擇頁面”,
“desc” => “”,
“id” => “ashu_page”,
“subtype”=> “page”,
“type” => “dropdown”
);

$options[] = array(
“name” => “選擇菜單”,
“desc” => “”,
“id” => “ashu_menu”,
“subtype”=> “menu”,
“type” => “dropdown”
);

$options[] = array(
“name” => “選擇側邊欄”,
“desc” => “”,
“id” => “ashu_sidebar”,
“subtype”=> “sidebar”,
“type” => “dropdown”
);

$options[] = array(
“name” => “編輯器”,
“desc” => “”,
“id” => “ashu_tinymce”,
“std” => “”,
“type” => “tinymce”
);

$new_box = new ashu_meta_box($options, $boxinfo);

通過上面這段代碼,我們就實例化了這個wordpress自定義面版類了。這樣,就可以在后臺的發表文章頁面顯示wordpress自定義面版。如果想讓圖片上傳功能可用,我們還要引用前面我們介紹過的JS文件,將這個JS文件重新命名為metabox_fields.js,這是為了跟上面的類里的引用的JS文件名一至。如果不想顯示圖片上傳功能,可以直接刪除metabox.php文件中的圖片上傳代碼就行了。

使用類的方便之處就在于此了,類里面已經包含了所有我們想要的功能,在實際使用中,我們想使用哪個就調用哪個,就是在metabox.php文件中添加調用的代碼,不想使用的功能,就可以不添加,如上面我們說的圖片上傳,我們不想使用,就可以不添加,這樣就大大地降低了我們寫代碼的工作。

3、在主題的functions.php文件中添加如相代碼來引用metabox.class.php和metabox.php這2個文件:

include_once(‘metabox.class.php’);
include_once(‘metabox.php’);

好了,有關如何創建wordpress自定義字段面版的類文件以及調用就介紹到這里。后續,我們將推了更精彩的內容。

 
------分隔線----------------------------
------分隔線----------------------------
金信达配资