[wp-hackers] Bad assumption on creation of ABSPATH

Mike Schinkel mikeschinkel at gmail.com
Thu Nov 13 21:15:27 GMT 2008


n/p. I know all too well what it is like to be highly frustrated by a prior
(arbitrary?) decision made in software and then the need to vent my
frustration somewhere that people who might be able to change it can here
me.

-Mike


-----Original Message-----
From: wp-hackers-bounces at lists.automattic.com
[mailto:wp-hackers-bounces at lists.automattic.com] On Behalf Of Chris
Sent: Thursday, November 13, 2008 4:08 PM
To: wp-hackers at lists.automattic.com
Subject: Re: [wp-hackers] Bad assumption on creation of ABSPATH

Right after I sent the second message, I came to much the same conclusion. I
realized that changing something so established creates more problems than
it fixes.

Thank you to both Otto and Mike for getting me back on the right track.

- Chris Jean

Mike Schinkel wrote:
> With 20+ years of programming experience I've learned many times over 
> that the direct reference of constants or global varibles causes 
> exactly these and many other kinds of problems. Changing ABSPATH now 
> after it has established itself would cause far more problems than 
> leaving it as is and documenting the concern. It's (almost) always 
> better to use functions for this kind of thing because the code in the 
> function can adjust in ways that a global constant cannot.
>
> IMO using ABSPATH and other global constants should be deprecated as a 
> best practice in favor of using functions like plugins_url() and 
> plugin_basename().
>
> JMTCW.
>
> -Mike Schinkel
> http://mikeschinkel.com/custom-wordpress-plugins/
>
>
> -----Original Message-----
> From: wp-hackers-bounces at lists.automattic.com
> [mailto:wp-hackers-bounces at lists.automattic.com] On Behalf Of Chris
> Sent: Thursday, November 13, 2008 2:38 PM
> To: wp-hackers at lists.automattic.com
> Subject: Re: [wp-hackers] Bad assumption on creation of ABSPATH
>
> That's good to know about the plugins_url() and plugin_basename()
functions.
> I still think that requiring the use of obscure functions (I would 
> have never guessed that such functions existed) and defines that have 
> been shown in the past to change, get deprecated, or be created is a 
> really roundabout way of avoiding a fix that could open up an easy way 
> to access the same data.
>
> Maybe ABSPATH wasn't intended to be used in the manner in which I'm 
> trying to use it, but the way that I'm trying to use it isn't wholly
unreasonable.
> Given the potential for change in paths starting with 2.6, I don't 
> think that my desired way to use ABSPATH is without reason either.
>
> - Chris Jean
>
> Otto wrote:
>   
>> Use this instead:
>> $this->_pluginURL = plugins_url(dirname(plugin_basename(__FILE__)));
>>
>> I don't have a particular problem with ABSPATH, as it's not meant to 
>> be used to determine a URL in any sense, only actual local paths to 
>> files. You should use other defined constants or functions to do that.
>> WP_PLUGIN_URL, for example.
>>
>>
>> On Thu, Nov 13, 2008 at 11:32 AM, Chris <gaarai at gaarai.com> wrote:
>>
>>   
>>     
>>> If you look at any of the high-level files of WordPress that handle 
>>> setting up the environment for WP, you'll find the following:
>>>
>>> define( 'ABSPATH', dirname(__FILE__) . '/' );
>>>
>>>
>>> Does it bother anyone else that all the ABSPATH defines presume to 
>>> always add a '/' as the directory delimiter?
>>>
>>> It took me a while to realize that this simple thing was the source 
>>> of so many of my woes. For example, consider the following code:
>>>
>>> $this->_pluginPath = dirname( __FILE__ ); $this->_pluginRelativePath 
>>> = str_replace( ABSPATH, '', $this->_pluginPath ); $this->_pluginURL 
>>> = get_option( 'home' ) . '/' .
>>> $this->_pluginRelativePath;
>>>
>>>
>>> This code should be a simple and straight-forward way for me to 
>>> always have access to the paths and URL bases that I need when 
>>> developing plugins, but it will fail horribly when run on Windows. 
>>> The
>>>       
> source? This portion:
>   
>>> str_replace( ABSPATH, '', $this->_pluginPath );
>>>
>>>
>>> Imagine this running on Windows:
>>>
>>> str_replace( "C:\xampp\htdocs\wordpress/", '', 
>>> "C:\xampp\htdocs\wordpress\wp-content\plugins\my-plugin" );
>>>
>>>
>>> Now I have a URL base of "
>>> http://localhost/wordpress/C:\xampp\htdocs\wordpress\wp-content\plug
>>> i 
>>> ns\my-plugin<http://localhost/wordpress/C:%5Cxampp%5Chtdocs%5Cwordpr
>>> e ss%5Cwp-content%5Cplugins%5Cmy-plugin>",
>>> which is not at all what I was wanting.
>>>
>>> The fix that I've been employing is as follows:
>>>
>>> $this->_pluginRelativePath = ltrim( str_replace( rtrim( ABSPATH, 
>>> '\\\/' ), '', $this->_pluginPath ), '\\\/' ); $this->_pluginURL = 
>>> get_option( 'home' ) . '/' .
>>> $this->_pluginRelativePath;
>>>
>>>
>>> Quite frankly, I find this to be unacceptable. Not only does it 
>>> leave me with a sloppy relative path by having a forward slash in 
>>> the middle of a backslash delimited path, but it also requires way 
>>> too much
>>>       
> work to derive.
>   
>>> I think most people would agree that my original code is much more 
>>> understandable and solid.
>>>
>>> Basically, I find a number of issues created by simply placing a 
>>> forward slash at the end of the ABSPATH:
>>>
>>>   * Makes being compatible with Windows hosts that much harder.
>>>   * Puts unnecessary burden on plugin and theme developers. I'm sure
>>>     that we can all agree that making things easier for theme and
>>>     plugin developers is good for everyone.
>>>
>>> People may argue that I can simply use the numerous defines to 
>>> construct my needed paths and url bases, but that would have its own
>>>       
> problems:
>   
>>>   * If I rely on the defines, then my code suddenly has dependency
>>>     issues and can break depending on what version of WP it is 
>>> running
>>>       
> on.
>   
>>>   * The beauty of my original code is that it is highly adaptable. No
>>>     matter what type of folder structure, file migration, or
>>>     file/directory renaming they do, the code will always know where
>>>     it is and what URL will point to it. If I use defines and my
>>>     plugin's name for generating a path and the user renames my plugin
>>>     or puts it in a different folder, my code breaks. Sure, I can
>>>     insulate against that by doing a lot of logic code, but that is a
>>>     lot of work to do just to make sure that I have the right path.
>>>
>>> Sorry for my verbosity, I just wanted to make it clear that a 
>>> seemingly simple thing can create a large array of issues.
>>>
>>> I really should have brought this up before as a fix may have been 
>>> put in place for 2.7. Oh well... Here's hoping for a fix in the next
>>>       
> release.
>   
>>> - Chris Jean
>>> _______________________________________________
>>> wp-hackers mailing list
>>> wp-hackers at lists.automattic.com
>>> http://lists.automattic.com/mailman/listinfo/wp-hackers
>>>
>>>     
>>>       
>> _______________________________________________
>> wp-hackers mailing list
>> wp-hackers at lists.automattic.com
>> http://lists.automattic.com/mailman/listinfo/wp-hackers
>>
>>   
>>     
> _______________________________________________
> wp-hackers mailing list
> wp-hackers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-hackers
>
> _______________________________________________
> wp-hackers mailing list
> wp-hackers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-hackers
>
>   
_______________________________________________
wp-hackers mailing list
wp-hackers at lists.automattic.com
http://lists.automattic.com/mailman/listinfo/wp-hackers



More information about the wp-hackers mailing list