Skip to content

Commit ad87612

Browse files
committed
Users: A11y: Improve title attributes in author link functions.
Remove the title attribute from `the_author_posts_link()` and related functions, retaining text for use in `the_author_posts_link` filter, and add parameter to disable title attributes in `the_author_link()`. Default behavior will still differentiate the two links, but adds the option to remove all title attributes. Props sabernhardt, alh0319, adnanlimdi, audrasjb, joedolson. Fixes #62835. See #26559. git-svn-id: https://develop.svn.wordpress.org/trunk@61745 602fd350-edb4-49c9-b593-d223f7449a82
1 parent d745af5 commit ad87612

3 files changed

Lines changed: 66 additions & 55 deletions

File tree

src/wp-includes/author-template.php

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -229,24 +229,29 @@ function the_author_meta( $field = '', $user_id = false ) {
229229
* the author's name.
230230
*
231231
* @since 3.0.0
232+
* @since 7.0.0 Added `$use_title_attr` parameter.
232233
*
233234
* @global WP_User $authordata The current author's data.
234235
*
236+
* @param bool $use_title_attr Optional. Whether to add a title attribute.
237+
* Default true.
235238
* @return string An HTML link if the author's URL exists in user meta,
236239
* otherwise the result of get_the_author().
237240
*/
238-
function get_the_author_link() {
241+
function get_the_author_link( $use_title_attr = true ) {
239242
if ( get_the_author_meta( 'url' ) ) {
240243
global $authordata;
241244

242245
$author_url = get_the_author_meta( 'url' );
243246
$author_display_name = get_the_author();
244247

248+
/* translators: %s: Author's display name. */
249+
$author_title = sprintf( __( 'Visit %s’s website' ), $author_display_name );
250+
245251
$link = sprintf(
246-
'<a href="%1$s" title="%2$s" rel="author external">%3$s</a>',
252+
'<a href="%1$s"%2$s rel="author external">%3$s</a>',
247253
esc_url( $author_url ),
248-
/* translators: %s: Author's display name. */
249-
esc_attr( sprintf( __( 'Visit %s&#8217;s website' ), $author_display_name ) ),
254+
$use_title_attr ? ' title="' . esc_attr( $author_title ) . '"' : '',
250255
$author_display_name
251256
);
252257

@@ -274,9 +279,13 @@ function get_the_author_link() {
274279
* @link https://developer.wordpress.org/reference/functions/the_author_link/
275280
*
276281
* @since 2.1.0
282+
* @since 7.0.0 Added `$use_title_attr` parameter.
283+
*
284+
* @param bool $use_title_attr Optional. Whether to add a title attribute.
285+
* Default true.
277286
*/
278-
function the_author_link() {
279-
echo get_the_author_link();
287+
function the_author_link( $use_title_attr = true ) {
288+
echo get_the_author_link( $use_title_attr );
280289
}
281290

282291
/**
@@ -310,6 +319,7 @@ function the_author_posts() {
310319
* Returns an HTML-formatted link using get_author_posts_url().
311320
*
312321
* @since 4.4.0
322+
* @since 7.0.0 Removed title attribute.
313323
*
314324
* @global WP_User $authordata The current author's data.
315325
*
@@ -322,22 +332,27 @@ function get_the_author_posts_link() {
322332
return '';
323333
}
324334

335+
$author = get_the_author();
336+
/* translators: %s: Author's display name. */
337+
$title = sprintf( __( 'Posts by %s' ), $author );
338+
325339
$link = sprintf(
326-
'<a href="%1$s" title="%2$s" rel="author">%3$s</a>',
340+
'<a href="%1$s" rel="author">%2$s</a>',
327341
esc_url( get_author_posts_url( $authordata->ID, $authordata->user_nicename ) ),
328-
/* translators: %s: Author's display name. */
329-
esc_attr( sprintf( __( 'Posts by %s' ), get_the_author() ) ),
330-
get_the_author()
342+
$author
331343
);
332344

333345
/**
334346
* Filters the link to the author page of the author of the current post.
335347
*
336348
* @since 2.9.0
349+
* @since 7.0.0 Added `$author` and `$title` parameters.
337350
*
338-
* @param string $link HTML link.
351+
* @param string $link HTML link.
352+
* @param string $author Author's display name.
353+
* @param string $title Text originally used for a title attribute.
339354
*/
340-
return apply_filters( 'the_author_posts_link', $link );
355+
return apply_filters( 'the_author_posts_link', $link, $author, $title );
341356
}
342357

343358
/**
@@ -536,10 +551,8 @@ function wp_list_authors( $args = '' ) {
536551
}
537552

538553
$link = sprintf(
539-
'<a href="%1$s" title="%2$s">%3$s</a>',
554+
'<a href="%1$s">%2$s</a>',
540555
esc_url( get_author_posts_url( $author->ID, $author->user_nicename ) ),
541-
/* translators: %s: Author's display name. */
542-
esc_attr( sprintf( __( 'Posts by %s' ), $author->display_name ) ),
543556
$name
544557
);
545558

tests/phpunit/tests/user/getTheAuthorPostsLink.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ public function test_get_the_author_posts_link_no_permalinks() {
5151
$url = sprintf( 'http://%1$s/?author=%2$s', WP_TESTS_DOMAIN, $author->ID );
5252

5353
$this->assertStringContainsString( $url, $link );
54-
$this->assertStringContainsString( 'Posts by Test Author', $link );
5554
$this->assertStringContainsString( '>Test Author</a>', $link );
5655

5756
unset( $GLOBALS['authordata'] );
@@ -74,7 +73,6 @@ public function test_get_the_author_posts_link_with_permalinks() {
7473
$this->set_permalink_structure( '' );
7574

7675
$this->assertStringContainsString( $url, $link );
77-
$this->assertStringContainsString( 'Posts by Test Author', $link );
7876
$this->assertStringContainsString( '>Test Author</a>', $link );
7977

8078
unset( $GLOBALS['authordata'] );

tests/phpunit/tests/user/wpListAuthors.php

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,18 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
8787

8888
public function test_wp_list_authors_default() {
8989
$expected['default'] =
90-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a></li>' .
91-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a></li>' .
92-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a></li>';
90+
'<li><a href="' . self::$user_urls[1] . '">bob</a></li>' .
91+
'<li><a href="' . self::$user_urls[2] . '">paul</a></li>' .
92+
'<li><a href="' . self::$user_urls[0] . '">zack</a></li>';
9393

9494
$this->assertSame( $expected['default'], wp_list_authors( array( 'echo' => false ) ) );
9595
}
9696

9797
public function test_wp_list_authors_orderby() {
9898
$expected['post_count'] =
99-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a></li>' .
100-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a></li>' .
101-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a></li>';
99+
'<li><a href="' . self::$user_urls[0] . '">zack</a></li>' .
100+
'<li><a href="' . self::$user_urls[1] . '">bob</a></li>' .
101+
'<li><a href="' . self::$user_urls[2] . '">paul</a></li>';
102102

103103
$this->assertSame(
104104
$expected['post_count'],
@@ -113,9 +113,9 @@ public function test_wp_list_authors_orderby() {
113113

114114
public function test_wp_list_authors_order() {
115115
$expected['id'] =
116-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a></li>' .
117-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a></li>' .
118-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a></li>';
116+
'<li><a href="' . self::$user_urls[2] . '">paul</a></li>' .
117+
'<li><a href="' . self::$user_urls[1] . '">bob</a></li>' .
118+
'<li><a href="' . self::$user_urls[0] . '">zack</a></li>';
119119

120120
$this->assertSame(
121121
$expected['id'],
@@ -131,9 +131,9 @@ public function test_wp_list_authors_order() {
131131

132132
public function test_wp_list_authors_optioncount() {
133133
$expected['optioncount'] =
134-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a> (2)</li>' .
135-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a> (3)</li>' .
136-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a> (1)</li>';
134+
'<li><a href="' . self::$user_urls[1] . '">bob</a> (2)</li>' .
135+
'<li><a href="' . self::$user_urls[2] . '">paul</a> (3)</li>' .
136+
'<li><a href="' . self::$user_urls[0] . '">zack</a> (1)</li>';
137137

138138
$this->assertSame(
139139
$expected['optioncount'],
@@ -180,10 +180,10 @@ public function test_wp_list_authors_exclude_admin() {
180180
);
181181

182182
$expected['exclude_admin'] =
183-
'<li><a href="' . get_author_posts_url( 1 ) . '" title="Posts by admin">admin</a></li>' .
184-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a></li>' .
185-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a></li>' .
186-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a></li>';
183+
'<li><a href="' . get_author_posts_url( 1 ) . '">admin</a></li>' .
184+
'<li><a href="' . self::$user_urls[1] . '">bob</a></li>' .
185+
'<li><a href="' . self::$user_urls[2] . '">paul</a></li>' .
186+
'<li><a href="' . self::$user_urls[0] . '">zack</a></li>';
187187

188188
$this->assertSame(
189189
$expected['exclude_admin'],
@@ -198,9 +198,9 @@ public function test_wp_list_authors_exclude_admin() {
198198

199199
public function test_wp_list_authors_show_fullname() {
200200
$expected['show_fullname'] =
201-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob reno</a></li>' .
202-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul norris</a></li>' .
203-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack moon</a></li>';
201+
'<li><a href="' . self::$user_urls[1] . '">bob reno</a></li>' .
202+
'<li><a href="' . self::$user_urls[2] . '">paul norris</a></li>' .
203+
'<li><a href="' . self::$user_urls[0] . '">zack moon</a></li>';
204204

205205
$this->assertSame(
206206
$expected['show_fullname'],
@@ -217,10 +217,10 @@ public function test_wp_list_authors_hide_empty() {
217217
$fred_id = self::$fred_id;
218218

219219
$expected['hide_empty'] =
220-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a></li>' .
221-
'<li><a href="' . get_author_posts_url( $fred_id ) . '" title="Posts by fred">fred</a></li>' .
222-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a></li>' .
223-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a></li>';
220+
'<li><a href="' . self::$user_urls[1] . '">bob</a></li>' .
221+
'<li><a href="' . get_author_posts_url( $fred_id ) . '">fred</a></li>' .
222+
'<li><a href="' . self::$user_urls[2] . '">paul</a></li>' .
223+
'<li><a href="' . self::$user_urls[0] . '">zack</a></li>';
224224

225225
$this->assertSame(
226226
$expected['hide_empty'],
@@ -235,9 +235,9 @@ public function test_wp_list_authors_hide_empty() {
235235

236236
public function test_wp_list_authors_echo() {
237237
$expected['echo'] =
238-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a></li>' .
239-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a></li>' .
240-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a></li>';
238+
'<li><a href="' . self::$user_urls[1] . '">bob</a></li>' .
239+
'<li><a href="' . self::$user_urls[2] . '">paul</a></li>' .
240+
'<li><a href="' . self::$user_urls[0] . '">zack</a></li>';
241241

242242
$this->expectOutputString( $expected['echo'] );
243243
wp_list_authors( array( 'echo' => true ) );
@@ -249,9 +249,9 @@ public function test_wp_list_authors_feed() {
249249
$url2 = get_author_feed_link( self::$user_ids[2] );
250250

251251
$expected['feed'] =
252-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a> (<a href="' . $url1 . '">link to feed</a>)</li>' .
253-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a> (<a href="' . $url2 . '">link to feed</a>)</li>' .
254-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a> (<a href="' . $url0 . '">link to feed</a>)</li>';
252+
'<li><a href="' . self::$user_urls[1] . '">bob</a> (<a href="' . $url1 . '">link to feed</a>)</li>' .
253+
'<li><a href="' . self::$user_urls[2] . '">paul</a> (<a href="' . $url2 . '">link to feed</a>)</li>' .
254+
'<li><a href="' . self::$user_urls[0] . '">zack</a> (<a href="' . $url0 . '">link to feed</a>)</li>';
255255

256256
$this->assertSame(
257257
$expected['feed'],
@@ -270,9 +270,9 @@ public function test_wp_list_authors_feed_image() {
270270
$url2 = get_author_feed_link( self::$user_ids[2] );
271271

272272
$expected['feed_image'] =
273-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a> <a href="' . $url1 . '"><img src="http://' . WP_TESTS_DOMAIN . '/path/to/a/graphic.png" style="border: none;" /></a></li>' .
274-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a> <a href="' . $url2 . '"><img src="http://' . WP_TESTS_DOMAIN . '/path/to/a/graphic.png" style="border: none;" /></a></li>' .
275-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a> <a href="' . $url0 . '"><img src="http://' . WP_TESTS_DOMAIN . '/path/to/a/graphic.png" style="border: none;" /></a></li>';
273+
'<li><a href="' . self::$user_urls[1] . '">bob</a> <a href="' . $url1 . '"><img src="http://' . WP_TESTS_DOMAIN . '/path/to/a/graphic.png" style="border: none;" /></a></li>' .
274+
'<li><a href="' . self::$user_urls[2] . '">paul</a> <a href="' . $url2 . '"><img src="http://' . WP_TESTS_DOMAIN . '/path/to/a/graphic.png" style="border: none;" /></a></li>' .
275+
'<li><a href="' . self::$user_urls[0] . '">zack</a> <a href="' . $url0 . '"><img src="http://' . WP_TESTS_DOMAIN . '/path/to/a/graphic.png" style="border: none;" /></a></li>';
276276

277277
$this->assertSame(
278278
$expected['feed_image'],
@@ -294,9 +294,9 @@ public function test_wp_list_authors_feed_type() {
294294
$url2 = get_author_feed_link( self::$user_ids[2], 'atom' );
295295

296296
$expected['feed_type'] =
297-
'<li><a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a> (<a href="' . $url1 . '">link to feed</a>)</li>' .
298-
'<li><a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a> (<a href="' . $url2 . '">link to feed</a>)</li>' .
299-
'<li><a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a> (<a href="' . $url0 . '">link to feed</a>)</li>';
297+
'<li><a href="' . self::$user_urls[1] . '">bob</a> (<a href="' . $url1 . '">link to feed</a>)</li>' .
298+
'<li><a href="' . self::$user_urls[2] . '">paul</a> (<a href="' . $url2 . '">link to feed</a>)</li>' .
299+
'<li><a href="' . self::$user_urls[0] . '">zack</a> (<a href="' . $url0 . '">link to feed</a>)</li>';
300300

301301
$this->assertSame(
302302
$expected['feed_type'],
@@ -312,9 +312,9 @@ public function test_wp_list_authors_feed_type() {
312312

313313
public function test_wp_list_authors_style() {
314314
$expected['style'] =
315-
'<a href="' . self::$user_urls[1] . '" title="Posts by bob">bob</a>, ' .
316-
'<a href="' . self::$user_urls[2] . '" title="Posts by paul">paul</a>, ' .
317-
'<a href="' . self::$user_urls[0] . '" title="Posts by zack">zack</a>';
315+
'<a href="' . self::$user_urls[1] . '">bob</a>, ' .
316+
'<a href="' . self::$user_urls[2] . '">paul</a>, ' .
317+
'<a href="' . self::$user_urls[0] . '">zack</a>';
318318

319319
$this->assertSame(
320320
$expected['style'],

0 commit comments

Comments
 (0)