问题描述

这似乎相当简单,但是我无法找到有关如何将分类法描述字段添加到快速编辑框的明确指南。

我已经遵循了几个关于在自定义快速编辑框中添加字段的教程,但是核心字段 (名称,描述和小数) 不符合将自定义字段添加到分类快速编辑框中的相同准则。

甚至有可能这样做吗?如果没有 – 我想最好的替代是创建另一个’Description’ meta-field,并将其添加到分类快速编辑框。

最佳解决方案

通常要向快速编辑字段添加字段,因此我们应该使用仅针对自定义列触发的'quick_edit_custom_box'动作钩子,因为明确排除了核心列 (see code) 。

如果我们添加一个自定义列,那么它将显示在列表中,但是没有任何意义,因为列描述已经存在。

但是,我们有可能使用 2 个技巧添加一个不可见的列:

  1. 将其标签设置为空字符串 (以这种方式,它不会显示在”Screen Option” 设置中)

  2. 强制列隐藏在 get_user_option_manageedit-{$taxonomy}columnshidden 过滤钩上

首先创建隐形列:

/*
 * This is NOT required, but I'm using it to easily let you customize the taxonomy
 * where to add the inline description.
 * You can replace $the_target_tax in all the code with the name of your taxonomy,
 * with no need to use the global variable.
 */
global $the_target_tax;
$the_target_tax = 'category';

add_filter( "manage_edit-{$the_target_tax}_columns", function( $columns ) {
    $columns['_description'] = '';
    return $columns;
});

add_filter( "manage_{$the_target_tax}_custom_column", function( $e, $column, $term_id ) {
    if ( $column === '_description' ) return '';
}, 10, 3 );

add_filter( "get_user_option_manageedit-{$the_target_tax}columnshidden", function( $r ) {
    $r[] = '_description';
    return $r;
});

现在我们有一个不可见的自定义列'_description',但可以通过'quick_edit_custom_box'钩子使用其他字段:

但是,这个钩子并没有传递任何当前值到 pre-fill 的字段与当前描述,但我们可以使用几行 jQuery 来做到这一点:

add_action( 'quick_edit_custom_box', function( $column, $screen, $tax ) {
    if ( $screen !== 'edit-tags' ) return;
    $taxonomy = get_taxonomy( $tax );
    if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) return;
    global $the_target_tax;
    if ( $tax !== $the_target_tax || $column !== '_description' ) return;
    ?>
    <fieldset>
        <div class="inline-edit-col">
        <label>
            <span class="title"><?php _e('Description'); ?></span>
            <span class="input-text-wrap">
            <textarea id="inline-desc" name="description" rows="3" class="ptitle"></textarea>
            </span>
        </label>
        </div>
    </fieldset>
    <script>
    jQuery('#the-list').on('click', 'a.editinline', function(){
        var now = jQuery(this).closest('tr').find('td.column-description').text();
        jQuery('#inline-desc').text( now );
    });
    </script>
    <?php
}, 10, 3 );

现在我们有形式,我们需要在提交时保存数据,很容易使用"edited_{$taxonomy}"钩子:

function save_inline_description( $term_id ) {
    global $the_target_tax;
    $tax = get_taxonomy( $the_target_tax );
    if (
        current_filter() === "edited_{$the_target_tax}"
        && current_user_can( $tax->cap->edit_terms )
    ) {
        $description = filter_input( INPUT_POST, 'description', FILTER_SANITIZE_STRING );
        // removing action to avoid recursion
        remove_action( current_filter(), __FUNCTION__ );
        wp_update_term( $term_id, $the_target_tax, array( 'description' => $description ) );
    }
}
add_action( "edited_{$the_target_tax}", 'save_inline_description' );

代码被快速测试,似乎工作,请注意它需要 PHP 5.3+。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。