将自定义字段添加到类别


22

我想将自定义字段添加到特定类别。一个类别仅包含以下字段:

名称:

子弹头

家长:

描述:

由于我有电视连续剧网站,因此我想添加更多字段,因此在创建新类别(类别=系列)时需要类似的内容

名称:

艺术家:

年:

类型:

类型:

摘要:

子弹头

家长:

描述:

等等...

有什么帮助吗?提前致谢。



这是我在执行此操作时使用的备忘单。它在短列表中有相关​​的动作挂钩和过滤器。charlestonsw.com/...
兰斯克利夫兰

Answers:


24

我一周前发布了“操作方法”,网址为http://en.bainternet.info/2011/wordpress-category-extra-fields

希望这可以帮助。

奥哈德


这是该帖子的详细信息:

我们要做的第一件事是使用钩子edit_category_form_fields将多余的字段添加到类别编辑表单中,并且我们使用了一个简单的函数来打印出多余的字段。

<?php
//add extra fields to category edit form hook
add_action ( 'edit_category_form_fields', 'extra_category_fields');

//add extra fields to category edit form callback function
function extra_category_fields( $tag ) {    //check for existing featured ID
    $t_id = $tag->term_id;
    $cat_meta = get_option( "category_$t_id");
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_Image_url"><?php _e('Category Image Url'); ?></label></th>
<td>
<input type="text" name="Cat_meta[img]" id="Cat_meta[img]" size="3" style="width:60%;" value="<?php echo $cat_meta['img'] ? $cat_meta['img'] : ''; ?>"><br />
        <span class="description"><?php _e('Image for category: use full url with '); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra1"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra1]" id="Cat_meta[extra1]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra1'] ? $cat_meta['extra1'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra2"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra2]" id="Cat_meta[extra2]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra2'] ? $cat_meta['extra2'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra3"><?php _e('extra field'); ?></label></th>
<td>
        <textarea name="Cat_meta[extra3]" id="Cat_meta[extra3]" style="width:60%;"><?php echo $cat_meta['extra3'] ? $cat_meta['extra3'] : ''; ?></textarea><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<?php
}

如您所见,我添加了4个新字段,并且所有这些字段都位于Cat_meta [key]数组中,因为这样一来,我们仅在options表中的行上创建即可保存所有类别的额外字段,而不是每个字段都包含一行。

接下来,一旦用户提交类别编辑表单,我们需要将额外的字段保存到数据库中,然后使用“ edited_category”将其与将运行在每个提交字段中的函数一起使用,并使用update_option函数将其插入数据库中, 像这样:

<?php
// save extra category extra fields hook
add_action ( 'edited_category', 'save_extra_category_fileds');

// save extra category extra fields callback function
function save_extra_category_fileds( $term_id ) {
    if ( isset( $_POST['Cat_meta'] ) ) {
        $t_id = $term_id;
        $cat_meta = get_option( "category_$t_id");
        $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key){
            if (isset($_POST['Cat_meta'][$key])){
                $cat_meta[$key] = $_POST['Cat_meta'][$key];
            }
        }
        //save the option array
        update_option( "category_$t_id", $cat_meta );
    }
}

从上面的代码中,您可以看到我们添加的所有其他字段都存储在数据库的选项表中,名称为'category_ID',其中ID是我们刚刚编辑的特定类别的ID,这意味着我们可以将其称为使用get_option函数可以轻松地在我们的插件或主题文件中添加数据。

例如说我的类别ID是25,那么我的代码将如下所示

<?php $cat_data = get_option('category_25'); ?>

正如我在一开始所说的,我需要为每个类别显示不同的图像,因此在这种情况下,我在显示类别标题的代码之后,将这几行代码添加到主题的category.php中:

<?php
//first get the current category ID
$cat_id = get_query_var('cat');

//then i get the data from the database
$cat_data = get_option("category_$cat_id");

