2020use WP_REST_Request ;
2121use WP_REST_Response ;
2222use WP_REST_Server ;
23+ use WP_Term ;
2324use WP_User ;
2425
2526use function Asset_Loader \enqueue_asset ;
@@ -47,6 +48,7 @@ function bootstrap() : void {
4748 add_action ( 'pre_get_posts ' , __NAMESPACE__ . '\\action_pre_get_posts ' , 9999 );
4849 add_action ( 'wp ' , __NAMESPACE__ . '\\action_wp ' );
4950 add_action ( 'wp_insert_post ' , [ $ insert_post_handler , 'action_wp_insert_post ' ], 10 , 3 );
51+ add_action ( 'profile_update ' , __NAMESPACE__ . '\\update_author_term_name ' , 10 , 3 );
5052
5153 // Filters.
5254 add_filter ( 'wp_insert_post_data ' , [ $ insert_post_handler , 'filter_wp_insert_post_data ' ], 10 , 3 );
@@ -57,6 +59,61 @@ function bootstrap() : void {
5759 add_filter ( 'the_author ' , __NAMESPACE__ . '\\filter_the_author_for_rss ' );
5860 add_filter ( 'comment_moderation_recipients ' , __NAMESPACE__ . '\\filter_comment_moderation_recipients ' , 10 , 2 );
5961 add_filter ( 'comment_notification_recipients ' , __NAMESPACE__ . '\\filter_comment_notification_recipients ' , 10 , 2 );
62+ add_filter ( 'wp_insert_term_data ' , __NAMESPACE__ . '\\add_term_name ' , 10 , 3 );
63+ }
64+
65+ /**
66+ * Set term name to user display name on term creation.
67+ *
68+ * @param array{'name': string, 'slug': string, 'term_group': int} $data Term data.
69+ * @param string $taxonomy Taxonomy.
70+ * @param array{'alias_of': string, 'description': string, 'parent': int, 'slug': string} $args Term args
71+ *
72+ * @return array{'name': string, 'slug': string, 'term_group': int}
73+ */
74+ function add_term_name ( array $ data , string $ taxonomy , array $ args ) : array {
75+ if ( $ taxonomy !== TAXONOMY ) {
76+ return $ data ;
77+ }
78+ $ user_id = (int ) ( $ data ['slug ' ] ?? 0 );
79+ if ( $ user_id <= 0 ) {
80+ return $ data ;
81+ }
82+
83+ $ user = get_userdata ( $ user_id );
84+ if ( ! $ user instanceof WP_User ) {
85+ return $ data ;
86+ }
87+
88+ $ data ['name ' ] = $ user ->display_name ;
89+ return $ data ;
90+ }
91+
92+ /**
93+ * Sync author term name with user display name.
94+ *
95+ * @param int $user_id User ID.
96+ * @param WP_User $old_user_data Old user data.
97+ * @param array<string> $userdata User data.
98+ * @return void
99+ */
100+ function update_author_term_name ( int $ user_id , WP_User $ old_user_data , array $ userdata ) : void {
101+ // User doesn't exist in authorship taxonomy.
102+ $ term = get_term_by ( 'slug ' , (string ) $ user_id , TAXONOMY );
103+ if ( ! $ term instanceof WP_Term ) {
104+ return ;
105+ }
106+
107+ $ display_name = $ userdata ['display_name ' ] ?? null ;
108+
109+ // User display name hasn't changed.
110+ if ( $ term ->name === $ display_name ) {
111+ return ;
112+ }
113+
114+ wp_update_term ($ term ->term_id , TAXONOMY , [
115+ 'name ' => $ userdata ['display_name ' ],
116+ ]);
60117}
61118
62119/**
0 commit comments