wp/wp-includes/class-walker-category.php
changeset 9 177826044cd9
parent 7 cf61fcea0001
child 16 a86126ab1dd4
--- a/wp/wp-includes/class-walker-category.php	Mon Oct 14 18:06:33 2019 +0200
+++ b/wp/wp-includes/class-walker-category.php	Mon Oct 14 18:28:13 2019 +0200
@@ -35,7 +35,10 @@
 	 * @see Walker::$db_fields
 	 * @todo Decouple this
 	 */
-	public $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
+	public $db_fields = array(
+		'parent' => 'parent',
+		'id'     => 'term_id',
+	);
 
 	/**
 	 * Starts the list before the elements are added.
@@ -50,10 +53,11 @@
 	 *                       value is 'list'. See wp_list_categories(). Default empty array.
 	 */
 	public function start_lvl( &$output, $depth = 0, $args = array() ) {
-		if ( 'list' != $args['style'] )
+		if ( 'list' != $args['style'] ) {
 			return;
+		}
 
-		$indent = str_repeat("\t", $depth);
+		$indent  = str_repeat( "\t", $depth );
 		$output .= "$indent<ul class='children'>\n";
 	}
 
@@ -70,10 +74,11 @@
 	 *                       value is 'list'. See wp_list_categories(). Default empty array.
 	 */
 	public function end_lvl( &$output, $depth = 0, $args = array() ) {
-		if ( 'list' != $args['style'] )
+		if ( 'list' != $args['style'] ) {
 			return;
+		}
 
-		$indent = str_repeat("\t", $depth);
+		$indent  = str_repeat( "\t", $depth );
 		$output .= "$indent</ul>\n";
 	}
 
@@ -99,11 +104,13 @@
 		);
 
 		// Don't generate an element if the category name is empty.
-		if ( ! $cat_name ) {
+		if ( '' === $cat_name ) {
 			return;
 		}
 
-		$link = '<a href="' . esc_url( get_term_link( $category ) ) . '" ';
+		$atts         = array();
+		$atts['href'] = get_term_link( $category );
+
 		if ( $args['use_desc_for_title'] && ! empty( $category->description ) ) {
 			/**
 			 * Filters the category description for display.
@@ -113,11 +120,40 @@
 			 * @param string $description Category description.
 			 * @param object $category    Category object.
 			 */
-			$link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"';
+			$atts['title'] = strip_tags( apply_filters( 'category_description', $category->description, $category ) );
 		}
 
-		$link .= '>';
-		$link .= $cat_name . '</a>';
+		/**
+		 * Filters the HTML attributes applied to a category list item's anchor element.
+		 *
+		 * @since 5.2.0
+		 *
+		 * @param array   $atts {
+		 *     The HTML attributes applied to the list item's `<a>` element, empty strings are ignored.
+		 *
+		 *     @type string $href  The href attribute.
+		 *     @type string $title The title attribute.
+		 * }
+		 * @param WP_Term $category Term data object.
+		 * @param int     $depth    Depth of category, used for padding.
+		 * @param array   $args     An array of arguments.
+		 * @param int     $id       ID of the current category.
+		 */
+		$atts = apply_filters( 'category_list_link_attributes', $atts, $category, $depth, $args, $id );
+
+		$attributes = '';
+		foreach ( $atts as $attr => $value ) {
+			if ( ! empty( $value ) ) {
+				$value       = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
+				$attributes .= ' ' . $attr . '="' . $value . '"';
+			}
+		}
+
+		$link = sprintf(
+			'<a%s>%s</a>',
+			$attributes,
+			$cat_name
+		);
 
 		if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) {
 			$link .= ' ';
@@ -129,10 +165,11 @@
 			$link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $args['feed_type'] ) ) . '"';
 
 			if ( empty( $args['feed'] ) ) {
-				$alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"';
+				/* translators: %s: category name */
+				$alt = ' alt="' . sprintf( __( 'Feed for all posts filed under %s' ), $cat_name ) . '"';
 			} else {
-				$alt = ' alt="' . $args['feed'] . '"';
-				$name = $args['feed'];
+				$alt   = ' alt="' . $args['feed'] . '"';
+				$name  = $args['feed'];
 				$link .= empty( $args['title'] ) ? '' : $args['title'];
 			}
 
@@ -141,7 +178,7 @@
 			if ( empty( $args['feed_image'] ) ) {
 				$link .= $name;
 			} else {
-				$link .= "<img src='" . $args['feed_image'] . "'$alt" . ' />';
+				$link .= "<img src='" . esc_url( $args['feed_image'] ) . "'$alt" . ' />';
 			}
 			$link .= '</a>';
 
@@ -154,7 +191,7 @@
 			$link .= ' (' . number_format_i18n( $category->count ) . ')';
 		}
 		if ( 'list' == $args['style'] ) {
-			$output .= "\t<li";
+			$output     .= "\t<li";
 			$css_classes = array(
 				'cat-item',
 				'cat-item-' . $category->term_id,
@@ -162,10 +199,13 @@
 
 			if ( ! empty( $args['current_category'] ) ) {
 				// 'current_category' can be an array, so we use `get_terms()`.
-				$_current_terms = get_terms( $category->taxonomy, array(
-					'include' => $args['current_category'],
-					'hide_empty' => false,
-				) );
+				$_current_terms = get_terms(
+					$category->taxonomy,
+					array(
+						'include'    => $args['current_category'],
+						'hide_empty' => false,
+					)
+				);
 
 				foreach ( $_current_terms as $_current_term ) {
 					if ( $category->term_id == $_current_term->term_id ) {
@@ -175,7 +215,7 @@
 					}
 					while ( $_current_term->parent ) {
 						if ( $category->term_id == $_current_term->parent ) {
-							$css_classes[] =  'current-cat-ancestor';
+							$css_classes[] = 'current-cat-ancestor';
 							break;
 						}
 						$_current_term = get_term( $_current_term->parent, $category->taxonomy );
@@ -196,8 +236,9 @@
 			 * @param array  $args        An array of wp_list_categories() arguments.
 			 */
 			$css_classes = implode( ' ', apply_filters( 'category_css_class', $css_classes, $category, $depth, $args ) );
+			$css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : '';
 
-			$output .=  ' class="' . $css_classes . '"';
+			$output .= $css_classes;
 			$output .= ">$link\n";
 		} elseif ( isset( $args['separator'] ) ) {
 			$output .= "\t$link" . $args['separator'] . "\n";
@@ -220,8 +261,9 @@
 	 *                       to output. See wp_list_categories(). Default empty array.
 	 */
 	public function end_el( &$output, $page, $depth = 0, $args = array() ) {
-		if ( 'list' != $args['style'] )
+		if ( 'list' != $args['style'] ) {
 			return;
+		}
 
 		$output .= "</li>\n";
 	}