Search code examples
phpwordpressplugins

WP - Use file in plugin directory as custom Page Template?


Is it possible for a file in the plugin directory to be used as a custom Page Template?

Also, how do you make a plugin create a page?

I'm developing a plugin for a client based on a theme, he wants this plugin to make sales pages while being able to use his theme on the homepage. This is a product that I'm making for him to market so it needs to be automated all through the plugin.

Is this possible?

EDIT

I have the activation/deactivation hooks in my plugins main file, and it's not working. Here's the code:

$filename = __FILE__;

register_activation_hook($filename, 'superActivation');
register_deactivation_hook($filename, 'superDeactivation');

global $myFile; global $fh; global $stringData; global $filename;

$myFile = "testFile.txt";
$stringData = "Testing\n";
$fh = fopen($myFile, 'w') or die("can't open file");

function superActivation() {
    global $myFile; global $fh; global $stringData; global $filename;
    fwrite($fh, $stringData);
    fclose($fh);
}

function superDeactivation() {
    $myFile = "testFile.txt";
    unlink($myFile);
}

Solution

  • You can do this with the template_redirect hook. Here's my code to manually replace the template for a custom post type with one in the theme if there isn't one in the template folder. Put this in your plugin file and then put a folder underneath your plugin called themefiles with your default theme files.

    //Template fallback
    add_action("template_redirect", 'my_theme_redirect');
    
    function my_theme_redirect() {
        global $wp;
        $plugindir = dirname( __FILE__ );
    
        //A Specific Custom Post Type
        if ($wp->query_vars["post_type"] == 'product') {
            $templatefilename = 'single-product.php';
            if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
                $return_template = TEMPLATEPATH . '/' . $templatefilename;
            } else {
                $return_template = $plugindir . '/themefiles/' . $templatefilename;
            }
            do_theme_redirect($return_template);
    
        //A Custom Taxonomy Page
        } elseif ($wp->query_vars["taxonomy"] == 'product_categories') {
            $templatefilename = 'taxonomy-product_categories.php';
            if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
                $return_template = TEMPLATEPATH . '/' . $templatefilename;
            } else {
                $return_template = $plugindir . '/themefiles/' . $templatefilename;
            }
            do_theme_redirect($return_template);
    
        //A Simple Page
        } elseif ($wp->query_vars["pagename"] == 'somepagename') {
            $templatefilename = 'page-somepagename.php';
            if (file_exists(TEMPLATEPATH . '/' . $templatefilename)) {
                $return_template = TEMPLATEPATH . '/' . $templatefilename;
            } else {
                $return_template = $plugindir . '/themefiles/' . $templatefilename;
            }
            do_theme_redirect($return_template);
        }
    }
    
    function do_theme_redirect($url) {
        global $post, $wp_query;
        if (have_posts()) {
            include($url);
            die();
        } else {
            $wp_query->is_404 = true;
        }
    }