自定义帖子上的内容与模板

时间:2017-12-03 作者:JasCav

我刚写了一篇自定义帖子(suppliers) 作为一个插件(带有元内容),效果很好。我还创建了一个模板页(single-suppliers.php) 在同一个插件中显示数据。我是这样写的,如果有人有这样的愿望,他们可以自己创造single-suppliers.php 页面在他们的模板中,并获得他们自己的外观和感觉。(我正在使用template_include 筛选以执行此操作。)

template\\u include筛选器的示例。

// Register a my Membership Template.
function my_membership_include_template_function( $template_path ) {
    if ( get_post_type() == \'my_members\' ) {
        if ( is_single() && is_main_query() ) {
            // Check if the file exists in the theme first, otherwise
            // serve the file from the plugin.
            if ( $theme_file = locate_template( array ( \'single-my_members.php\' ) ) ) {
                $template_path = $theme_file;
            } else {
                $template_path = plugin_dir_path( __FILE__ ) . \'/single-my_members.php\';
            }
        }
    }
    return $template_path;
}
add_filter( \'template_include\', \'my_membership_include_template_function\', 1 );
示例single-my_members.php.

<?php
get_header();
?>
<h1>Test Header - Does not appear within the theme\'s "content" area.</h1>
<?php
get_sidebar();
get_footer();
然而,我面临的问题是,虽然内容在其自身的上下文中看起来很棒,但它并没有位于客户当前主题的正确位置。它位于主题内容开头上方自己的区域。请参见屏幕截图:

Actual Location + Desired Location

在搜索WordPress文档后,我浏览了过滤器,the_content, 它通过将内容放在正确的位置来解决上述问题,但是如果我的客户希望这样做,它似乎不允许定制页面(他们已经表示他们这样做了。还有一个问题是the_content 过滤器显示为附加。)

我不知道如何最好地解决这个问题,或者是否有更好的做法,我应该使用。如果有帮助的话,我正在将Genesis与子主题一起使用,但我特别不想在Genesis挂钩中编码,因为那样会破坏通用插件的用途。

1 个回复
SO网友:Johansson

如果模板本身不支持,则不能使用过滤器和挂钩替换模板的一半。

这个template_include 将覆盖整个模板,它意味着页眉、正文、内容、提要栏、页脚和所有内容。

现在您有了以下选项:

设置模板样式创建完整single-my_member.php 然后通过CSS和JS对其进行样式化。您需要将其视为一个完整的模板,而不仅仅是一个呈现几行内容的页面。

使用preg_replace()preg_replace() 结合输出缓冲并将内容添加到页面的公共位置,例如<body><header>. 这可能会大大降低您的网站速度,而且并不总是准确的。

提供短代码

如果您试图向模板添加有限的内容(不是完整的HTML结构),那么您可能可以提供一些短代码供用户使用。在这里弄乱模板的风险非常低。

结束

相关推荐

Taxonomy Templates

我不太明白如何链接到我的分类法模板。我需要做一个临时页面并从那里查询我的条款吗?我当前正在使用分类层次结构:Taxonomy$labels = array( \'name\' => __( \'Product Categories\' ), \'singular_name\' => __( \'Product Category\' ), \'search_items\' =>