如何从子主题中“删除”父主题页面模板?


17

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

我以为只复制它并删除内容就可以解决问题,但似乎没有。有谁知道如何做到这一点?我敢肯定这很简单。

谢谢

大须

Answers:


11

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

我没有断言这是一个有效的主意(在这里晚些时候),但这会使它从编辑屏幕中消失:

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] );
}

谢谢您这样做,这似乎是一个不错的解决方案-当您说覆盖模板时,是否意味着无论如何仅在其中包含一个单列模板?还是您要用我想实际使用的模板覆盖它(即称它为一栏,但实际上却有2或3栏?)?
奥苏(Osu)

@Osu我的意思是使用您自己的相似模板进行覆盖。就逻辑而言,很容易更改子主题并将其添加到父主题的模板,但是很难禁用它们。基本上,子主题应该比父主题做更多,而不是更少。代码逻辑遵循此原理。
2011年

喔好吧。感谢您清理。然后,我将为他们创建一个col模板。干杯
Osu

对于任何想使用jQuery从下拉列表中删除主题的人,这是另一种方法(虽然不确定这是否是最好的方法):pastie.org/3710683
Osu

2
@brasofilo与主题相关的内部组件在3.4中进行了重大的重构和API更改,因此许多较旧的内容将无法使用
Rarst

29

WordPress 3.9引入了一个theme_page_templates过滤器。

以下来自“ 二十四岁”子主题的示例functions.php显示了如何删除“参与者页面”模板:

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

3
这应该是WP 3.9+的最新接受答案
helgatheviking

9

扩展@Rarst的答案,这是一种更通用的方法,与特定主题无关,但可以在您自己的子主题的functions.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] );
            }
        }
    }
}

因此,可以在子主题的functions.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" );-如果您只想修改单个文件,则不需要传递数组。


6

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

以下是在TwentyTen(在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


如果链接发生更改或断开,则链接异地链接将变得无用。这也没有试图真正回答这个问题
汤姆·J·诺维尔

足够公平,添加了示例。
Marcio Duarte 2014年

1

由于以前的答案在WordPress的当前版本中不再适用于此,并且有一个相关问题,我刚刚(2013年4月)使用PHP输出缓冲区回答了这一问题,所以我想我会发布指向该答案的链接

还刚刚发布了“ 省略父主题页面模板”插件,该插件在添加或编辑WordPress “页面”时从“页面属性”元框中的模板下拉列表中过滤掉所有父主题页面模板


0

2012年7月10日-WordPress 3.4.1

先前的答案不起作用,正如Rarst在评论中所说:

与主题相关的内部组件在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),看起来这里没有什么可钩住的 ...

/**
 * 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;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.