diff --git src/wp-includes/meta.php src/wp-includes/meta.php
index c0430f7..36d6d1d 100644
--- src/wp-includes/meta.php
+++ src/wp-includes/meta.php
@@ -945,12 +945,13 @@ class WP_Meta_Query {
 	 * Constructor.
 	 *
 	 * @since 3.2.0
-	 * @since 4.2.0 Introduced the `$name` parameter, for improved `$orderby` support in the parent query.
+	 * @since 4.2.0 Introduced support for naming query clauses by associative array keys.
 	 *
 	 * @access public
 	 *
 	 * @param array $meta_query {
-	 *     Array of meta query clauses.
+	 *     Array of meta query clauses. First-order clauses may use strings for array keys, in order to reference
+	 *     the clause in the 'orderby' parameter of the parent query.
 	 *
 	 *     @type string $relation Optional. The MySQL keyword used to join
 	 *                            the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'.
@@ -967,8 +968,6 @@ class WP_Meta_Query {
 	 *                               comparisons. Accepts 'NUMERIC', 'BINARY', 'CHAR', 'DATE',
 	 *                               'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', or 'UNSIGNED'.
 	 *                               Default is 'CHAR'.
-	 *         @type string $name    Optional. A unique identifier for the clause. If provided, `$name` can be
-	 *                               referenced in the `$orderby` parameter of the parent query.
 	 *     }
 	 * }
 	 */
@@ -1016,14 +1015,14 @@ class WP_Meta_Query {
 					unset( $query['value'] );
 				}
 
-				$clean_queries[] = $query;
+				$clean_queries[ $key ] = $query;
 
 			// Otherwise, it's a nested query, so we recurse.
 			} else {
 				$cleaned_query = $this->sanitize_query( $query );
 
 				if ( ! empty( $cleaned_query ) ) {
-					$clean_queries[] = $cleaned_query;
+					$clean_queries[ $key ] = $cleaned_query;
 				}
 			}
 		}
