web-dev-qa-db-ja.com

ユーザープロファイルにデフォルトのWordPressタグメタボックスを追加する

カスタム分類法を許可するようにユーザープロファイルを設定しました このチュートリアルに従って

理想的には、投稿画面からデフォルトのタグメタボックスを使用したいので、ユーザーは新しい用語を簡単に追加してよく使用されるものを見つけることができます。私は現在チェックボックスリストを使用していますが、多数の分類法があるのでこれは非常に長くなる可能性があります。どういうわけかpost_tags_meta_box()を使えますか? add_meta_box()を調べましたが、'user'ではうまくいきません。

8
epschmidt

残念ながら、答えはノーだと思います。

post_categories_meta_box()からコードをハイジャック(コピー+貼り付け)してユーザーに適応させることもできますが、すべてのピースを再接続するのにはもっと時間がかかります。私はポストメタボックスが新しい用語を保存したり追加したりするのにajaxを使っていると確信しています。

私はあなたの最善の策はあなたが進んでいる道を歩み続けることであると思います。チェックボックスコンテナにoverflow:scroll; cssプロパティを追加して、長すぎないようにすることができます。

数ヶ月前にフロントエンドのポストメタボックスをリバースエンジニアリングしましたが、それほど難しくありませんでした。私はコアからのマークアップとphp関数を再利用しようと試みることをお勧めしません。あなたが動けなくなる場合は、代わりにガイドとしてそれらを使用してください。

1
Michael Lewis

何をする必要があるのか​​をスケッチするための簡単な答え:

  1. WPはJavaScriptを使用してメタボックスにすべての魔法を追加します(ドラッグアンドドロップ、折りたたみなど) - > wp_enqueue_script( 'posts' );(またはそのスクリプトハンドルが呼び出された)必要があります。
  2. あなたはメタボックスを登録することを可能にするフックが必要です。
  3. ユーザープロファイル画面にレンダリングする必要がある特定のMarkUp(主にコンテナーなど)があります。
1
kaiser

このコードは私には役に立ちます。それは '位置'カスタム分類法と '示唆'ジャバスクリプトを使用します。 多項選択をサポートするためにそれを拡張する必要があります

ユーザー/管理者がプロファイルを更新したときにユーザー編集画面にカスタムフィールドを追加してメタデータを保存する

// for account owner
add_action('show_user_profile', 'add_custom_user_profile_fields');
add_action('personal_options_update', 'save_custom_user_profile_fields');

// for admins
add_action('edit_user_profile', 'add_custom_user_profile_fields');
add_action('edit_user_profile_update', 'save_custom_user_profile_fields');

function add_custom_user_profile_fields($user) {
    printf(
    '
<h3>%1$s</h3>
<table class="form-table">
<tr>
<th><label for="location">%2$s</label></th>
<td>
  <input type="text" name="location" id="location" value="%3$s" class="regular-text" />
  <br /><span class="description">%4$s</span>
</td>
</tr>
</table>
',      __('Extra Profile Information', 'locale'),
        __('Location', 'locale'),
        esc_attr(get_user_meta($user->ID, 'location', true)),
        __('Start typing location name.', 'locale')
    );
}

function save_custom_user_profile_fields($user_id) {
    if (!current_user_can('edit_user', $user_id))
        return FALSE;

    $location_name = ( isset($_POST['location']) ) ? $_POST['location'] : '';

    // use your taxonomy name instead of 'locations'
    $location = get_term_by('name', $location_name, 'locations');

    // human readable value and id
    update_user_meta($user_id, 'location', $location_name);
    update_user_meta($user_id, 'location_id', $location->term_id);
}

ユーザー編集画面にのみJavaScriptを推奨する(カスタムテーマでこれを使用していると仮定して)

function admin_scripts($hook) {
    $screen = get_current_screen();
    if ('user-edit' == $screen->id) {
    wp_enqueue_script(
        'user-edit-tag',
        get_stylesheet_directory_uri() . '/js/usermeta.js',
        array('suggest'),
        '20140509',
        true
    );
    }
}

usermeta.js

jQuery(document).ready(function($) {
   // use 'tax=your_taxonomy_name' instead of 'tax=locations'
   $('#location').suggest(ajaxurl+"?action=ajax-tag-search&tax=locations",{
        multiple:false,
        multipleSep: ","
    });
});
1
user51434