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;
}
} );