简体   繁体   中英

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

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.

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).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM