web-dev-qa-db-fra.com

Taxonomie personnalisée sur les utilisateurs avec interface utilisateur

WP nous permetregister_taxonomy() avec users comme type d'objet, créant ainsi des taxonomies mappées sur des ID utilisateur plutôt que sur des ID de poste.

Malheureusement, cette méthode est mal documentée et de nombreuses fonctionnalités ne fonctionnent pas comme on pouvait s'y attendre d'après les taxonomies postérieures.

Quelles sont toutes les corrections nécessaires pour que les taxonomies d'utilisateurs fonctionnent et se comportent de manière similaire aux taxonomies postérieures?

Ce billet de 2011 de Justin Tadlock sur le sujet est la meilleure source disponible, mais il est quelque peu désuet et de nombreuses solutions importantes ne sont disponibles que dans la section commentaires.

3
jerclarke

Répondre à cette question est, par sa conception, un processus en plusieurs parties. Il y a plusieurs choses que vous (ou un plugin/une bibliothèque) devez faire pour que les taxonomies d'utilisateurs se comportent de la même manière que les taxonomies postales, même après l'avoir enregistrée (avec succès).

Cette réponse est un travail en cours dans une certaine mesure. S'il vous plaît ajouter d'autres réponses avec des solutions à tous les aspects qui manquent à la mienne.

Ajouter une page d'administration de gestion des termes et corriger la filiation

La première chose que vous remarquerez est manquante après avoir enregistré une taxonomie pour 'utilisateurs' est l'élément de menu administrateur, qui n'existe pas du tout.

Ajout de la page de gestion

Justin Tadlock a constaté que l’utilisation de la page d’administration edit-tags.php (destinée aux taxonomies postales) fonctionnait étonnamment bien, mais il fallait toutefois ajouter un autre filtre au crochet parent_file pour que la nouvelle page admin apparaisse comme un enfant d’utilisateur plutôt que de posts.

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

Ceci s’accroche à l’action admin_menu:

add_action( 'admin_menu', 'add_user_taxonomy_admin_page');

Fixer la filiation

Comme indiqué ci-dessus, le correctif ci-dessus fonctionne, mais la page sera confondue dans la barre latérale. Il s’affichera sous la forme Users > TAXONOMYNAME mais lorsque vous cliquez dessus, le menu Utilisateurs ne sera pas ouvert. La section Messages de la barre latérale sera élargie même si la page actuelle (TAXONOMYNAME) n’y figure pas. La raison en est que WP pense que la page parente actuelle est Posts car nous utilisons edit-tags.php.

Ainsi, la solution consiste à filtrer parent_file avec un rappel garantissant que users.php est toujours utilisé comme parent lorsque notre taxonomie est chargée dans 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;
}

Nous enregistrons le filtre comme ceci:

add_filter( 'parent_file', 'filter_user_taxonomy_admin_page_parent_file');

Ajouter le sélecteur de termes à l'écran du profil utilisateur et gérer la saisie lors de la sauvegarde de l'utilisateur

Enregistrez et utilisez la fonction personnalisée update_count_callback

Le update_count_callback pour une taxonomie est une fonction qui compte le nombre de fois qu'un terme a été utilisé afin que son "compte" puisse être mis à jour.

Personnaliser cette valeur dans votre appel à register_taxonomy() est extrêmement vital, car celui par défaut est spécifiquement destiné aux publications.

Justin Tadlock a constaté que cette fonction fonctionnait bien et, jusqu'à présent, elle fonctionne avec n'importe quelle taxonomie d'utilisateurs.

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

Pour utiliser cela comme rappel, mettez à jour votre appel avec register_taxonomy() et ajoutez l'argument update_count_callback:

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

Filtrez les noms d'utilisateurs pour éviter les collisions permalink

4
jerclarke