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 ' <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数组,加入你自己的自定义分类法。
阿树,系统提示 : Methods with the same name as their class will not be constructors in a future version of PHP; ashu_taxonomy_feild has a deprecated constructor in class ashu_taxonomy_feild
这个如何解决呢?
类的构建函数改成__construct.
无法下载,验证码无法图片没有出现
下载AshwpFramework框架是一样的。
AshwpFramework框架,在php6上出现:Parse error: syntax error, unexpected,的错误,比较蛋疼,非常感谢了
还请提供一下详细报错代码。
下载了整个框架来使用了,有个问题不知道是不是bug,或者还是我配置不对?
在分类页面配置了之后,第一次保存数据可以,但是如果在删除数据之后再添加就保存不下来了。我测试了主题选项和文章的自定义字段都没问题,就是这个分类的有点问题
不知道这个分类的文件ashuwp_termmeta_feild.php有没有问题?
树哥能解答下吗?
经过检查确实存在这个问题,请下载最新的4.3版本。
get_term_meta怎么传递多个参数,能不能举个示例?
get_term_meta一次只能获取一个,如果有多个字段,可以重复使用。
阿树,导出XML数据后,再导入到新的网站,但是数据后台都能显示。为什么前台无法显示?要点入编辑后再更新,前台才可以显示呢?
4.4以后好像不兼容了
4.4版本将分类字段的函数弄到源码里面去了,所以会重复定义函数。解决办法就是:不要加载simple-term-meta.php文件
文件过期 好像是不存在
请直接下载本章框架。。。
下载不了
我测试这句代码
这句代码只是一个示例,get_term_meta函数的第一个参数是分类ID即可
我也是把$cat->term_id改为$cat才能获取
就是我有一个问题就是那个option.php 主题设置的功能,每次在本地设置好,上传到服务器,就没有了,成空的了,没有保存到数据库,这个问题怎么解决下啊?还是在您的新发布的里面的类文件,已经把这个问题解决了?求帮助。
好像不能下载,用多个浏览器试过了!
阿树,你好,你发的文件http://file.ashuwp.com/file.php?f=class-taxonomy-feild.zip,我下载不了,提示压缩包有问题,能否发一份到我的邮箱里呢,谢谢!我的邮箱是:
jht2718@163.com
前面提的编辑器的问题是上面的有判断,现以解决了,不过分类添加出现编辑器后,却保存不了编辑器中数据,只能在修改时保存
“edit_only”=>false,已经设置成了false,添加时也不会出现编辑器
楼主,这里有个大的错误地方,数据无法删除。
你新建一个分类,会在数据库中wp_terms表中插入一条数据
同时你的扩张内容会在表wp_termmeta中插入相关扩展数据。
当你删除这个分类的时候,wp_termmeta表中的数据不会被删除,导致商家导航出错,麻烦看看啊
不起作用
多谢提醒,类文件已经更新。。
不过如果你需要更新smzdm主题请添加本页面类文件代码中23行
以及delete_taxonomy_metadata函数
请勿直接使用新类文件。。。
楼主你的checkbox当一个都不选择的时候没有其效果的,
elseif($data == “”)
delete_term_meta($term_id , $option[‘id’], get_term_meta($term_id , $option[‘id’], true));
是没有起作用的,请问怎么修改,似乎都不属于列举的情况
楼主你的文件怎么没有看到,下载的地方啊,网页上的不能删除啊
为啥后台无法保存?
请重新激活主题
解决了 不过我想给自定义字段单独一个页面,就是点击这个自定义字段链接到一个包含这个自定义字段下的所有分类内容。如何实现这个功能?
话说我给post_tag里添加了一个描述前台死活调用不出来,也没报错什么的。
额。。如果后台写了刷新能保存,那前台就应该无问题…
后台能保存但是前台一直调不出来。。。。我怀疑是我哪里弄错了。
下载过来的是空压缩包 应该说你站点提供的下载都是空压缩包 能不能麻烦发下 我邮箱
你说的情况不存在…
下载下来都是546B的大小 里面空 我郁闷啊 难道就我这样
换台电脑、换个浏览器。。试试
阿树,如果还想将自定义字段扩展应用到post_tag和其他自定义taxonomy(比如videoscategory)该怎样处理呢?$taxonomyinfo = array(‘category’);定义数组未见起作用,还有,保存数据的时候权限的判断改写什么?manage_categories?
来求教了……
额。。就是在这个$taxonomyinfo这个数组里面。。。
怎么邮件给的链接点击后返回404?!
你总算回复了亲,表示感谢,不过问题确是出在数组上,我定义数组的习惯不好,没有按照$key=>$value格式映射。
现在已经解决了,今天约一半的时间都花在你这个系列的文章上了。现在取经成功了,谢谢佛祖
嘿嘿。。。为了春哥我去看《血滴子》去了。。
我这个“问题”有什么问题吗?我没表达清楚么?好在贴吧里截了图片,两地在线等,等待中……Q也开了,三地等
又来麻烦你了、我实在是有点弄糊涂了、自定义面板和自定义分类法怎么可以在首页、栏目、内容页里面调用、我看完了你的教程、到现在就只会用设置选
项字段的调用、麻烦啊树哥给个前台调用的例子啊!分类法的字段可以在分类页面调用吗?
e…文章最后面不是给了例子吗。。。
请问在header.php.怎么调不出来?
字段的调用文章里面已经写了,你先检查一下后台能不能保存修改吧
感谢,已经调试出来!
有个新的问题,我想在后台管理页面调出所有分类ID,该怎么实现呢?
用get_categories之类的函数获取所有分类,然后输出分类ID,你可以看看我的后台设置类文件中,有相关代码
为什么下载下来是空的呢??能不能发一个class-taxonomy-feild.zip给我呢??谢谢
怎么会哦。。。。我又试了一次。。好好的。。
这个类你可以正常使用??? 我看到有个地方错了
我使用的就是这个,当然能正常使用,不过放上来难免可能出错,哪里错了还请指出来啊。。
这个类是有个地方错了、还请啊树帮忙看看怎么修复!
错误在编辑分类页面里面! 错误信息 Fatal error: Call to undefined function get_term_meta() in
这个是有个未定义的函数?
这个函数get_term_meta是在,那个simple-term-meta.php文件里面。。所以看看你是否忘了include那个文件。。