WordPress进阶教程(十四):给分类添加字段类文件

敬告:本类文件发表于2013年,可能已经过时,请参考或直接使用Ashuwp_framework框架。

在这篇教程作者将要结束给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 __construct($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 ‘&nbsp;<a onclick=“return false;” title=“” class=“cat_up button thickbox” id=“‘.$option[‘id’].’” href=“media-upload.php?type=image&amp;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文件

配置示例:

注意:

  1. 其中配置数组中的edit_only参数如果设置为true,则该项将只会在分类的编辑页面出现,主要考虑是,在分类的添加页面,编辑器或者图片上传可能太大,所以一般将编辑器和图片上传设置为只在编辑页面出现。
  2. 复选框保存的数据为数组

$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数组,加入你自己的自定义分类法。

© 版权声明
THE END
点赞15赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容