Benutzerdefinierte Taxonomie für Benutzer mit UI

WP lässt uns register_taxonomy() mit users als Objekttyp definieren und so Taxonomien erstellen, die Benutzer-IDs und nicht Post-IDs zugeordnet sind.

Leider ist diese Methode schlecht dokumentiert und viele functionen funktionieren nicht so, wie wir es aufgrund von Post-Taxonomien erwarten würden.

Welche Fixes sind erforderlich, damit die Benutzertaxonomien funktionieren und sich ähnlich wie Post-Taxonomien verhalten?

Dieser Beitrag von Justin Tadlock aus dem Jahr 2011 zu diesem Thema ist die beste verfügbare Quelle, aber er ist etwas veraltet und viele wichtige Lösungen sind nur im Kommentarbereich verfügbar.

Solutions Collecting From Web of "Benutzerdefinierte Taxonomie für Benutzer mit UI"

Die Beantwortung dieser Frage ist konzeptuell ein mehrteiliger process. Es gibt verschiedene Dinge, die Sie (oder ein Plugin / eine Bibliothek) tun müssen, damit sich Benutzertaxonomien ähnlich wie Posttaxonomien verhalten, selbst nachdem Sie sie (erfolgreich) registriert haben.

Diese Antwort ist zu einem gewissen Grad in Arbeit. Bitte fügen Sie weitere Antworten mit Lösungen zu allen Aspekten hinzu, die mir fehlen.

Fügen Sie die Verwaltungsseite für die Terminverwaltung hinzu und korrigieren Sie die Elternschaft

Das erste, was Sie bemerken werden, ist, dass nach der Registrierung einer Taxonomie für “Benutzer” der Admin-Menüpunkt fehlt, der überhaupt nicht existiert.

Hinzufügen der Verwaltungsseite

Justin Tadlock fand heraus, dass die Verwendung der Admin-Seite edit-tags.php (für Post-Taxonomien gedacht) überraschend gut funktioniert, mit der Einschränkung, dass wir einen weiteren Filter zum parent_file Hook hinzufügen parent_file , damit die neue Admin-Seite als parent_file Beiträge.

 /** * 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 ); } 

Dies hängt sich an die Aktion admin_menu :

 add_action( 'admin_menu', 'add_user_taxonomy_admin_page'); 

Beheben der Elternschaft

Wie oben erwähnt, funktioniert das Update oben, aber die Seite wird in der Seitenleiste verwirrt. Es wird als Users > TAXONOMYNAME aber wenn Sie darauf klicken, wird das Menü Benutzer nicht geöffnet, stattdessen wird der Abschnitt Beiträge der Seitenleiste erweitert, obwohl die aktuelle Seite (TAXONOMYNAME) nicht darin enthalten ist. Der Grund dafür ist, dass WP denkt, dass die aktuelle Parent-Seite Posts ist, da wir edit-tags.php verwenden.

Daher besteht die Lösung darin, parent_file mit einem Callback zu filtern, der sicherstellt, dass users.php immer als Eltern verwendet wird, wenn unsere Taxonomie in edit-tags.php geladen 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; } 

Wir registrieren den Filter so:

 add_filter( 'parent_file', 'filter_user_taxonomy_admin_page_parent_file'); 

Fügen Sie dem Benutzerprofilbildschirm die Begriffswähler hinzu und bearbeiten Sie die Eingabe beim Speichern des Benutzers

Registrieren und verwenden Sie die benutzerdefinierte function update_count_callback

Der update_count_callback für eine Taxonomie ist eine function, die die Anzahl der Male zählt, die ein Begriff verwendet wurde, damit sein “count” aktualisiert werden kann.

Die Anpassung dieses Werts in Ihrem Aufruf von register_taxonomy() ist äußerst wichtig, da der Standardwert speziell für Posts gilt.

Justin Tadlock fand, dass diese function gut funktionierte, und bisher habe ich festgestellt, dass sie mit jeder Anwendertaxonomie funktioniert.

 /** * 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 ); } } 

Um dies als Callback zu verwenden, aktualisieren Sie Ihren Aufruf von register_taxonomy() und fügen Sie das Argument update_count_callback :

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

Filtern Sie Benutzernamen, um Permalink-Kollisionen zu vermeiden