After reporting weirdness last week I finally sat down with a completely clean and virgin install of WordPress 2.3.2 and traced what happens when you make a permalink request for a non-existent URL.
Here are two sets of URLs to use as examples and context:
- These are valid URLs:
- http://site.org/archives/101
- http://site.org/page-name
- These are _not_ valid URLs:
- http://site.org/archivezorz/101
- http://site.org/favicon.ico
Valid URLs get parsed, the expected MySQL queries get executed, and the results are processed and returned to the browser. Normal. The problem is that invalid URLs that get sent through WordPress still result in a query like the following being executed on the database. What?
SELECT SQL_CALC_FOUND_ROWS test_posts.* FROM test_posts WHERE 1=1 AND post_type = 'post' AND (post_status = 'pub
lish' OR post_status = 'private') ORDER BY post_date DESC LIMIT 0, 10
That is, even after a URL is sent through WP->parse_request() and found to be invalid/404, WordPress marches on to WP->query_posts() and hits the database with a generic request for the X most recent posts. And because this is executed for every 404, it actually results in a lot of database activity.
In most cases MySQL has cached the result, and so it poses a minimal load on the server. And even if the cache is stale, for most sites it’s not a particularly resource intensive query.
But, if you’ve got 350,000 rows in the posts table, it’s incredibly resource intensive to order all those posts on the post_date (datetime) column. I’ve seen hundreds of them pile up and take forever to complete after writes to the table. It’s sufferable if write activity on the posts table is very low, but that’s not something I want to hope for.
So my question to the wp-hackers community is: Do we actually want to execute that query for every 404 under normal circumstances? If not, is the following (or something like it) the stupidest solution?
In wp-includes/classes.php:
function query_posts() {
global $wp_the_query;
$this->build_query_string();
// return if the request URI is a 404
if( $this->did_permalink && $this->query_vars['error'] == '404' )
return;
$wp_the_query->query($this->query_vars);
}
The above works, but there’s probably a better way to write it.
Posted January 18, 2008 by Casey Bisson
Categories: Technology. Tags: 404, behavior, hacking, mysql, optimization, permalinks, wordpress.
1 Comment(s)
Comments RSS
TrackBack Identifier URI
User contributed tags for this post:
WWWPRIVATE.COM (217) - www.sexviwe.com (44) - wwwprivate (40) - sexviwe tv (27) - wwwprivate com (25) - wwwprivatecom (16) - WWWprivate,com (16) - wordpress (11) - sexviwetv (10) - wordpress query database (8) - wwwpribate.com (7) - wwwprivete.com (7) - parse_request wordpress (6) - sex viwe.com (5) - wordpress parse_request (5) - wordpress invalid url (5) - wordpress SQL_CALC_FOUND_ROWS (5) - wordpress too many queries (4) - wwwPRIVETE (4) - www.sexviwetv.com (4) - wordpress reduce queries (4) - 404 wordpress (4) - wwwprivate .com (4) - sexviwe.tv (4) - sexviwe.com (4) - wwwprivate.com. (4) - wwwprivati.com (4) - wwwpirivate com (4) - wordpress query_vars (4) - SQL_CALC_FOUND_ROWS wordpress (3) - query_posts blank page (3) - www.sexviwe.tv (3) - www.sex viwe com (3) - WordPress database error: [Query was empty] (3) - wwwpirivate.com (3) - wordpress queries (3) - invalid urls (3) - www.sexviwetv.net (3) - wordpress error query was empty for query (2) - wordpress media library mysql table (2) - www.sexviwetv.com.tr (2) - www.sexviwe tv (2) - www.sexviwe (2) - get query tag for wordpress 404 (2) - WordPress Invalid URLs = Extra Database Queries (2) - wwwprivate. com (2) - favicon 404 error wordpress (2) - sexviwetv.com (2) - sexviwe tv 2009 (2) - remove invalid url in comments wordpress (2) - 404 wordpress problem database (2) - wordpress media library database table (2) - WWWPRIBATE (2) - wordpress media database table (2) - http://www.sex viwe tv.com/ (2) - TV.com virgin (2) - wwwprivates,com (2) - wordpress database query (2) - www.sexviwe tv.com (2) - wordpress media library database (2) - wordpress database 404 (2) - WWWPRIVATE.,COM (2) - database for wordpress (2) - google.fr @wwwprivate (2) - viwe tv (2) - WordPress database error Query was empty for query made (2) - wordpress reducing 404 errors (2) - WordPress database error Query was empty for query made by trackback (2) - wwwprivati (2) - wordpress database queries (2) - reduce wordpress queries (2) - http//wwwprivate.com (2) - WordPress database error Query was empty for query (2) - why is wordpress executing so many queries (2) - wordpress permalinks database (2) - wordpress query_posts blank page (2) - wordpress query url (2) - WordPress database error Query was empty (2) - sex s invalid (2) - wordpress reduce mysql query (2) - how to reduce wordpress queries (2) - wordpress query_posts post_type=comment (1) - sex tv urls (1) - 404 media library wordpress (1) - favicon creating wordpress 404 post errors (1) - Invalid URL wordpress.com (1) - wordpress media wrong url (1) - wordpress 404 mysql query (1) - wordpress query media library (1) - sex viwe. tv (1) - sex vs invalid photo (1) - wordpress feed return 404 error (1) - sex viwe viedo (1) - media library wordpress images URL error (1) - wordpress feed error Invalid URL (1) - wordpress post name database (1) - wordpress execute too many queries to the database (1) - wordpress database media (1) - wordpress query_posts private pages (1) - db query in wordpress (1) - request url not found wordpress (1) - wwwprivato,com (1) - media library 404 wordpress (1) - customers wordpress media wrong url (1) - technorati url invalid wordpress url (1) - wordpress hangs (1) -
Hi,
I found your post interesting and have implemented your code, but it does not seem to work on my version of wordpress.
The problem I am trying to solve is showing blank screen when invalid URL is entered.
I am using permalinks and here is what i would like:
I have a site: http://www.mysite.com/myblog/
If I type in address bar the following:
http://www.mysite.com/myblog/somecrap
This returns blank page.
I have found out that the SQL query is built and posts table read with “somecrap” as post name.
The number of affected rows returned is zero, but in classes.php the error is cleared (there is a comment in the code saying that as there is ’something’ in the url, they should clear the error) and hence the above code never executes.
What I would expect to happen is that when no posts is returned as a result of this query, I am shown “post not found” or similar message.
I do not really know php and even less on how in wordpress all hangs together, and am a bit concerned if I put some changes (such as condition on number of rows returned == 0 instead of checking for error, then that I will damage some other bits of wordpress such as posting, searching categories etc.
Do you have any idea what I could do?
Many thanks,
Sandra