你在一个问题中问了几件事。在我们解决问题之前,让我们直奔主题:
您正在寻找template_include 钩
它是钩子,在最终输出之前最后调用它。在这个阶段,WordPress决定选择哪个模板。
要实现目标,您需要处理以下挂钩:
模板包括添加重写规则,知道如何以某种方式保存值因此,您可以在插件中设置一个选项页面,添加一个字段/选项,然后抓取您之前在选项中保存的页面id,如下所示:
<?php
// In your options page, add a value/field
if (!empty( $options[\'your_data_template\'] ) ) {
$options[\'your_data_template\'] = sanitize_text_field( $options[\'your_data_template\'] );
}
?>
有许多方法可以以这种或那种方式保存选项。
这是列出后端中所有页面的代码:
<?php $value = get_option(\'your_data_template\'); ?>
<select class="custom-select" name="options[your-data-template]">
<?php
// create a variable that holds all pages (array)
$pages = get_pages();
// Then loop over it to list all pages as a select option.
foreach ($pages as $page) {
?>
<option value="<?php echo $page->ID; ?>" <?php selected( $value, $page->ID, true ); ?>>
<?php echo $page->post_title; ?></option>
<?php } ?>
</select>
然后,添加一个文件,并将其包含在插件的主文件中,根据需要命名,但我建议使用类似于模板包含的内容。php之类的。
<?php
// In the template include hook, grab the option and do a simple if statement to check
function wpse_check_template(){
// Grab the value from the database and compare
$your_data_page = get_option(\'your_data_template\');
// This is where you intercept the template hierarchy and trigger your own
if(is_page($your_data_page){
// if there is a file in the theme directory, use that
if (file_exists( trailingslashit( get_template_directory() ) . \'your-data-template.php\' ) ) {
return trailingslashit( get_template_directory() ) . \'your-data-template.php\';
// In case, there is no template in the theme folder, look in the plugins folder "templates"..
} else {
return plugin_dir_path( __FILE__ ) . \'templates/your-data-template.php\';
}
}
}
add_action(\'template_include\', \'wpse_check_template\');
我只为设置等添加了几行代码。诀窍是在适当的时候在自己的模板中找到正确的钩子(template\\u include)。如果你在其他地方绊倒了,请这样做
not 使用钩子“template\\u redirect”——顾名思义——它是指重新定向,而不是包括在内。
我希望这能让你了解它的工作原理。我没有测试这段代码,但这是一种应该可行的方法。
您要求的更深层次的url结构需要“add\\u rewrite\\u rule”操作的一些高级知识。这方面也有很多话题。请看这里的一个示例。Add Rewrite Rule for custom page
如果它帮助你解决了问题,请接受正确的答案,谢谢。