WordPress 4.4 新特性:Term meta

在最近发布的 WordPress 4.4 中,新增了 Term meta (项目元数据),因此开发者可以轻松实现为分类增加颜色属性之类的功能。

如何使用 term meta

如果你是一名开发者,并且曾经使用过文章、评论或者用户数据,那 Term meta 对你来说一定并不陌生。Term meta 有 4 个包装函数:

获取 term meta

为了获得已经存储的颜色,使用 get_term_meta() 函数:

$color = get_term_meta( $term->term_id, 'color', true );

添加表单项

分类颜色表单项

为新建分类目录的表单添加颜色项:

add_action( 'category_add_form_fields', 'c7sky_new_term_color_field' );
add_action( 'post_tag_add_form_fields', 'c7sky_new_term_color_field' );

function c7sky_new_term_color_field() {
    wp_nonce_field( basename( __FILE__ ), 'c7sky_term_color_nonce' ); ?>

    <div class="form-field c7sky-term-color-wrap">
        <label for="c7sky-term-color">颜色</label>
        <input type="text" name="c7sky_term_color" id="c7sky-term-color" data-default-color="#ffffff" />
    </div>
<?php }

对于编辑分类目录的表单,代码如下:

add_action( 'category_edit_form_fields', 'c7sky_edit_term_color_field' );

function c7sky_edit_term_color_field( $term ) {
    $default = '#ffffff';
    $color   = get_term_meta( $term->term_id, 'color', true );

    if ( ! $color )
        $color = $default; ?>

    <tr class="form-field c7sky-term-color-wrap">
        <th scope="row"><label for="c7sky-term-color">颜色</label></th>
        <td>
            <?php echo wp_nonce_field( basename( __FILE__ ), 'c7sky_term_color_nonce' ); ?>
            <input type="text" name="c7sky_term_color" id="c7sky-term-color" value="<?php echo esc_attr( $color ); ?>" data-default-color="<?php echo esc_attr( $default ); ?>" />
        </td>
    </tr>
<?php }

保存 term meta

分类颜色栏目

为了保存我们添加的表单项,我们需要使用 create_{$taxonomy} (新建表单) 和 edit_{$taxonomy} (编辑表单) 这 2 个动作钩子。

add_action( 'create_category', 'c7sky_save_term_color' );
add_action( 'edit_category',   'c7sky_save_term_color' );

function c7sky_save_term_color( $term_id ) {
    if ( ! isset( $_POST['c7sky_term_color_nonce'] ) || ! wp_verify_nonce( $_POST['c7sky_term_color_nonce'], basename( __FILE__ ) ) )
        return;

    $color = isset( $_POST['c7sky_term_color'] ) ? $_POST['c7sky_term_color'] : '';

    if ( '' === $color ) {
        delete_term_meta( $term_id, 'color' );
    } else {
        update_term_meta( $term_id, 'color', $color );
    }
}

添加 term meta 表格栏目

在分类管理页面,你也许需要添加一个栏目来显示元数据。

首先告诉 WordPress 我们要自定义的栏目:

add_filter( 'manage_edit-category_columns', 'c7sky_edit_term_columns' );

function c7sky_edit_term_columns( $columns ) {
    $columns['color'] = '颜色';
    return $columns;
}

然后,我们需要处理该列的输出:

add_filter( 'manage_category_custom_column', 'c7sky_manage_term_custom_column', 10, 3 );

function c7sky_manage_term_custom_column( $out, $column, $term_id ) {
    if ( 'color' === $column ) {
        $color = get_term_meta( $term_id, 'color', true );

        if ( ! $color )
            $color = '#ffffff';

        $out = sprintf( '<span class="color-block" style="background:%s">&nbsp</span>', esc_attr( $color ) );
    }
    return $out;
}

外观美化

我们可以使用颜色选择器替代传统的文本框,并把栏目中的颜色直观的呈现出来。

add_action( 'admin_enqueue_scripts', 'c7sky_admin_enqueue_scripts' );

function c7sky_admin_enqueue_scripts( $hook_suffix ) {
    if ( 'edit-tags.php' !== $hook_suffix || 'category' !== get_current_screen()->taxonomy )
        return;

    wp_enqueue_style( 'wp-color-picker' );
    wp_enqueue_script( 'wp-color-picker' );

    add_action( 'admin_head',   'c7sky_term_color_print_styles' );
    add_action( 'admin_footer', 'c7sky_term_color_print_scripts' );
}

function c7sky_term_color_print_styles() { ?>
    <style>
        .column-color { width: 50px; }
        .column-color .color-block { display: inline-block; width: 28px; height: 28px; border-radius: 50%; }
    </style>
<?php }

function c7sky_term_color_print_scripts() { ?>
    <script>
        jQuery( function( $ ) {
            $( '#c7sky-color-field' ).wpColorPicker();
        } );
    </script>
<?php }

参考文章:Introduction to WordPress term meta

10 条评论

发表评论

*