0

A plugin creates a set of pages and a template. There must be some method to assign the template to one of the pages. I've attempted to adapt the method shown at filter reference template_include without success.

The page slug is member-register, the template file name is member-content-template.php.

Some of the things that don't work include:

  • locate_template(): I suspect that because the template was created by a plugin it is not found by a function that appears to only search themes.
  • is_page(): If given the argument of the page's title, slug or id returns false.

Edit:

As I have little experience with WordPress, I work in small increments to see what yields results. Attempts include such things as:

$template = locate_template(['member-content-template.php']);
var_dump($template);die;

Which results in string(0) "" Or:

   $is = is_page(3350);
    var_dump($is);die;

Which results in bool(false) The same is also true for is_page('member-register') and is_page('Register')

If any of the above had yielded acceptable results I would have built a callback as suggested in the filter reference.

Edit #2:

Code snippets:

rma.php (the plugin code)

$page_definitions = array(
...
'member-register' => array(
    'title' => __('Register', 'rma-member-auth'),
    'content' => '[custom_register_form]', 
    'class' => 'Rma\Pages\Register',
    'function' => 'createRegisterForm',
    'template' => 'Rma\Templates\member-content-template.php',
),
);
...
    $templater = new PageTemplater($templates);
    add_action('plugins_loaded', array('Rma\Templates\PageTemplater', 'get_instance'));
    $pages = new PageLoader();
    $pages->pageCreator($page_definitions);
    $pages->shortcodeGenerator($page_definitions);
...

PageLoader:

...
public function pageCreator($page_definitions) {
    foreach ($page_definitions as $slug => $page) {
        // Check that the page doesn't exist already
        $query = new \WP_Query('pagename=' . $slug);
        if (!$query->have_posts()) {
            // Add the page using the data from the array above
            wp_insert_post(
                    array(
                        'post_content' => $page['content'],
                        'post_name' => $slug,
                        'post_title' => $page['title'],
                        'post_status' => 'publish',
                        'post_type' => 'page',
                        'ping_status' => 'closed',
                        'comment_status' => 'closed',
                        'post_template' => $page['template'],
                    )
            );
        }
    }
}
6
  • Please show us what you have tried.
    – Milo
    May 11, 2017 at 15:25
  • @Milo Various attempts included in edit.
    – geoB
    May 11, 2017 at 16:06
  • did you try template_include()?
    – rudtek
    May 11, 2017 at 16:17
  • @rudtek The attempts shown above were derived from the documentation for template_include(). Had the attempts been successful I would have built a filter based on template_include().
    – geoB
    May 11, 2017 at 16:22
  • The important part is when you do things. If you're checking is_page when the functions file is loaded, the query hasn't run yet for WP to know what page it is.
    – Milo
    May 11, 2017 at 16:24

2 Answers 2

0

locate_template function searches your current theme's folder for template name(s). If your templates are in a root folder of your theme, use:

$template = locate_template( 'member-content-template.php' );

otherwise, precede the name of a template with subfolder's name ( no slash in front ):

$template = locate_template( 'templates/member-content-template.php' );

To load a template ( if found ) add true as a second parameter of locate_template function:

$template = locate_template( 'member-content-template.php', true );

Update: To load a tempate in your plugin, use filter 'template_include':

function my_template_loader_filter() {
    function my_template_loader( $template ) {
        $my_template = locate_template( 'member-content-template.php.php' );
        if ( ( '' != $my_template ) && is_page( 'member-register' ) )
            return $my_template ;
        }
        return $template;
    }
    add_filter( 'template_include', 'my_template_loader' );
}
add_action( 'after_setup_theme', 'my_template_loader_filter' );
3
  • As mentioned in the question, the template is created in a plugin, so I can only assume for now that locate_template() may return a template. Nor does this indicate how to assign such a template should one be returned to a page also created in the same plugin.
    – geoB
    May 11, 2017 at 22:16
  • Check 'Update', for how to load a template in your plugin. May 11, 2017 at 22:41
  • The plugin currently loads a template; it cannot yet assign that to a page. I'll update my question with code snippets show template & page creation.
    – geoB
    May 11, 2017 at 23:48
0

As I seem to have just learned, a page created in a plugin is not considered a page for purposes of adding a template. Instead, I found that the following additions worked:

rma.php:

$id = get_page_by_title('Register')->ID;
$pages->updateRegisterTemplate($id);

and, in PageLoader:

public function updateRegisterTemplate($id) {
    $meta_key = '_wp_page_template';
    $meta_value = './member-content-template.php';

    return update_post_meta($id, $meta_key, $meta_value)
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.