WordPress.org

Make WordPress Core

Opened 8 years ago

Last modified 2 months ago

#11159 reopened defect (bug)

WP_SITEURL and bloginfo('siteurl') inconsistent, or WP_SITEURL should be defined

Reported by: anmari Owned by:
Milestone: Priority: normal
Severity: minor Version:
Component: General Keywords: WP_SITEURL constants has-patch
Focuses: Cc:

Description

The wordpress directory constant WP_SITEURL remains undefined if not defined in wp-config.php , although other constants referred to in http://codex.wordpress.org/Editing_wp-config.php do get defined in wp-settings.php. See from around line 109 and lines 228, 362, 370 etc onwards.

get_bloginfo('siteurl') defaults to get_bloginfo('home'). If a developer uses get_bloginfo('siteurl') and the wp install has wp_siteurl defined in the config file - the "wrong" url is returned from what the developer expects.

So while a developer can use other constants, they cannot reliably use WP_SITEURL. They must check for definition of WP_SITEURL and define WP_SITEURL themselves using 'wp_url', not 'siteurl', as that gives same as 'home', or always use bloginfo('wp-url') - slower.

See: general-template.php (in 2.9) lines 303 on has:

case 'url' :
case 'home' : DEPRECATED
case 'siteurl' :
DEPRECATED

$output = get_option('home');
break;

case 'wpurl' :

$output = get_option('siteurl');
break;

Surely
1) bloginfo('siteurl') even if deprecated, should call option('siteurl'), as per bloginfo('wp_url'), not 'home'
OR
2) WP_SITEURL (or WP_WPURL!!) should be defined in wp-settings if not defined in config

Attachments (3)

11159.patch (1.4 KB) - added by miyauchi 2 months ago.
Added tests for site_url() and WP_SITEURL
11159.2.patch (1.5 KB) - added by miyauchi 2 months ago.
11159.3.patch (1.5 KB) - added by miyauchi 2 months ago.

Download all attachments as: .zip

Change History (9)

#1 @scribu
8 years ago

  • Keywords needs-patch added
  • Milestone changed from Unassigned to Future Release

#2 @anmari
7 years ago

In wp 3.0.1 looks like default_constants.php should have :

if ( !defined('WP_SITEURL') )

define( 'WP_SITEURL', get_option('siteurl') );

either around line 40 or around line 71
to be consistent

#3 @nacin
7 years ago

  • Milestone Future Release deleted
  • Resolution set to invalid
  • Status changed from new to closed

WP_SITEURL and WP_HOME are short-circuit constants. By default they should not be defined, there's no reason to define them. They should NOT be used directly.

When defined, these trigger a filter on pre_option_home and pre_option_siteurl, to then force get_option() to return the constant's value.

#4 @jeffmikels
4 months ago

  • Resolution invalid deleted
  • Status changed from closed to reopened

This ticket should be reopened. The constants and the get_option are inconsistent again.

@miyauchi
2 months ago

Added tests for site_url() and WP_SITEURL

#5 @miyauchi
2 months ago

  • Keywords has-patch added; needs-patch removed

I added tests like following.

/**
 * @runInSeparateProcess
 * @preserveGlobalState disabled
 */
function test_wp_siteurl_constant() {
	define( 'WP_SITEURL', 'https://example.com' );
	$this->assertEquals( WP_SITEURL, site_url() );
}

Then this test failed.

1) Tests_URL::test_wp_siteurl_constant
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'https://example.com'
+'http://example.com'

Is this intentional?

Last edited 2 months ago by miyauchi (previous) (diff)

@miyauchi
2 months ago

@miyauchi
2 months ago

#6 @miyauchi
2 months ago

Following tests is passed.

	/**
	 * @runInSeparateProcess
	 * @preserveGlobalState disabled
	 */
	function test_wp_home_url_constant() {
		define( 'WP_HOME', 'https://example.com' );
		$this->assertEquals( WP_HOME, home_url() );
	}

But following is failed.

	/**
	 * @runInSeparateProcess
	 * @preserveGlobalState disabled
	 */
	function test_wp_siteurl_constant() {
		define( 'WP_SITEURL', 'https://example.com' );
		$this->assertEquals( WP_SITEURL, site_url() );
	}

And also, following will be passed.

$this->assertEquals( WP_SITEURL, get_option( 'siteurl' ) );
Note: See TracTickets for help on using tickets.