@@ -1270,7 +1269,7 @@ class WP_Meta_Query {
 
 				// This is a first-order clause.
 				if ( $this->is_first_order_clause( $clause ) ) {
-					$clause_sql = $this->get_sql_for_clause( $clause, $query );
+					$clause_sql = $this->get_sql_for_clause( $clause, $query, $key );
 
 					$where_count = count( $clause_sql['where'] );
 					if ( ! $where_count ) {
@@ -1330,7 +1329,7 @@ class WP_Meta_Query {
 	 *     @type string $where SQL fragment to append to the main WHERE clause.
 	 * }
 	 */
-	public function get_sql_for_clause( &$clause, $parent_query ) {
+	public function get_sql_for_clause( &$clause, $parent_query, $clause_key = '' ) {
 		global $wpdb;
 
 		$sql_chunks = array(
@@ -1392,8 +1391,11 @@ class WP_Meta_Query {
 		$clause['cast'] = $meta_type;
 
 		// Store the clause in our flat array.
-		$clause_name = isset( $clause['name'] ) ? $clause['name'] : $clause['alias'];
-		$this->clauses[ $clause_name ] =& $clause;
+		if ( ! $clause_key ) {
+			$clause_key = $clause['alias'];
+		}
+
+		$this->clauses[ $clause_key ] =& $clause;
 
 		// Next, build the WHERE clause.
 
@@ -1471,7 +1473,7 @@ class WP_Meta_Query {
 	}
 
 	/**
-	 * Get a flattened list of sanitized meta clauses, indexed by clause 'name'.
+	 * Get a flattened list of sanitized meta clauses.
 	 *
 	 * This array should be used for clause lookup, as when the table alias and CAST type must be determined for
 	 * a value of 'orderby' corresponding to a meta clause.
diff --git src/wp-includes/query.php src/wp-includes/query.php
index 3c1b0c2..c65152e 100644
--- src/wp-includes/query.php
+++ src/wp-includes/query.php
@@ -1497,11 +1497,14 @@ class WP_Query {
 	 *     @type int          $offset                  The number of posts to offset before retrieval.
 	 *     @type string       $order                   Designates ascending or descending order of posts. Default 'DESC'.
 	 *                                                 Accepts 'ASC', 'DESC'.
-	 *     @type string       $orderby                 Sort retrieved posts by parameter. One or more options can be
+	 *     @type string|array $orderby                 Sort retrieved posts by parameter. One or more options can be
 	 *                                                 passed. To use 'meta_value', or 'meta_value_num',
-	 *                                                 'meta_key=keyname' must be also be defined. Default 'date'.
-	 *                                                 Accepts 'none', 'name', 'author', 'date', 'title', 'modified',
-	 *                                                 'menu_order', 'parent', 'ID', 'rand', 'comment_count'.
+	 *                                                 'meta_key=keyname' must be also be defined. To sort by a
+	 *                                                 specific `$meta_query` clause, use that clause's array key.
+	 *                                                 Default 'date'. Accepts 'none', 'name', 'author', 'date',
+	 *                                                 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand',
+	 *                                                 'comment_count', 'meta_value', 'meta_value_num', and the
+	 *                                                 array keys of `$meta_query`.
 	 *     @type int          $p                       Post ID.
 	 *     @type int          $page                    Show the number of posts that would show up on page X of a
 	 *                                                 static front page.
diff --git tests/phpunit/tests/query/metaQuery.php tests/phpunit/tests/query/metaQuery.php
index 2eff8eb..d34dc01 100644
--- tests/phpunit/tests/query/metaQuery.php
+++ tests/phpunit/tests/query/metaQuery.php
@@ -1562,7 +1562,7 @@ class Tests_Query_MetaQuery extends WP_UnitTestCase {
 	/**
 	 * @ticket 31045
 	 */
-	public function test_orderby_name() {
+	public function test_orderby_clause_key() {
 		$posts = $this->factory->post->create_many( 3 );
 		add_post_meta( $posts[0], 'foo', 'aaa' );
 		add_post_meta( $posts[1], 'foo', 'zzz' );
@@ -1571,13 +1571,12 @@ class Tests_Query_MetaQuery extends WP_UnitTestCase {
 		$q = new WP_Query( array(
 			'fields' => 'ids',
 			'meta_query' => array(
-				array(
-					'name' => 'foo_name',
+				'foo_key' => array(
 					'key' => 'foo',
 					'compare' => 'EXISTS',
 				),
 			),
-			'orderby' => 'foo_name',
+			'orderby' => 'foo_key',
 			'order' => 'DESC',
 		) );
 
@@ -1587,7 +1586,7 @@ class Tests_Query_MetaQuery extends WP_UnitTestCase {
 	/**
 	 * @ticket 31045
 	 */
-	public function test_orderby_name_as_secondary_sort() {
+	public function test_orderby_clause_key_as_secondary_sort() {
 		$p1 = $this->factory->post->create( array(
 			'post_date' => '2015-01-28 03:00:00',
 		) );
@@ -1605,15 +1604,14 @@ class Tests_Query_MetaQuery extends WP_UnitTestCase {
 		$q = new WP_Query( array(
 			'fields' => 'ids',
 			'meta_query' => array(
-				array(
-					'name' => 'foo_name',
+				'foo_key' => array(
 					'key' => 'foo',
 					'compare' => 'EXISTS',
 				),
 			),
 			'orderby' => array(
 				'post_date' => 'asc',
-				'foo_name' => 'asc',
+				'foo_key' => 'asc',
 			),
 		) );
 
@@ -1623,7 +1621,7 @@ class Tests_Query_MetaQuery extends WP_UnitTestCase {
 	/**
 	 * @ticket 31045
 	 */
-	public function test_orderby_more_than_one_name() {
+	public function test_orderby_more_than_one_clause_key() {
 		$posts = $this->factory->post->create_many( 3 );
 
 		add_post_meta( $posts[0], 'foo', 'jjj' );
@@ -1636,20 +1634,18 @@ class Tests_Query_MetaQuery extends WP_UnitTestCase {
 		$q = new WP_Query( array(
 			'fields' => 'ids',
 			'meta_query' => array(
-				array(
-					'name' => 'foo_name',
+				'foo_key' => array(
 					'key' => 'foo',
 					'compare' => 'EXISTS',
 				),
-				array(
-					'name' => 'bar_name',
+				'bar_key' => array(
 					'key' => 'bar',
 					'compare' => 'EXISTS',
 				),
 			),
 			'orderby' => array(
-				'foo_name' => 'asc',
-				'bar_name' => 'desc',
+				'foo_key' => 'asc',
+				'bar_key' => 'desc',
 			),
 		) );
 
