在Functions.php中创建“无文件”页面模板

时间:2012-05-09 作者:mrwweb

(所谓“页面模板”,我指的是具有"Template Name" header 可在管理页面的“模板”下拉字段中选择。)

在多个实例中,我构建了页面模板,可以通过挂接到\\u内容或pre\\u get\\u帖子或类似的内容来完成。这让我想知道是否有一种方法可以在functions.php 或者不创建主题文件本身的插件。

我想这样做的原因:

在我想到的场景中,我通常只是复制页面。php几乎一字不差。这意味着将来对页面的任何更改。php需要制作两次。随着儿童主题的更新,这更加令人痛苦

/*
Template Name: My Template
*/

get_template_part( \'page\' );
但最后,我还是回到了这个想法,所以我很好奇是否有人知道怎么做。如果你认为这是一个可怕的想法,我也对这个观点感兴趣。

=======

更新:我应该补充:

我知道$templates 中每个主题的数组this support forums thread 这实际上是在做与我想做的相反的事情_wp_page_template 从…起this WPSE thread.我想我只需要了解模板数组和自定义字段是如何协同工作的(我还不清楚隐藏的自定义元字段是如何工作的)。

=======

更新二:2012年10月8日提出此问题后,主题后端已进行了重大修改,因此上述$templates数组不再存在。

3 个回复
最合适的回答,由SO网友:mrwweb 整理而成

我仍然有做这类事情的愿望,我在OP中提出了以下解决方案,出于以下几个原因:

它非常透明,与主题中的逻辑保持一致

自定义模板

如果我不需要任何自定义标记,这里是整个模板文件。假设它在/wp-content/themes/my-theme/templates/my-template.php

<?php
/**
 * Template Name: My Template
 */
get_template_part( \'page\' );
使用它,现在我们可以使用两个“钩子”来做各种事情:

身体类别.page-template-my-template 对于CSSif( is_page_template( \'templates/my-template.php\' ) ) {...我用#1更改布局、颜色等,用#2过滤the_content(), 添加post_classes、使用ACF设置自定义字段等。有时,我将它们结合起来用于一些东西,例如仍然需要侧栏的全宽模板。它非常强大,但如果不是你自己设置的话,很容易设置和理解。

这仍然局限于一个主题(你不能用插件来实现),但就我的问题而言,这是一个很好的答案。

SO网友:Wyck

一般来说,页面相当缺乏灵活性,最好使用自定义的帖子类型。同时,挂接到实际的页面模板下拉列表也很可能会有问题(我怀疑如果没有一些严重的黑客攻击,它会起作用)。您最好只写自己的元框下拉列表。

我认为你在正确的轨道上get_template_part. 它简单、灵活,并且真正有助于构建复杂的输出,使用这两个参数也会有所帮助。可以说,将代码块复制/粘贴到模板中,然后编写各种古怪的函数更容易,而且这对其他人或以后重新访问代码时更有意义。

另一种选择是类似的人,但在功能级别,使用template_redirect 行动

你可以有基于你的元选择加载独特模板的函数,实际上现在我想你可以将它与get_template_part. 以下代码未测试。

类似于:

function my_special_template() {
//page "contact" for example, make this your meta dropdown selection
    if (is_page(\'Contact\')){  
        get_template_part( \'special-chunk\' );  //file named special-chunk.php
    }
}

add_action(\'template_redirect\', \'my_special_template\');
在一天结束时,你仍然会抓到一些。php文件。

SO网友:birgire

我想知道您是否打算注册一个无文件模板theme_page_templates 过滤方式如下:

/**
 * Add a file-less page template to the page template dropdown 
 */
add_filter( \'theme_page_templates\', function( $page_templates, $wp_theme, $post ) 
{
    // Edit this to your needs
    $fileless_theme_slug  = \'my_fileless_page_template\';
    $fileless_theme_label = esc_html__( \'My File-Less Page Template\', \'my-domain\' );

    // Append if it doesn\'t already exists  
    if( ! isset( $page_templates[$fileless_theme_slug] ) )
        $page_templates[$fileless_theme_slug] = $fileless_theme_label ;

    return $page_templates;
}, PHP_INT_MAX, 3 );
在后端显示如下:

file-less template

然后使用以下内容修改其输出:

/**
 * OUtput for our file-less page template
 */
add_action( \'template_redirect\', function() 
{   
    // Target pages with out custom template        
    if( is_page_template( \'my_fileless_page_template\' ) )
    {
        // Stop the default page template to be displayed
        add_filter( \'template_include\', \'__return_null\', PHP_INT_MAX );

        // Custom output
        my_fileless_page_template_output();
    }
}, PHP_INT_MAX );
这里我们定义my_fileless_page_template_output() 根据我们的需要,例如包括主题的页眉和页脚、主查询循环甚至模板部分。我想可以跳过exit 在最后。

结束

相关推荐

Functions.php条件标记仅适用于自定义POST类型

我正在使用gpp幻灯片,它会覆盖wordpress的默认库显示。我只想在我的自定义帖子类型“listings”上使用它-我如何引用它来仅替换wordpress在“listings”页面上的默认库?我的函数中有此代码。php,我似乎无法获得自定义帖子类型的正确参考:add_action(\'wp_head\',\'add_gpp_gallery\'); function add_gpp_gallery() { if( ( is_single() || is_page() ) &