diff --git a/src/wp-includes/class-wp-theme.php b/src/wp-includes/class-wp-theme.php
index 6952c59bda..d7cf008a59 100644
--- a/src/wp-includes/class-wp-theme.php
+++ b/src/wp-includes/class-wp-theme.php
@@ -1385,6 +1385,18 @@ final class WP_Theme implements ArrayAccess {
 			}
 		}
 
+		/*
+		 * Sort post templates by their translated, human-readable template name
+		 * instead of by filename or slug.
+		 */
+		foreach ( array_keys( $post_templates ) as $type ) {
+			if ( ! is_array( $post_templates[ $type ] ) ) {
+				continue;
+			}
+
+			uasort( $post_templates[ $type ], 'strnatcasecmp' );
+		}
+
 		return $post_templates;
 	}
 
diff --git a/tests/phpunit/data/themedir1/page-templates/template-a-zebra.php b/tests/phpunit/data/themedir1/page-templates/template-a-zebra.php
new file mode 100644
index 0000000000..a5824664c7
--- /dev/null
+++ b/tests/phpunit/data/themedir1/page-templates/template-a-zebra.php
@@ -0,0 +1,5 @@
+<?php
+/*
+   Template Name: Zebra Template
+ */
+?>
diff --git a/tests/phpunit/data/themedir1/page-templates/template-z-alpha.php b/tests/phpunit/data/themedir1/page-templates/template-z-alpha.php
new file mode 100644
index 0000000000..40a1e24c4b
--- /dev/null
+++ b/tests/phpunit/data/themedir1/page-templates/template-z-alpha.php
@@ -0,0 +1,5 @@
+<?php
+/*
+   Template Name: Alpha Template
+ */
+?>
diff --git a/tests/phpunit/tests/theme/wpTheme.php b/tests/phpunit/tests/theme/wpTheme.php
index a06fba32c5..6803696867 100644
--- a/tests/phpunit/tests/theme/wpTheme.php
+++ b/tests/phpunit/tests/theme/wpTheme.php
@@ -348,6 +348,35 @@ class Tests_Theme_wpTheme extends WP_UnitTestCase {
 		$this->assertCount( 2, $filter->get_events(), 'Should only be 4, as second run should not be cached' );
 	}
 
+	/**
+	 * @ticket 49194
+	 *
+	 * @covers WP_Theme::get_post_templates
+	 */
+	public function test_get_post_templates_should_sort_templates_by_template_name() {
+		$theme = new WP_Theme( 'page-templates', $this->theme_root );
+
+		$post_templates = $theme->get_post_templates();
+
+		$this->assertArrayHasKey( 'page', $post_templates );
+
+		$actual = array_intersect_key(
+			$post_templates['page'],
+			array(
+				'template-z-alpha.php' => true,
+				'template-a-zebra.php' => true,
+			)
+		);
+
+		$this->assertSame(
+			array(
+				'template-z-alpha.php' => 'Alpha Template',
+				'template-a-zebra.php' => 'Zebra Template',
+			),
+			$actual
+		);
+	}
+
 	/**
 	 * Test get_files for an existing theme.
 	 *
