[wp-hackers] Taking over URL space

Phillip Lord phillip.lord at newcastle.ac.uk
Wed Feb 29 13:07:45 UTC 2012



Thanks all for the comments. I have been trying these out, and with info
from the WPrewrite documentation but can't get them to work. 


My plugin (complete with debug printouts!) looks like below. I have the
template_redirect section working fine. I have a rule flusher on
wp_loaded. The codex mentions this not as a long term solution because
it's compute intensive. 

Then I have a generate_rewrite_rules filter. As far as I can tell it's
never been called. 

I would like to try the add_rewrite_rule/add_rewrite_tag method, but I
don't understand this. What are these two methods doing? 

Phil



add_action( 'wp_loaded','my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules(){
    print( time() + "\n" );
    print( "4: my flush rules\n" );
	$rules = get_option( 'rewrite_rules' );

	if ( ! isset( $rules['test'] ) ) {
        print( "2: isset\n" );
		global $wp_rewrite;
	   	$wp_rewrite->flush_rules();
	}
}


add_filter( 'generate_rewrite_rules','test_phil_insert_rewrite_rules' );

// Adding a new rule --- never called
function test_phil_insert_rewrite_rules( $wp_review )
{
    print( "insert rewrite rules\n" );
	$newrules = array 
        (
         "test" => 'index.php?test-plugin=1&hello-world=1',
         );
	
	return $newrules + $rules;
}



// this bit is working
add_filter( 'query_vars', 'test_query_vars' );

function test_query_vars( $query_vars ){
    print( "test_query_vars\n" );
    $query_vars[] = "test-plugin";
    $query_vars[] = "hello-world";

    return $query_vars;
}


// this bit handles the request and it is working
// as http://localhost/?test-plugin=1&hello-world=1 returns hello world
function test_plugin_hello(){
    print( "test_plugin_hello" );
    $test_plugin = (boolean) get_query_var( 'test-plugin' );
    $hello_world = (boolean) get_query_var( 'hello-world' );
    if( !$test_plugin ) return;

    print( "Hello World" );
    exit();
    
}
add_action( 'template_redirect', 'test_plugin_hello' );



Braydon <ronin at braydon.com> writes:

> Here is another way to have new rules without using add_rewrite_rule:
>
> add_action( 'generate_rewrite_rules', 'my_rewrite_rules' );
>
> function my_rewrite_rules(){
>     global $wp_rewrite;
>     $rules = array(
>         'myplugin/?$' => 'index.php?myplugin=1'
>     )
>     $wp_rewrite->rules =array_merge($rules,$wp_rewrite->rules);
> }
>
> For using extensions on p, something like this could work:
>
> add_action('parse_request','my_parse_request' );
>
> function my_parse_request( &$request ) {
>     $post_id = $request->query_vars['p'];
>     // check if the post id has an extension
>     // also check the "Accept:" header
>     // add a new query_var for the extension, and change "p" variable back to
> an id
> }
>
> However adding a new query_var for extension would be needed either way.
>
> add_filter( 'query_vars, 'my_query_vars' );
>
> function my_query_vars( $query_vars ){
>     $query_vars[] = 'myplugin';
>     $query_vars[] = 'ext';
>     return $query_vars;
> }
>
> And then at the template redirect check for both the myplugin and ext
> query_vars and then have your plugin handle those.
>
> On 02/21/2012 01:58 AM, Phillip Lord wrote:
>> I was wondering whether someone could give me pointers in the right
>> direction. I'm not after a complete solution! I was just hoping that
>> someone with more knowledge of wordpress could tell me if I am heading
>> in the right way.
>>
>> I wanted to write a new plugin which returns metadata about posts in a
>> variety of different ways. To do this, I need to use various parts of
>> the URL space, but I don't know how best to do this.
>>
>>
>> Essentially, I want to do three things.
>>
>> 1) I would like to be able to use bits of the URL space from top level.
>>     So, for a wordpress at
>>
>> http://mydomain.org.uk
>>
>> I would like to be able to serve all requests to..
>>
>> http://mydomain.org.uk/myplugin
>>
>> My initial idea was to achieve all this with rewrite rules, but
>> requiring users to modify .htaccess com. wp-rewrite seems the next
>> option -- I can just rewrite requests to this and underlying rewrite
>> plugin php?
>>
>>
>> 2) I want to add support for file extension based access. So for a
>> URL such as
>>
>> http://mydomain.org.uk/?p=46
>>
>> I'd like requests to
>>
>> http://mydomain.org.uk/?p=46.bib
>>
>> to be handled by my plugin, probably by sending the browser straight to
>> a URL of the http://mydomain.org.uk/myplugin. I am not sure how well
>> this would interact with pretty permalinks -- something of the form
>>
>> http://mydomain.org.uk/2012/02/02/mypost/
>>
>> looks daft with an extension
>> http://mydomain.org.uk/2012/02/02/mypost/.bib
>>
>> However, as far as I can see this is a similar problem to the last.
>>
>> 3)
>>
>> And, finally, I'd like to provide a content negotiated solution. So
>> requests to:
>>
>> http://mydomain.org.uk/?p=46
>>
>> will return different results depending on the content type in the
>> Accept: header of the request; again, this will probably be implemented
>> by forwarding the browser.
>>
>> This one seems to be the most taxing -- I can't do this with rewrite
>> rules because it is the same in all cases.
>>
>> Any pointers gratefully received!
>>
>> Phil
>>
>> _______________________________________________
>> wp-hackers mailing list
>> wp-hackers at lists.automattic.com
>> http://lists.automattic.com/mailman/listinfo/wp-hackers
>>
>> !DSPAM:4f436acf300322900114539!
>>

-- 
Phillip Lord,                           Phone: +44 (0) 191 222 7827
Lecturer in Bioinformatics,             Email: phillip.lord at newcastle.ac.uk
School of Computing Science,            http://homepages.cs.ncl.ac.uk/phillip.lord
Room 914 Claremont Tower,               skype: russet_apples
Newcastle University,                   msn: msn at russet.org.uk
NE1 7RU                                 twitter: phillord


More information about the wp-hackers mailing list