wordpress为分类添加自定义字段

我们能为我们的wordpress文章类型添加自定义字段,用来储存文章的一些信息,同样分类也是能添加自定义字段来储存一些分类信息的,而且这和文章添加自定义字段的方法高度相似。其实WordPress几乎为所有内容提供了元字段支持,比如:文章类型、用户、评论、分类等,用法也都相似。这里的分类,其实准确来说,应该是分类法。

比如我用的主题,就对其自定义的分类法添加了自定义字段:

图片[1]-wordpress为分类添加自定义字段
圈起来这些,都是自定义字段

将自定义字段表单添加到“添加新分类”页面

用到的钩子{Taxonomy}_add_form_fields,比如下方的代码就是在添加新的文章标签时添加一个字段表单。

add_action( 'post_tag_add_form_fields', 'kekc_cn_add_term_fields' );

function kekc_cn_add_term_fields( $taxonomy ) {

	echo '<div class="form-field">
	<label for="misha-text">Text Field</label>
	<input type="text" name="kekc_cn-text" id="kekc_cn-text" />
	<p>From www.kekc.cn</p>
	</div>';

}

将自定义字段表单添加到“编辑分类”页面

用到的钩子{Taxonomy}_edit_form_fields,我们这里继续和上面的一样,用文章标签(post_tag)来做示例,我们的钩子就是post_tag_edit_form_fields。

add_action( 'post_tag_edit_form_fields', 'kekc_cn_edit_term_fields', 10, 2 );

function kekc_cn_edit_term_fields( $term, $taxonomy ) {

	$value = get_term_meta( $term->term_id, 'kekc_cn-text', true );
	
	echo '<tr class="form-field">
	<th>
		<label for="misha-text">Text Field</label>
	</th>
	<td>
		<input name="kekc_cn-text" id="kekc_cn-text" type="text" value="' . esc_attr( $value ) .'" />
		<p class="description">From www.kekc.cn</p>
	</td>
	</tr>';

}

上面的代码其实和添加时高度相似,只是多了有字段值的话默认展示到input输入框中,在实际使用中可以用kekc_cn_edit_term_fields替代kekc_cn_add_term_fields。这样,两个函数就变成一个了。

保存字段操作

上面的两个代码,均是将表单展示在相应的地方,虽然也能进行提交form表单的操作,但是并没有对数据进行处理,wordpress对于不进行处理的数据都是将他们丢弃。这里我们就需要添加一个保存字段的操作,将数据保存到我们的数据库中。注意新建和编辑都会发送请求,我们就需要两个钩子进行处理,但是都是保存,就合并到一个函数处理(就像我之前说添加和保存表单的展示只需要kekc_cn_edit_term_fields一个函数处理就行一样),你们也可以分开。

add_action( 'created_post_tag', 'kekc_cn_save_term_fields' );
add_action( 'edited_post_tag', 'kekc_cn_save_term_fields' );

function kekc_cn_save_term_fields( $term_id ) {

	update_term_meta(
		$term_id,
		'kekc_cn-text',
		sanitize_text_field( $_POST[ 'kekc_cn-text' ] )
	);

}

OK,按照上面的操作,相信你已经学会了分类中添加自定义字段了。

别人写的例子

所有自定义字段保存在WordPress的_options表中,无需建新的表。

1、添加代码:

<?php  
  
class Ludou_Tax_Image{  
   
    function __construct(){  
          
        // 新建分类页面添加自定义字段输入框  
        add_action( 'category_add_form_fields', array( $this, 'add_tax_image_field' ) );  
        // 编辑分类页面添加自定义字段输入框  
        add_action( 'category_edit_form_fields', array( $this, 'edit_tax_image_field' ) );  
  
        // 保存自定义字段数据  
        add_action( 'edited_category', array( $this, 'save_tax_meta' ), 10, 2 );  
        add_action( 'create_category', array( $this, 'save_tax_meta' ), 10, 2 );  
   
   
    } // __construct  
   
    /** 
     * 新建分类页面添加自定义字段输入框 
     */  
    public function add_tax_image_field(){  
    ?>  
        <div class="form-field">  
            <label for="term_meta[tax_image]">分类封面</label>  
            <input type="text" name="term_meta[tax_image]" id="term_meta[tax_image]" value="" />  
            <p class="description">输入分类封面图片URL</p>  
        </div><!-- /.form-field -->  
          
        <!-- TODO: 在这里追加其他自定义字段表单,如: -->  
          
        <!--  
        <div class="form-field">  
            <label for="term_meta[tax_keywords]">分类关键字</label>  
            <input type="text" name="term_meta[tax_keywords]" id="term_meta[tax_keywords]" value="" />  
            <p class="description">输入分类关键字</p>  
        </div>  
        -->  
    <?php  
    } // add_tax_image_field  
   
