如何从子主题中*移除*父主题页面模板?

时间:2011-03-31 作者:Osu

我正在使用TwentyTen主题创建子主题,但我似乎无法摆脱TwentyTen父主题中的“一栏,无侧边栏”页面模板。

我以为只要把它复制过来并删除内容就行了,但似乎不行。有人知道怎么做吗?我相信这很简单。

谢谢

osu

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

覆盖该模板要比删除它容易得多。这就是逻辑。

我不认为这是一个有效的想法(下文),但这会让它从编辑屏幕上消失:

add_action(\'admin_head-post.php\',\'remove_template\');

function remove_template() {

    global $wp_themes;

    get_themes();
    $templates = &$wp_themes[\'Twenty Ten\'][\'Template Files\'];
    $template = trailingslashit( TEMPLATEPATH ).\'onecolumn-page.php\';
    $key = array_search($template, $templates);
    unset( $templates[$key] );
}

SO网友:Alex Angas

WordPress 3.9引入了theme_page_templates 滤器

下面的示例来自Twenty Fourteen 子主题functions.php 显示如何删除“Contributor Page”模板:

function tfc_remove_page_templates( $templates ) {
    unset( $templates[\'page-templates/contributors.php\'] );
    return $templates;
}
add_filter( \'theme_page_templates\', \'tfc_remove_page_templates\' );

SO网友:Tom Auger

在@Rarst的答案的基础上进行扩展,这里有一种更通用的方法,它不与特定主题相关联,但可以在您自己的子主题函数中使用。php可以删除任何想要删除的父主题页面模板。

function remove_template( $files_to_delete = array() ){
    global $wp_themes;

    // As convenience, allow a single value to be used as a scalar without wrapping it in a useless array()
    if ( is_scalar( $files_to_delete ) ) $files_to_delete = array( $files_to_delete );

    // remove TLA if it was provided
    $files_to_delete = preg_replace( "/\\.[^.]+$/", \'\', $files_to_delete );

    // Populate the global $wp_themes array
    get_themes();

    $current_theme_name = get_current_theme();

    // Note that we\'re taking a reference to $wp_themes so we can modify it in-place
    $template_files = &$wp_themes[$current_theme_name][\'Template Files\'];

    foreach ( $template_files as $file_path ){
        foreach( $files_to_delete as $file_name ){
            if ( preg_match( \'/\\/\'.$file_name.\'\\.[^.]+$/\', $file_path ) ){
                $key = array_search( $file_path, $template_files );
                if ( $key ) unset ( $template_files[$key] );
            }
        }
    }
}
因此,您可以在子主题的函数中使用它。php文件如下:

add_action( \'admin_head-post.php\', \'remove_parent_templates\' );

function remove_parent_templates() {
    remove_template( array( "showcase.php", "sidebar-page" ) );
}
这里我只是说明,如果您不想通过“.php”部分,就不必通过。

或:remove_template( "sidebar-page" ); - 如果只想修改单个文件,则无需传递数组。

SO网友:Marcio Duarte

WP core(3.9)中有一个新的过滤器用于删除页面模板。它可以从子主题中使用。

以下是如何在2010年实现这一目标(在WP 3.9上测试):

add_filter( \'theme_page_templates\', \'my_remove_page_template\' );
    function my_remove_page_template( $pages_templates ) {
    unset( $pages_templates[\'onecolumn-page.php\'] );
    return $pages_templates;
}

https://core.trac.wordpress.org/changeset/27297

http://boiteaweb.fr/theme_page_templates-hook-semaine-16-8033.html

SO网友:MikeSchinkel

由于之前的答案在当前版本的WordPress中不再适用,而且我刚刚用PHP输出缓冲区回答了一个相关的问题(2013年4月)link 对这个答案。

还刚刚发布了Omit Parent Theme Page Templates 添加或编辑WordPress页面时,从页面属性元框中的模板下拉列表中筛选出所有父主题页面模板的插件

SO网友:brasofilo

2012年7月10日-WordPress 3.4.1

之前的答案不起作用,正如拉斯特在评论中所说:

与主题相关的内部构件在3.4中经历了重大的重构和API更改,所以很多旧的东西都无法工作

快速脏的jQuery解决方案

add_action(\'admin_head\', \'wpse_13671_script_enqueuer\');

function wpse_13671_script_enqueuer() {
    global $current_screen;

    /**
     * /wp-admin/edit.php?post_type=page
     */
    if(\'edit-page\' == $current_screen->id) 
    {
        ?>
        <script type="text/javascript">         
        jQuery(document).ready( function($) {
            $("a.editinline").live("click", function () {
                var ilc_qe_id = inlineEditPost.getId(this);
                setTimeout(function() {
                        $(\'#edit-\'+ilc_qe_id+\' select[name="page_template"] option[value="showcase.php"]\').remove();  
                    }, 100);
            });

            $(\'#doaction, #doaction2\').live("click", function () {
                setTimeout(function() {
                        $(\'#bulk-edit select[name="page_template"] option[value="showcase.php"]\').remove();  
                    }, 100);
            });       
        });    
        </script>
    <?php
    }

    /**
     * /wp-admin/post.php?post=21&action=edit
     */
    if( \'page\' == $current_screen->id ) 
    {
        ?>
        <script type="text/javascript">
        jQuery(document).ready( function($) {
            $(\'#page_template option[value="showcase.php"]\').remove();
        });
        </script>
    <?php
    }
}
没有钩子如果我遵循正确的路径,这就是“操作”发生的地方(/wp-includes/class-wp-theme.php), 看起来像there\'s nothing here to hook on...

/**
 * Returns the theme\'s page templates.
 *
 * @since 3.4.0
 * @access public
 *
 * @return array Array of page templates, keyed by filename, with the value of the translated header name.
 */
public function get_page_templates() {
    // If you screw up your current theme and we invalidate your parent, most things still work. Let it slide.
    if ( $this->errors() && $this->errors()->get_error_codes() !== array( \'theme_parent_invalid\' ) )
        return array();

    $page_templates = $this->cache_get( \'page_templates\' );

    if ( ! is_array( $page_templates ) ) {
        $page_templates = array();

        $files = (array) $this->get_files( \'php\', 1 );

        foreach ( $files as $file => $full_path ) {
            $headers = get_file_data( $full_path, array( \'Template Name\' => \'Template Name\' ) );
            if ( empty( $headers[\'Template Name\'] ) )
                continue;
            $page_templates[ $file ] = $headers[\'Template Name\'];
        }

        $this->cache_add( \'page_templates\', $page_templates );
    }

    if ( $this->load_textdomain() ) {
        foreach ( $page_templates as &$page_template ) {
            $page_template = $this->translate_header( \'Template Name\', $page_template );
        }
    }

    if ( $this->parent() )
        $page_templates += $this->parent()->get_page_templates();

    return $page_templates;
}

结束

相关推荐