morleyc
morleyc

Reputation: 2451

WordPress rewrite URL to access plugin page

Hi i am trying to access my plugin via a custome URL but i am unable to get the plugin to redirect, it just comes up 404 page not found, whereas what i want is page.php to be called instead. My plugin code is below (activate and deactivate functions of the plugin):

register_activation_hook(__FILE__,'activate');
register_deactivation_hook(__FILE__,'deactivate');

function setRewriteRules()
{
    add_rewrite_rule( 'plugin-url/$', '/wp-content/plugins/my-plugin/page.php', 'top' );
}

function activate() 
{       
    setRewriteRules();

    global $wp_rewrite;
    $wp_rewrite->flush_rules(true);  

}

function deactivate()
{
    global $wp_rewrite;
    $wp_rewrite->flush_rules(true);  
}

Any ideas what i am doing wrong?

Thanks in advance,

Chris

Upvotes: 0

Views: 3110

Answers (2)

Richard M
Richard M

Reputation: 14545

Rewrite rules that don't redirect to the Wordpress index.php file are written to the .htaccess file. I don't think they are ever stored in the database. So, looking at your code, if your .htaccess file is not writable when the plugin is activated, then your rewrite rule is never added.


As Amereservant wrote you need to add your rewrite rule in an init (or perhaps generate_rewrite_rules) action, as otherwise it'll get removed anytime the rules are flushed (because as described they are not stored in the database).

Upvotes: 1

Amereservant
Amereservant

Reputation: 807

First off, giving the path that way is a bad idea, because if for any reason any of that changes, your plugin/theme breaks.
Ozh makes a great suggestion under the section Hardcoded Paths as far as those go...

Secondly, you're most likely going to be better off using *query_vars*. Have a look at http://www.rlmseo.com/blog/passing-get-query-string-parameters-in-wordpress-url/ and possibly even http://planetozh.com/blog/2011/01/pretty-login-url-a-simple-rewrite-api-plugin-example/ for examples of how to do this.

Also checkout the WP_Rewrite Class as it has the best information on handling URL rewriting in WordPress.

Thirdly, you need to hook your setRewriteRules() function to the init hook, because the first time the rules are flushed, your rules will be removed.

So your code would look something like this (without any other corrections):

register_activation_hook(__FILE__,'activate');
register_deactivation_hook(__FILE__,'deactivate');
add_action('init', 'setRewriteRules');

function setRewriteRules()
{
    add_rewrite_rule( 'plugin-url/$', '/wp-content/plugins/my-plugin/page.php', 'top' );
}

function activate() 
{       
    setRewriteRules();

    global $wp_rewrite;
    $wp_rewrite->flush_rules(true);  

}

function deactivate()
{
    global $wp_rewrite;
    $wp_rewrite->flush_rules(true);  
}



Rewrite Rule Flushing

Here's some tips on flushing your rewrite rules...

  • Rewrite Rules are flushed automatically anytime you visit Settings > Permalink or anytime you make and save changes them in the Admin area.
  • Adding add_action('admin_init', 'deactivate'); might also be helpful so they are flushed anytime an Admin page is loaded.

Upvotes: 2

Related Questions