使用空页构建自定义插件输出

时间:2020-06-01 作者:Matthew Brown aka Lord Matt

我一直在谷歌上搜索这个问题的答案,但还没有找到多少用处。我见过一些插件,它们会说“选择显示X的页面”和“选择显示y的页面”。如果页面是example.com/mypage1 他们可以做这样的事情example.com/mypage1/subset/detail/finedetail. 我想知道的是,我怎样才能用我的一个插件做到这一点?

我正在考虑一个插件可能具有a lot of data 通过前端显示。我知道有些人使用短代码输出,但不是全部。有些人似乎将页面用作永久链接结构的构建块。我也想做那件事。

1 个回复
SO网友:user3135691

你在一个问题中问了几件事。在我们解决问题之前,让我们直奔主题:

您正在寻找template_include

它是钩子,在最终输出之前最后调用它。在这个阶段,WordPress决定选择哪个模板。

要实现目标,您需要处理以下挂钩:

模板包括添加重写规则,知道如何以某种方式保存值

<?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

如果它帮助你解决了问题,请接受正确的答案,谢谢。

相关推荐

Problem With Pages Displaying

除了我叔叔的主页显示之外,我的任何页面都有问题。该站点最近已从一台主机迁移到另一台主机。所有页面都显示在WP后端,并且都已格式化,所有内容都在那里,但当我单击菜单链接时,会出现错误404。我创建了一个测试页面来查看新页面发生了什么。它工作并显示为预览,但在我发布后,同样的事情发生了,错误404。该网站是www.andyvalvur。com上托管,来自Inmotion托管。有什么想法吗?我感谢你所能提供的一切帮助。