The path should just start with wp-content because the generated rewrite rule (which would be added to your .htaccess) is relative to your WordPress installation directory:
function addCheckoutRedirect() {
add_rewrite_rule(
\'tradeIns\', // I intentionally removed the caret (^)
\'wp-content/plugins/pluginNake/templates/checkout.php\',
\'top\'
);
}
And here\'s how your .htaccess file may look like after the addition of the above "non index.php" rule: (in this example, WordPress is installed in the root directory; hence the RewriteBase is /)
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
# WordPress automatically added the caret (^), and the slash (/) before wp-content
RewriteRule ^tradeIns /wp-content/plugins/pluginNake/templates/checkout.php [QSA,L]
...
# END WordPress
Don\'t forget to flush the rewrite rules — just visit the permalink settings page.
Alternate Option
Create a standard Page (post of the page type), give it the slug tradeIns and use the page_template hook to load the checkout.php page when the tradeIns page is being requested.
add_filter( \'page_template\', function ( $template ) {
return is_page( \'tradeIns\' )
? \'/full/path/to/plugins/pluginNake/templates/checkout.php\'
: $template;
} );
Using this option gives you the advantage that you don\'t need any custom rewrite rules or the need to set your plugin\'s checkout.php as a custom Page template.
But the final decision is yours; just use whichever option is best for your specific needs.
Another Option: Completely Dynamic URL
Which means you don\'t need any custom rewrite rules and no need to create any Pages.
And this example uses the parse_request hook, but you may also use the wp hook or a similar hook. However, when using the wp hook (or any hooks where WordPress already sent the headers), you would want to call status_header( 200 ); to announce a 200 HTTP status header. And that is to prevent a "not found"/404 error since the path (tradeIns in the example below) doesn\'t actually exist (not a WordPress Page, etc.).
add_action( \'parse_request\', function ( $wp ) {
if ( \'tradeIns\' === $wp->request ) { // the request is example.com/tradeIns
//status_header( 200 );
require_once \'/full/path/to/plugins/pluginNake/templates/checkout.php\';
exit;
}
} );