get_editorial_roles(); /* * ⛔ CET ONGLET DISAIT « 0 » PENDANT QUE LE WORKFLOW TOURNAIT — corrigé le 17/08/2026, * relevé par Greg à l'écran. * * Trois écrans de la MÊME extension définissaient « auteur » de trois façons : * · cet onglet : seulement les 3 rôles éditoriaux -> 0 * · onglet Posts : + administrator, editor, author -> proposait « aaa aaa » * · Dashboard : ceux qui ont au moins un article assigné -> 1 * Résultat pour l'utilisateur : il assigne un article, puis lit « No user has an * editorial role yet » sur l'écran censé lister son équipe. Ce n'est pas faux au sens * strict — c'est incohérent, et l'incohérence est le défaut. * * On liste désormais l'UNION : rôle éditorial OU participation réelle au workflow * (article assigné, ou co-signature). C'est aussi ce qui rend l'écran utile : il * montre la charge de ceux qui travaillent, pas l'état d'une case administrative. */ // Charge par auteur : { user_id => { total, approved, published } }. $table = $wpdb->prefix . 'aiforya_ma_assignments'; $rows = $wpdb->get_results( $wpdb->prepare( 'SELECT user_id, status, COUNT(*) AS count FROM %i GROUP BY user_id, status', $table ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching $db = Aiforya_Multi_Author_Db::get_instance(); $participants = array_map( static fn( $r ) => (int) $r->user_id, (array) $rows ); $co_table = $wpdb->prefix . 'aiforya_ma_coauthors'; $co_rows = $wpdb->get_results( $wpdb->prepare( 'SELECT DISTINCT user_id FROM %i', $co_table ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching $participants = array_unique( array_merge( $participants, array_map( static fn( $r ) => (int) $r->user_id, (array) $co_rows ) ) ); unset( $db ); $users = get_users( [ 'role__in' => array_keys( $role_labels ), 'orderby' => 'display_name', 'order' => 'ASC', ] ); $deja = array_map( static fn( $u ) => (int) $u->ID, $users ); foreach ( $participants as $uid ) { if ( $uid && ! in_array( $uid, $deja, true ) ) { $u = get_user_by( 'ID', $uid ); if ( $u ) { $users[] = $u; $deja[] = $uid; } } } usort( $users, static fn( $a, $b ) => strcasecmp( (string) $a->display_name, (string) $b->display_name ) ); $charge = []; foreach ( (array) $rows as $row ) { $uid = (int) $row->user_id; if ( ! isset( $charge[ $uid ] ) ) { $charge[ $uid ] = [ 'total' => 0, 'approved' => 0, 'published' => 0 ]; } $charge[ $uid ]['total'] += (int) $row->count; if ( 'approved' === $row->status ) { $charge[ $uid ]['approved'] += (int) $row->count; } elseif ( 'published' === $row->status ) { $charge[ $uid ]['published'] += (int) $row->count; } } // Helper D2 : pastille d'aide « ? » charte (AiforyaTooltip). $text déjà traduit. $tip = static function ( $text ) { printf( '', esc_attr( $text ) ); }; ?>

roles, true ) ) { $primary_role = $role_slug; break; } } /* * Sans rôle éditorial, cette cellule ne montrait qu'un tiret — une colonne * qui n'apprend rien. Depuis que l'onglet liste aussi les participants au * workflow, on affiche à défaut leur rôle WordPress (Administrator, Author…), * qui est l'information utile : elle dit ce que la personne peut déjà faire. */ $role_label = $role_labels[ $primary_role ] ?? ''; if ( '' === $role_label ) { $wp_roles = wp_roles(); $premier = (array) $user->roles; $premier = reset( $premier ); $role_label = ( $premier && isset( $wp_roles->role_names[ $premier ] ) ) ? translate_user_role( $wp_roles->role_names[ $premier ] ) : __( 'No role', 'aiforya-multi-author' ); } $c = $charge[ $user->ID ] ?? [ 'total' => 0, 'approved' => 0, 'published' => 0 ]; ?>
ID, 28, '', '', [ 'style' => 'border-radius:50%;' ] ); ?> display_name ); ?>