[wp-hackers] Possible bug with endpoints
Seamus Leahy
leahy at au.org
Fri May 18 15:28:25 GMT 2007
I think I have found a bug with rewrite endpoints, but I would like for
someone with more experience and knowledge to check it out since I am a
newbie at hacking WordPress.
When a rewrite endpoint is found, the query_var value for it is set to an
empty string which happens to also be what wp_query->get() returns for a
non-existent query_var.
(/wp-include/query.php) WP_query->get():
494 function get($query_var) {
495 if (isset($this->query_vars[$query_var])) {
496 return $this->query_vars[$query_var];
497 }
498
499 return '';
500 }
This next snippet of code is what I think is setting the endpoint value to
an empty string:
(/wp-include/rewrite.php) inside the function generate_rewrite_rules():
//build up an array of endpoint regexes to append => queries to append
if ($endpoints) {
$ep_query_append = array ();
foreach ($this->endpoints as $endpoint) {
//match everything after the endpoint name, but allow for [...]
$epmatch = $endpoint[1] . '(/(.*))?/?$';
//this will be appended on to the rest of the query for each dir
$epquery = '&' . $endpoint[1] . '=';
$ep_query_append[$epmatch] = array ( $endpoint[0], $epquery );
}
}
To get my tests to work, I changed the following line of:
$epquery = '&' . $endpoint[1] . '=';
to:
$epquery = '&' . $endpoint[1] . '='.$endpoint[1];
I created a test plugin and I did the testing with WP 2.2.
The plugin:
-----------------------------------------------------------------
<?php
/*
Plugin Name: Test Endpoint
Plugin URI:
Description:
Version: 1.0
Author: Seamus Leahy
*/
function TestEndpoint(){
add_action('init', 'TestEndpointInit');
add_action('template_redirect', 'TestEndpointRedirect');
}
function TestEndpointInit(){
global $wp_rewrite;
$wp_rewrite->add_endpoint("testendpoint", EP_ALL);
$wp_rewrite->flush_rules();
}
function TestEndpointRedirect(){
$my_var = get_query_var('testendpoint');
if (empty($my_var)){
return;
}
die( '<h1>We hit the endpoint: testendpoint!</h1>');
}
TestEndpoint();
?>
-----------------------------------------------------------------
The test:
1. Install the plugin and activate it
2. Go to an existing page, append to the URL "/testendpoint/", and go to
the new URL
- Expected results: " We hit the endpoint: testendpoint!"
- Actually results: The original page without the endpoint
3. Change the file /wp_include/rewrite.php as stated above
4. Repeat step 2
- Actually results: " We hit the endpoint: testendpoint!"
Seamus.
leahy at au.org | x220
More information about the wp-hackers
mailing list