    /** 
     * 编辑分类页面添加自定义字段输入框 
     * 
     * @uses get_option()       从option表中获取option数据 
     * @uses esc_url()          确保字符串是url 
     */  
    public function edit_tax_image_field( $term ){  
          
        // $term_id 是当前分类的id  
        $term_id = $term->term_id;  
          
        // 获取已保存的option  
        $term_meta = get_option( "ludou_taxonomy_$term_id" );  
        // option是一个二维数组  
        $image = $term_meta['tax_image'] ? $term_meta['tax_image'] : '';  
          
        /** 
         *   TODO: 在这里追加获取其他自定义字段值,如: 
         *   $keywords = $term_meta['tax_keywords'] ? $term_meta['tax_keywords'] : ''; 
         */  
    ?>  
        <tr class="form-field">  
            <th scope="row">  
                <label for="term_meta[tax_image]">分类封面</label>  
                <td>  
                    <input type="text" name="term_meta[tax_image]" id="term_meta[tax_image]" value="<?php echo esc_url( $image ); ?>" />  
                    <p class="description">输入分类封面图片URL</p>  
                </td>  
            </th>  
        </tr><!-- /.form-field -->  
          
        <!-- TODO: 在这里追加其他自定义字段表单,如: -->  
          
        <!--  
        <tr class="form-field">  
            <th scope="row">  
                <label for="term_meta[tax_keywords]">分类关键字</label>  
                <td>  
                    <input type="text" name="term_meta[tax_keywords]" id="term_meta[tax_keywords]" value="<?php echo $keywords; ?>" />  
                    <p class="description">输入分类关键字</p>  
                </td>  
            </th>  
        </tr>  
        -->  
          
    <?php  
    } // edit_tax_image_field  
   
    /** 
     * 保存自定义字段的数据 
     * 
     * @uses get_option()      从option表中获取option数据 
     * @uses update_option()   更新option数据,如果没有就新建option 
     */  
    public function save_tax_meta( $term_id ){  
   
        if ( isset( $_POST['term_meta'] ) ) {  
              
            // $term_id 是当前分类的id  
            $t_id = $term_id;  
            $term_meta = array();  
              
            // 获取表单传过来的POST数据,POST数组一定要做过滤  
            $term_meta['tax_image'] = isset ( $_POST['term_meta']['tax_image'] ) ? esc_url( $_POST['term_meta']['tax_image'] ) : '';  
  
            /** 
             *   TODO: 在这里追加获取其他自定义字段表单的值,如: 
             *   $term_meta['tax_keywords'] = isset ( $_POST['term_meta']['tax_keywords'] ) ? $_POST['term_meta']['tax_keywords'] : ''; 
             */  
  
            // 保存option数组  
            update_option( "ludou_taxonomy_$t_id", $term_meta );  
   
        } // if isset( $_POST['term_meta'] )  
    } // save_tax_meta  
   
} // Ludou_Tax_Image  
   
$wptt_tax_image = new Ludou_Tax_Image();  

主题中调用分类自定义字段的值,可以使用以下代码:

// $term_id 是当前分类的id,自行想办法获取  
$term_id = $term->term_id;  
          
// 获取已保存的option  
$term_meta = get_option( "ludou_taxonomy_$term_id" );  
  
// 取值  
$tax_image = $term_meta['tax_image'] ? $term_meta['tax_image'] : '';  

给标签添加自定义字段的原理是一样的,只需把上面第一部分代码中的action修改一下即可,将以上代码中的:

// 新建分类页面添加自定义字段输入框  
add_action( 'category_add_form_fields', array( $this, 'add_tax_image_field' ) );  
// 编辑分类页面添加自定义字段输入框  
add_action( 'category_edit_form_fields', array( $this, 'edit_tax_image_field' ) );  
  
// 保存自定义字段数据  
add_action( 'edited_category', array( $this, 'save_tax_meta' ), 10, 2 );  
add_action( 'create_category', array( $this, 'save_tax_meta' ), 10, 2 );  

改成:

// 其实就是把 category 改成 post_tag 即可  
add_action( 'post_tag_add_form_fields', array( $this, 'add_tax_image_field' ) );  
add_action( 'post_tag_edit_form_fields', array( $this, 'edit_tax_image_field' ) );  
  
add_action( 'edited_post_tag', array( $this, 'save_tax_meta' ), 10, 2 );  
add_action( 'create_post_tag', array( $this, 'save_tax_meta' ), 10, 2 );  

或者,你分类目录和标签两个都想添加自定义字段:

// 分类  
add_action( 'category_add_form_fields', array( $this, 'add_tax_image_field' ) );  
add_action( 'category_edit_form_fields', array( $this, 'edit_tax_image_field' ) );  
add_action( 'edited_category', array( $this, 'save_tax_meta' ), 10, 2 );  
add_action( 'create_category', array( $this, 'save_tax_meta' ), 10, 2 );  
  
  
// 标签  
add_action( 'post_tag_add_form_fields', array( $this, 'add_tax_image_field' ) );  
add_action( 'post_tag_edit_form_fields', array( $this, 'edit_tax_image_field' ) );  
add_action( 'edited_post_tag', array( $this, 'save_tax_meta' ), 10, 2 );  
add_action( 'create_post_tag', array( $this, 'save_tax_meta' ), 10, 2 );  
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享