diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php
index 36146132d7..77aaf718b1 100644
--- a/src/wp-includes/functions.php
+++ b/src/wp-includes/functions.php
@@ -1899,7 +1899,8 @@ function wp_nonce_field( $action = -1, $name = '_wpnonce', $referer = true, $ech
* @return string Referer field HTML markup.
*/
function wp_referer_field( $echo = true ) {
- $referer_field = '';
+ $request_url = remove_query_arg( '_wp_http_referer' );
+ $referer_field = '';
if ( $echo ) {
echo $referer_field;
diff --git a/tests/phpunit/tests/functions/wpRefererField.php b/tests/phpunit/tests/functions/wpRefererField.php
index d0642f4088..6442e7a0b9 100644
--- a/tests/phpunit/tests/functions/wpRefererField.php
+++ b/tests/phpunit/tests/functions/wpRefererField.php
@@ -29,4 +29,50 @@ class Tests_Functions_wpRefererField extends WP_UnitTestCase {
$this->assertSame( '', wp_referer_field( false ) );
}
+
+ /**
+ * Tests that the echo argument is respected.
+ *
+ * @ticket 54106
+ *
+ * @dataProvider data_wp_referer_field_should_respect_echo_arg
+ *
+ * @param mixed $echo Whether to echo or return the referer field.
+ */
+ public function test_wp_referer_field_should_respect_echo_arg( $echo ) {
+ $actual = $echo ? get_echo( 'wp_referer_field' ) : wp_referer_field( false );
+
+ $this->assertSame( '', $actual );
+ }
+
+ /**
+ * Data provider for test_wp_referer_field_should_respect_echo_arg().
+ *
+ * @return array
+ */
+ public function data_wp_referer_field_should_respect_echo_arg() {
+ return array(
+ 'true' => array( true ),
+ '(int) 1' => array( 1 ),
+ '(string) "1"' => array( '1' ),
+ 'false' => array( false ),
+ 'null' => array( null ),
+ '(int) 0' => array( 0 ),
+ '(string) "0"' => array( '0' ),
+ );
+ }
+
+ /**
+ * @ticket 54106
+ */
+ public function test_wp_referer_field_with_referer() {
+ $old_request_uri = $_SERVER['REQUEST_URI'];
+ $_SERVER['REQUEST_URI'] = 'edit.php?_wp_http_referer=edit.php';
+
+ $actual = wp_referer_field( false );
+
+ $_SERVER['REQUEST_URI'] = $old_request_uri;
+
+ $this->assertSame( '', $actual );
+ }
}