//and then i just display my category image if it exists
if (isset($cat_data['img'])){
    echo '<div class="category_image"><img src="'.$cat_data['img'].'"></div>';
}

很好,很容易,我们都完成了。结果应类似于以下内容:

在此处输入图片说明


4
请将博客的主要内容发布到此答案中。即使在您自己的博客上,链接腐烂也可能发生。
Django的莱因哈特

1
在2011年好友中回答了这个问题:)
Bainternet

1
你的意思是?
Django Reinhardt

4
如果您认为此答案没有任何价值,则应将其删除...但是,此问题有16,000多次浏览。我认为这个问题尽管年代久远,但对人们仍然有用,并且可以通过包含有关链接的详细信息来改善此答案。
Django Reinhardt

4
...虽然大家正忙于辩论(尽管一年前),但我花了不到5分钟的时间才能将所有内容带到答案中。这很容易...
MxmastaMills's

18

从Wordpress 4.4开始,添加了add_term_meta()update_term_meta()get_term_meta()函数。这意味着可以更新MxmastaMills提供的代码,以使用少得多的hacky方法。

这是我的更新。我只想添加一个自定义标题,所以只有一个字段,但是对于要添加的所有字段,它的作用都相同。

function addTitleFieldToCat(){
    $cat_title = get_term_meta($_POST['tag_ID'], '_pagetitle', true);
    ?> 
    <tr class="form-field">
        <th scope="row" valign="top"><label for="cat_page_title"><?php _e('Category Page Title'); ?></label></th>
        <td>
        <input type="text" name="cat_title" id="cat_title" value="<?php echo $cat_title ?>"><br />
            <span class="description"><?php _e('Title for the Category '); ?></span>
        </td>
    </tr>
    <?php

}
add_action ( 'edit_category_form_fields', 'addTitleFieldToCat');

function saveCategoryFields() {
    if ( isset( $_POST['cat_title'] ) ) {
        update_term_meta($_POST['tag_ID'], '_pagetitle', $_POST['cat_title']);
    }
}
add_action ( 'edited_category', 'saveCategoryFields');

2
没什么要注意的:在edited_category钩子中,tag_ID将在$_POST数组中,而不是中$_GET。还add_term_meta实际上会添加一个新条目,而不是覆盖可能的旧条目。使用update_term_meta代替。
马丁·迪米特洛夫

@MartinDimitrov您能通过单击“编辑”按钮来修正卢克-西蒙斯的答案吗?这样,每个人都可以使用现有的最佳代码,即使不是很好的代码(这里的设计师!)。谢谢!
雨果

1
它不会以表单的形式保存数据
Dev

@Dev确实会保存数据,除非您在第二行中将$ _POST更改为$ _GET,否则它不会显示。
banesto

3

此代码的工作原理:

add_action ( 'edit_category_form_fields', function( $tag ){
    $cat_title = get_term_meta( $tag->term_id, '_pagetitle', true ); ?>
    <tr class='form-field'>
        <th scope='row'><label for='cat_page_title'><?php _e('Category Page Title'); ?></label></th>
        <td>
            <input type='text' name='cat_title' id='cat_title' value='<?php echo $cat_title ?>'>
            <p class='description'><?php _e('Title for the Category '); ?></p>
        </td>
    </tr> <?php
});
add_action ( 'edited_category', function() {
    if ( isset( $_POST['cat_title'] ) )
        update_term_meta( $_POST['tag_ID'], '_pagetitle', $_POST['cat_title'] );
});

这不比另一个笨拙,我刚刚用WordPress 5.2.2进行了验证
nico gawenda

1

保罗·梅纳德(Paul Menard)在他的博客中提供了一个有关如何创建和使用术语元的示例
。WordPress 3.0中新分类法的自定义元

没有创建数据库表或检查$_POST是否设置了var 的示例,因此您需要自己做这些小事情,但是看起来很不错的代码库可以基于... :)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.