我需要一个简单但完整的例子,将Metabox添加到分类中

时间:2015-12-13 作者:Manu

现在WordPress 4.4已经发布,我们可以开始使用新的很棒的术语元函数了!

尽管如此,似乎没有简单的教程介绍如何将基本文本字段添加到分类法中。我试着适应this awesome tutorial by Justin Tadlock 根据我的需要,删除所有与颜色选择器相关的代码,并将其替换为一个简单的文本输入字段。。。但它不起作用。

有人能提供一个基本的工作代码示例吗?没有数据验证、nonce、颜色选择器。。。只是一个最小的文本框,添加到添加分类法/编辑分类法页面。

Update: 与此同时,我对这段代码片段进行了一些修改:

将术语元字段添加到Category:
https://gist.github.com/ms-studio/543a0f7dd8ac05ccf037

将术语元字段添加到Post Tag:
https://gist.github.com/ms-studio/2d78ad3839e05ece2e48

将术语元字段添加到Custom Taxonomy:
https://gist.github.com/ms-studio/fc21fd5720f5bbdfaddc

将多个术语元字段添加到Custom Taxonomy:
https://gist.github.com/ms-studio/aeae733f5fd9fc524bbc

1 个回复
最合适的回答,由SO网友:jgraup 整理而成

这将在您的类别中添加一个名为“术语元文本”的字段。我确实拿走了nonce,但我真的认为它应该回去。而且,有一些卫生处理比没有更好。这个示例包括javascript和CSS挂钩,您可能需要也可能不需要这些挂钩,但您可以快速看到所有部分是如何结合在一起的。

享受

// REGISTER TERM META

add_action( \'init\', \'___register_term_meta_text\' );

function ___register_term_meta_text() {

    register_meta( \'term\', \'__term_meta_text\', \'___sanitize_term_meta_text\' );
}

// SANITIZE DATA

function ___sanitize_term_meta_text ( $value ) {
    return sanitize_text_field ($value);
}

// GETTER (will be sanitized)

function ___get_term_meta_text( $term_id ) {
  $value = get_term_meta( $term_id, \'__term_meta_text\', true );
  $value = ___sanitize_term_meta_text( $value );
  return $value;
}

// ADD FIELD TO CATEGORY TERM PAGE

add_action( \'category_add_form_fields\', \'___add_form_field_term_meta_text\' );

function ___add_form_field_term_meta_text() { ?>
    <?php wp_nonce_field( basename( __FILE__ ), \'term_meta_text_nonce\' ); ?>
    <div class="form-field term-meta-text-wrap">
        <label for="term-meta-text"><?php _e( \'TERM META TEXT\', \'text_domain\' ); ?></label>
        <input type="text" name="term_meta_text" id="term-meta-text" value="" class="term-meta-text-field" />
    </div>
<?php }


// ADD FIELD TO CATEGORY EDIT PAGE

add_action( \'category_edit_form_fields\', \'___edit_form_field_term_meta_text\' );

function ___edit_form_field_term_meta_text( $term ) {

    $value  = ___get_term_meta_text( $term->term_id );

    if ( ! $value )
        $value = ""; ?>

    <tr class="form-field term-meta-text-wrap">
        <th scope="row"><label for="term-meta-text"><?php _e( \'TERM META TEXT\', \'text_domain\' ); ?></label></th>
        <td>
            <?php wp_nonce_field( basename( __FILE__ ), \'term_meta_text_nonce\' ); ?>
            <input type="text" name="term_meta_text" id="term-meta-text" value="<?php echo esc_attr( $value ); ?>" class="term-meta-text-field"  />
        </td>
    </tr>
<?php }


// SAVE TERM META (on term edit & create)

add_action( \'edit_category\',   \'___save_term_meta_text\' );
add_action( \'create_category\', \'___save_term_meta_text\' );

function ___save_term_meta_text( $term_id ) {

    // verify the nonce --- remove if you don\'t care
    if ( ! isset( $_POST[\'term_meta_text_nonce\'] ) || ! wp_verify_nonce( $_POST[\'term_meta_text_nonce\'], basename( __FILE__ ) ) )
        return;

    $old_value  = ___get_term_meta_text( $term_id );
    $new_value = isset( $_POST[\'term_meta_text\'] ) ? ___sanitize_term_meta_text ( $_POST[\'term_meta_text\'] ) : \'\';


    if ( $old_value && \'\' === $new_value )
        delete_term_meta( $term_id, \'__term_meta_text\' );

    else if ( $old_value !== $new_value )
        update_term_meta( $term_id, \'__term_meta_text\', $new_value );
}

// MODIFY COLUMNS (add our meta to the list)

add_filter( \'manage_edit-category_columns\', \'___edit_term_columns\' );

function ___edit_term_columns( $columns ) {

    $columns[\'__term_meta_text\'] = __( \'TERM META TEXT\', \'text_domain\' );

    return $columns;
}

// RENDER COLUMNS (render the meta data on a column)

add_filter( \'manage_category_custom_column\', \'___manage_term_custom_column\', 10, 3 );

function ___manage_term_custom_column( $out, $column, $term_id ) {

    if ( \'__term_meta_text\' === $column ) {

        $value  = ___get_term_meta_text( $term_id );

        if ( ! $value )
            $value = \'\';

        $out = sprintf( \'<span class="term-meta-text-block" style="" >%s</div>\', esc_attr( $value ) );
    }

    return $out;
}

// ADD JAVASCRIPT & STYLES TO COLUMNS

add_action( \'admin_enqueue_scripts\', \'___admin_enqueue_scripts\' );

function ___admin_enqueue_scripts( $hook_suffix ) {

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

    // ADD YOUR SUPPORTING CSS / JS FILES HERE
    // wp_enqueue_style( \'wp-color-picker\' );
    // wp_enqueue_script( \'wp-color-picker\' );

    add_action( \'admin_head\',   \'___meta_term_text_print_styles\' );
    add_action( \'admin_footer\', \'___meta_term_text_print_scripts\' );
}

// PRINT OUR CUSTOM STYLES

function ___meta_term_text_print_styles() { ?>

    <style type="text/css">
        .column-__term_meta_text { background-color:rgb(249, 249, 249); border: 1px solid lightgray;}
        .column-__term_meta_text .term-meta-text-block { display: inline-block; color:darkturquoise; }
    </style>
<?php }

// PRINT OUR CUSTOM SCRIPTS

function ___meta_term_text_print_scripts() { ?>

    <script type="text/javascript">
        jQuery( document ).ready( function( $ ) {
             $input_field = $( \'.term-meta-text-field\' );
             // console.log($input_field); // your input field
        } );
    </script>
<?php }

相关推荐

什么时候应该/不应该使用wp_get_post_Terms与Get_the_Terms?

一位用户在codex中提供了一条注释,指出唯一的区别是get\\u术语使用缓存的数据,我已经知道wp\\u get\\u post\\u术语可以让您通过slug检索数据,但我仍然想知道使用其中一个与另一个的最佳情况是什么。