web-dev-qa-db-ja.com

UIを使用したユーザーのカスタム分類

WPを使用すると、オブジェクトタイプとしてusersを使用してregister_taxonomy()となり、ポストIDではなくユーザーIDにマッピングされた分類法が作成されます。

残念ながら、この方法は十分に文書化されておらず、多くの機能はポスト分類法に基づいて予想されるように機能しません。

ユーザー分類法がポスト分類法と同様に機能し、動作するようにするために必要なすべての修正は何ですか?

このテーマに関するJustin Tadlockによるこの2011年の投稿 は入手可能な最良の情報源ですが、やや時代遅れであり、多くの重要な解決策はコメント欄でしか利用できません。

3
jerclarke

この質問に答えることは、意図的に、マルチパートプロセスです。 (正常に)登録した後でも、ユーザー分類法をポスト分類法と同様に動作させるためにあなた(またはプラグイン/ライブラリー)がする必要があることがいくつかあります。

この答えはある程度進行中です。私のものから欠けている側面への解決策と他の答えを追加してください。

用語管理管理ページを追加し、親子関係を修正する

「ユーザー」の分類法を登録した後に最初に気付くのは、管理メニュー項目です。これはまったく存在しません。

管理ページを追加する

Justin Tadlockは、新しい管理ページを投稿ではなくユーザーの子として表示させるためにedit-tags.phpフックに別のフィルタを追加する必要があるという警告とともに、parent_file管理ページ(投稿分類用)の使用が驚くほどうまく機能することを発見しました。

/**
 * Creates the admin page for the taxonomy under the 'Users' menu.  
 * 
 * It works the same as any other taxonomy page in the admin by using edit-tags.php
 * 
 * ISSUE: When clicking on the menu item in the admin, WordPress' menu system thinks
 * you're viewing something under 'Posts' instead of 'Users'.
 * SO: When you are on the edit-tags page the "Posts" section of the sidebar is open, 
 * but the taxonomy's name isn't there, it's still under users. 
 * 
 * @see filter_user_taxonomy_admin_page_parent_file() which fixes the issue with menu parent
 */
function add_user_taxonomy_admin_page() {

    $tax = get_taxonomy( 'YOUR_TAXONOMY_NAME' );

    if (!is_object($tax) OR is_wp_error($tax)) 
        return;

    add_users_page(
        esc_attr( $tax->labels->menu_name ),
        esc_attr( $tax->labels->menu_name ),
        $tax->cap->manage_terms,
        'edit-tags.php?taxonomy=' . $tax->name
    );
}

これはadmin_menuアクションにフックします。

add_action( 'admin_menu', 'add_user_taxonomy_admin_page');

血統を修正する

上記のように上記の修正は機能しますが、ページはサイドバーで混乱します。 Users > TAXONOMYNAMEと表示されますが、クリックするとUsersメニューは開きません。現在のページ(TAXONOMYNAME)が表示されていなくても、サイドバーの[投稿]セクションが展開されます。その理由は、WPはedit-tags.phpを使用しているため、現在の親ページはPostであると考えているためです。

したがって、解決策は、分類法がparent_fileにロードされるときにusers.phpが常に親として使用されるようにするコールバックを使用してedit-tags.phpをフィルター処理することです。

/**
 * Fix position of user taxonomy in admin menu to be under Users by filtering parent_file
 * 
 * Should be used with 'parent_file' filter.
 * 
 * This is a fix to make edit-tags.php work as an editor of user taxonomies, it solves a 
 * problem where the "Posts" sidebar item is expanded rather than "Users". 
 * 
 * @see add_user_taxonomy_admin_page() which registers the user taxonomy page as edit-tags.php
 * @global string $pagenow Filename of current page (like edit-tags.php)
 * @param string $parent_file Filename of admin page being filtered
 * @return string Filtered filename
 */
function filter_user_taxonomy_admin_page_parent_file( $parent_file = '' ) {
    global $pagenow;

    /**
     * Only filter the parent if we are on a the taxonomy screen for 
     */
    if ( ! empty( $_GET['taxonomy'] ) && ($_GET['taxonomy'] == 'YOUR_TAXONOMY_NAME') && $pagenow == 'edit-tags.php' ) {
        $parent_file = 'users.php';
    }

    return $parent_file;
}

このようにフィルタを登録します。

add_filter( 'parent_file', 'filter_user_taxonomy_admin_page_parent_file');

ユーザープロファイル画面に用語ピッカーを追加し、ユーザーの保存時に入力を処理する

カスタムupdate_count_callback関数を登録して使用する

分類法のupdate_count_callbackは、用語が使用された回数をカウントして「カウント」を更新できるようにする関数です。

デフォルト値は投稿専用であるため、register_taxonomy()への呼び出しでこの値をカスタマイズすることは非常に重要です。

Justin Tadlockは、この機能がうまくいっていることを見つけました、そして今のところ私はそれがどんなユーザ分類学でもうまくいくとわかりました。

/**
 * Function for updating a user taxonomy count.  
 * 
 * What this does is update the count of a specific term by the number of users that have been given the term. 
 *
 * See the _update_post_term_count() function in WordPress for more info.
 *
 * @see https://web.archive.org/web/20150327042855/http://justintadlock.com/archives/2011/10/20/custom-user-taxonomies-in-wordpress
 * @param array $terms List of Term taxonomy IDs
 * @param object $taxonomy Current taxonomy object of terms
 */
function user_taxonomy_update_count_callback( $terms, $taxonomy ) {
    global $wpdb;

    foreach ( (array) $terms as $term ) {
        $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term ) );

        do_action( 'edit_term_taxonomy', $term, $taxonomy );
        $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );
        do_action( 'edited_term_taxonomy', $term, $taxonomy );
    }
}   

これをコールバックとして使用するには、呼び出しをregister_taxonomy()に更新してupdate_count_callback引数を追加します。

$args['update_count_callback'] = 'user_taxonomy_update_count_callback';

パーマリンクの衝突を避けるためにユーザ名をフィルタリングする

4
jerclarke