将自定义分类法元数据字段添加到WordPress

时间:2015-11-25 01:46:50

标签: php wordpress

我尝试在WordPress中为自定义帖子类型的自定义分类术语添加自定义元数据字段。基本上,我想为我的Post类型添加一个字幕字段。

我可以通过挂钩edit_tag_form_fields`动作将自定义字段添加到我的编辑表单中。

function custom_edit_tag_form_fields( $tag ) {
    $meta_type = 'myCustomPostType_myCustomTaxonomy';
    $object_id = $tag->term_id;
    $meta_key = 'subtitle';
    $single = true;
    $value = get_metadata($meta_type, $object_id, $meta_key, $single);
?>
<tr class="form-field term-description-wrap">
    <th scope="row">
        <label for="subtitle">Subtitle</label>
    </th>
    <td>
        <input name="subtitle" id="subtitle" type="text" value="<?php echo $value; ?>" size="40" />
    </td>
</tr>   
<?php
}

为了保存元数据,我在edited_terms操作中添加了一个钩子,用于收集和保存输入的数据。

function custom_edited_terms( $term_id ) {
    $meta_type = 'myCustomPostType_myCustomTaxonomy';
    $object_id = $term_id;  
    $meta_key = 'subtitle';
    $prev_value = null;

    if( isset($_POST[$meta_key]) ) {
        $meta_value = esc_attr( $_POST[$meta_key] );
        update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_value);
    }
}

我不确定为什么它没有存储到数据库中。如果我回显$value,我会得到一个空字符串。我希望它是我在输入字段中输入的值。

3 个答案:

答案 0 :(得分:1)

所以我能够弄清楚我遇到的问题,感谢@WisdmLabs让我指向了正确的方向。

即使我的自定义帖子类型具有自定义分类,但它仍然使用poststerms的原始WordPress表。我的问题是我错误地使用$meta_type的自定义名称。 $ meta_type变量与update_metadata中使用的表名直接相关。这就是为什么它不能保存在数据库中。它试图将其保存到名为'myCustomPostType_myCustomTaxonomy' . 'meta'的表中。

对于默认分类法,WordPress正在使用termmeta表,所以我只需要在这两个函数中更改以下行:

$meta_type = 'myCustomPostType_myCustomTaxonomy';

对此:

global $wpdb;
$meta_type = substr($wpdb->termmeta, strlen($wpdb->prefix), strlen('meta')); // equates to 'term'

我决定采用全局$meta_type = 'term';数据库对象中使用的实际wp_prefex_termmeta表而不仅仅是对$wpdb进行硬编码,而是从那里开始工作以备将来证明WP改变了用于分类表的单词。

不幸的是,WordPress中的meta后缀在使用WordPress 4.4的版本I中进行了硬编码。不过,怀疑很快就会改变。

答案 1 :(得分:1)

您是否了解过Wordpress 4.4中引入的术语元数据

function taxonomy_client_extra_field_url_display( $client ) {

    $client_url = get_term_meta( $client->term_id, 'client-url', true );

    ?>
    <tr class="form-field term-description-wrap">
        <th scope="row">
            <label for="client_url"><?php _e( 'Client URL', 'wp-job-manager' );?></label>
        </th>
        <td>
            <input name="term_meta[client-url]" id="client_url" type="text" value="<?php echo $client_url; ?>" size="40" />
        </td>
    </tr>   
    <?php
}

function taxonomy_client_extra_fields_save( $term_id ) {

    if ( !isset( $_POST['term_meta'] ) ) return;

    foreach ( $_POST['term_meta'] as $slug => $value){

        switch($slug){
            default:
                $value = sanitize_title( $value );
            break;
        }

        update_term_meta( $term_id, $slug, $value );
    }

}

add_action( "job_listing_client_add_form_fields", 'taxonomy_client_extra_field_url_display' );
add_action( "job_listing_client_edit_form_fields", 'taxonomy_client_extra_field_url_display' );

add_action( 'edited_job_listing_client', 'taxonomy_client_extra_fields_save', 10, 2);
add_action( 'created_job_listing_client', 'taxonomy_client_extra_fields_save', 10, 2);

答案 2 :(得分:0)

function custom_edit_tag_form_fields( $tag ) {
    global $post;
    $meta_key = 'subtitle';
    $post_id = $post->ID;
    $value   = get_post_meta( $post_id, $meta_key, true );    
?>
<tr class="form-field term-description-wrap">
    <th scope="row">
        <label for="subtitle">Subtitle</label>
    </th>
    <td>
        <input name="subtitle" id="subtitle" type="text" value="<?php echo $value; ?>" size="40" />
    </td>
</tr>   
<?php
}


function custom_edited_terms( $post_id ) {   
    $meta_key = 'subtitle';
    if( isset($_POST[$meta_key]) ) {
        $meta_value = esc_attr( $_POST[$meta_key] );
        update_post_meta( $post_id, $meta_key, esc_attr( $_POST[meta_key], true ) );
    }
}