在這篇教程作者將要結束給 WordPress 分類新增欄位的教程,教程最後當然是送出類檔案,前面也放出過兩個類檔案:主題後臺、文章自定義欄位。
但是這個類檔案不一樣,該類檔案為阿樹工作室原創,所以有不完美的地方,比如沒有提供圖片上傳的,不過如果讀者需要,參考一下前面主題後臺和文章自定義欄位的兩個類檔案,完全可以自己新增進來。
版本控制:
2013.07.08,版本 1.0
1 、增加刪除分類刪除資料功能
2 、增加和更新-編輯器、圖片上傳、核取方塊等功能
類檔案程式碼-2013 年 7 月 8 日更新:
- <?php
- /*
- WordPress 分類法自定義欄位類檔案
- Version: 1.0
- Author: 樹是我的朋友
- Author URI: http://www.ashuwp.com
- License: http://www.ashuwp.com/courses/highgrade/313.html
- */
- class ashu_taxonomy_feild{
- var $options;
- var $taxonomyinfo;
- function ashu_taxonomy_feild($options,$taxonomyinfo){
- $this->options = $options;
- $this->taxonomyinfo = $taxonomyinfo;
- foreach($this->taxonomyinfo as $taxonomy){
- add_action($taxonomy.'_add_form_fields', array(&$this, 'taxonomy_fields_adds'), 10, 2);
- add_action($taxonomy.'_edit_form_fields', array(&$this, 'taxonomy_metabox_edit'), 10, 2);
- add_action('created_'.$taxonomy, array(&$this, 'save_taxonomy_metadata'), 10, 1);
- add_action('edited_'.$taxonomy,array(&$this, 'save_taxonomy_metadata'), 10, 1);
- add_action('admin_menu', array(&$this, 'init_taxonomy'));
- add_action('delete_'.$taxonomy, array(&$this,'delete_taxonomy_metadata'),10,1);
- }
- }
- function init_taxonomy(){
- if(basename( $_SERVER['PHP_SELF']) == "edit-tags.php") {
- //注意載入的指令碼的 url
- wp_enqueue_style('cate_fields_css', TEMJS_URI. 'cate_fields.css');
- wp_enqueue_script('cate_fields_js',TEMJS_URI. 'cate_fields.js');
- wp_enqueue_script('thickbox');
- wp_enqueue_style('thickbox');
- }
- }
- /*********新增分類頁面*******/
- function taxonomy_fields_adds($tag){
- foreach($this->options as $option){
- if( (!isset($option["edit_only"]) || !$option["edit_only"] ) ){
- if (method_exists($this, $option['type'])){
- echo '<div class="form-field">';
- echo '<label for="'.$option['id'].'" >'.$option['name'].'</label>';
- $this->$option['type']($option);
- echo '</div>';
- }
- }
- }
- }
- /*************編輯分類頁面*****************/
- function taxonomy_metabox_edit($tag){
- foreach($this->options as $option){
- if (method_exists($this, $option['type'])){
- if(get_term_meta($tag->term_id , $option['id']) !== ""){
- $option['std'] = get_term_meta($tag->term_id,$option['id'], true);
- }
- echo '<tr class="form-field">';
- echo '<th scope="row" valign="top">';
- echo '<label for="'.$option['id'].'" >'.$option['name'].'</label>';
- echo '</th>';
- echo '<td>';
- $this->$option['type']($option);
- echo '</td>';
- echo '</tr>';
- }
- }
- }
- /**********刪除資料******/
- function delete_taxonomy_metadata($term_id){
- foreach($this->options as $option){
- delete_term_meta($term_id,$option['id']);
- }
- }
- /**************儲存資料*****************/
- function save_taxonomy_metadata($term_id){
- foreach($this->options as $option){
- if(isset($_POST[$option['id']])){
- if(!current_user_can('manage_categories')){
- return $term_id ;
- }
- 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_term_meta($term_id , $option['id']) == "")
- add_term_meta($term_id , $option['id'], $data, true);
- elseif($data != get_term_meta($term_id , $option['id'], true))
- update_term_meta($term_id , $option['id'], $data);
- elseif($data == "")
- delete_term_meta($term_id , $option['id'], get_term_meta($term_id , $option['id'], true));
- }
- }
- }
- /******提示資訊******/
- function info($option){
- echo '<p>'.$option['desc'].'</p>';
- }
- /*******文字輸入框 text*******/
- function text($option){
- echo '<input type="text" size="'.$option['size'].'" value="';
- echo $option['std'];
- echo '" id="'.$option['id'].'" name="'.$option['id'].'"/>';
- echo '<p>'.$option['desc'].'</p>';
- }
- /******文字域***********/
- function textarea($option){
- echo '<textarea cols="40" rows="5" id="'.$option['id'].'" name="'.$option['id'].'">'.$option['std'].'</textarea>';
- echo '<p>'.$option['desc'].'</p>';
- }
- /**********單選框************/
- function radio( $option ){
- foreach( $option['buttons'] as $key=>$value ) {
- $checked ="";
- if( $option['std'] == $key) {
- $checked = 'checked = "checked"';
- }
- echo '<input '.$checked.' type="radio" class="kcheck" value="'.$key.'" name="'.$option['id'].'"/>'.$value;
- }
- }
- /**************核取方塊*******************/
- function checkbox($option) {
- foreach( $option['buttons'] as $key=>$value ) {
- $checked ="";
- if( is_array($option['std']) && in_array($key,$option['std'])) {
- $checked = 'checked = "checked"';
- }
- echo '<input '.$checked.' type="checkbox" class="kcheck" value="'.$key.'" name="'.$option['id'].'[]"/>'.$value;
- }
- }
- /***********下拉選擇***********/
- function dropdown($option){
- if($option['subtype'] == 'page') {
- $select = 'Select page';
- $entries = get_pages('title_li=&orderby=name');
- }else if($option['subtype'] == 'sidebar'){
- global $wp_registered_sidebars;
- $select = 'Select a special sidebar';
- $entries = $wp_registered_sidebars;
- }else if($option['subtype'] == 'cat'){
- $select = 'Select category';
- $entries = get_categories('title_li=&orderby=name&hide_empty=0');
- }else{
- $select = 'Select...';
- $entries = $option['subtype'];
- }
- echo '<select class="postform" id="'. $option['id'] .'" name="'. $option['id'] .'"> ';
- echo '<option value=""> 請選擇...</option> ';
- foreach ($entries as $key => $entry){
- if($option['subtype'] == 'page'){
- $id = $entry->ID;
- $title = $entry->post_title;
- }else if($option['subtype'] == 'cat'){
- $id = $entry->term_id;
- $title = $entry->name;
- }else if($option['subtype'] == 'sidebar'){
- $id = $entry['id'];
- $title = $entry['name'];
- }else{
- $id = $key;
- $title = $entry;
- }
- $selected='';
- if( $option['std'] == $id ){
- $selected = "selected='selected'";
- }
- echo"<option $selected value='". $id ."'>". $title."</option>";
- }
- echo '</select>';
- echo '<p>'.$option['desc'].'</p>';
- }
- /***************圖片上傳**********************/
- function upload($option){
- $prevImg = '';
- if($option['std'] != ''){$prevImg = '<img src='.$option['std'].' alt="" />';}
- echo '<div class="preview_pic_optionspage" id="'.$option['id'].'_div">'.$prevImg.'</div>';
- echo $option['desc'].'<br/>';
- echo '<input type="text" size="60" value="'.$option['std'].'" name="'.$option['id'].'" class="upload_pic_input" />';
- echo ' <a onclick="return false;" title="" class="cat_up button thickbox" id="'.$option['id'].'" href="media-upload.php?type=image&TB_iframe=true">Insert Image</a>';
- }
- /*******************編輯器****************************/
- function tinymce($option){
- wp_editor( $option['std'], $option['id'],$settings=array('tinymce'=>1,'media_buttons'=>0,) );
- }
- }
- ?>
下面提供類檔案下載 (共兩個檔案):WordPress 給分類新增欄位類檔案其中一個類檔案,一個 simp-term-meta.php 檔案
配置示例:
注意:
- 其中配置陣列中的 edit_only 引數如果設定為 true, 則該項將只會在分類的編輯頁面出現,主要考慮是,在分類的新增頁面,編輯器或者圖片上傳可能太大,所以一般將編輯器和圖片上傳設定為只在編輯頁面出現。
- 核取方塊儲存的資料為陣列
- $options = array();
- $taxonomyinfo = array('category');
- $options[] = array(
- "id" => "_notice",
- "desc" => '提示資訊內容',
- "type" => "info");
- $options[] = array( "name" => "分類關鍵詞",
- "desc" => "",
- "id" => "_seo_keywords",
- "std" => "",
- "edit_only"=>false,
- "size" => 40,
- "type" => "text");
- $options[] = array( "name" => "文字域測試",
- "desc" => "描述資訊",
- "id" => "_textarea",
- "std" => "",
- "edit_only"=>false,
- "size" => 40,
- "type" => "textarea");
- $options[] = array( "name" => "單選框測試",
- "desc" => "請選擇性別",
- "id" => "_radio",
- "std" => "sprother",
- "edit_only"=>false,
- "buttons" => array(
- 'man'=>'男性',
- 'woman'=>'女性',
- 'sprother'=>'中性'
- ),
- "type" => "radio");
- $options[] = array( "name" => "核取方塊--你喜歡哪幾個",
- "id" => "_checkbox",
- "std" => "",
- "buttons" => array(
- 'chun'=>'春哥',
- 'zeng'=>'曾哥',
- 'zhu'=>'著姐',
- 'feng'=>'玉鳳',
- 'fu'=>'芙蓉'
- ),
- "edit_only"=>false,
- "type" => "checkbox");
- $options[] = array( "name" => "下拉框框測試-頁面",
- "desc" => "描述資訊",
- "id" => "_drop_page",
- "std" => "",
- "edit_only"=>false,
- "subtype" => 'page',
- "type" => "dropdown");
- $options[] = array( "name" => "下拉框框測試-分類",
- "desc" => "描述資訊",
- "id" => "_drop_cat",
- "std" => "",
- "edit_only"=>false,
- "subtype" => 'cat',
- "type" => "dropdown");
- $options[] = array( "name" => "下拉框框測試-側邊欄",
- "desc" => "描述資訊",
- "id" => "_drop_sidebar",
- "std" => "",
- "edit_only"=>false,
- "subtype" => 'sidebar',
- "type" => "dropdown");
- $options[] = array( "name" => "下拉框框測試-自定義",
- "desc" => "描述資訊",
- "id" => "_drop_custom",
- "std" => "",
- "edit_only"=>false,
- "subtype" => array(
- 'apple'=>'蘋果',
- 'banana'=>'香蕉',
- 'orange'=>'桔子',
- ),
- "type" => "dropdown");
- $options[] = array(
- "name" => "上傳圖片測試",
- "desc" => "",
- "id" => "_upload",
- "std" => "",
- "edit_only"=>true,
- "type" => "upload"
- );
- $options[] = array(
- "name" => "tinymce 編輯器測試",
- "desc" => "",
- "id" => "_tinymce",
- "std" => "",
- "edit_only"=>true,
- "type" => "tinymce"
- );
- $new_taxonomy_feild = new ashu_taxonomy_feild($options, $taxonomyinfo);
使用方法:
1 、解壓之後得到兩個檔案,在主題中包含這兩個檔案,分別是檔案和 simple-term-meta.php 檔案。
2 、在你的主題中包含這兩個檔案這兩個檔案 (如阿樹將檔案放在主題的 include 資料夾中,則使用如下程式碼):
- include_once(get_template_directory() .'/include/class-taxonomy-feild.php');
- include_once(get_template_directory() .'/include/simple-term-meta.php');
2 、類檔案 class-taxonomy-feild.php 的後面帶有類檔案的例項化配置方法,按照需求更改即可。
3 、獲取資料,使用 get_term_meta 函式,跟 get_post_meta 函式類似。以上面示例中,分類關鍵詞的獲取為例:
- $_seo_keywords = get_term_meta( $cat->term_id, '_seo_keywords',true );
FAQ:
1 、能正確顯示錶單,但是無法儲存資料?
本站提供的 simple-term-meta.php 檔案在安裝啟用主題的時候,會在資料庫中新增一個_termmeta 表用來儲存資料,如果無法儲存資料,八成是未新建該資料表,請重新啟用主題。
2 、下載的壓縮包是空的?
請換瀏覽器、換電腦。
3 、如何使用該類檔案給自定義分類法新增欄位?
在配置程式碼中 $taxonomyinfo 陣列,加入你自己的自定義分類法。