Как * удалить * шаблон страницы родительской темы из дочерней темы?

17

Я использую тему TwentyTen для создания дочерней темы, но не могу избавиться от шаблона страницы «Один столбец, без боковой панели», который находится в родительской теме TwentyTen.

Я думал, просто скопировав его и удалив содержимое, можно добиться цели, но, похоже, нет. Кто-нибудь знает как это сделать? Я уверен, что это очень просто.

Благодарность

осу

Осу
источник

Ответы:

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] );
}
Rarst
источник
Спасибо за это, это выглядит как хорошее решение - когда вы говорите переопределение шаблона, вы имеете в виду просто включение там одного столбца шаблона? Или вы имеете в виду переопределение его шаблоном, который я на самом деле хочу использовать (т.е. назовите его «Один столбец», но на самом деле он имеет 2 или 3 столбца?)?
Ос
@Osu Я имел в виду переопределение с вашим собственным похожим шаблоном. Что касается логики, дочерней теме легко изменить и добавить в шаблоны родительской темы, но их трудно отключить. В основном дочерняя тема должна делать больше, чем родительская тема, а не меньше. И логика кода следует этому принципу.
Rarst
Ах хорошо. Спасибо за разъяснение этого. Я создам шаблон с одним col для них тогда. Приветствия
Осу
Для тех, кто хочет удалить тему из выпадающего списка с помощью JQuery, то это еще один подход (не уверен, что это лучший способ , хотя): pastie.org/3710683
Ос
2
Связанные с темой внутренние компоненты @brasofilo подверглись серьезному рефакторингу и изменениям API в 3.4, поэтому многие старые вещи не будут работать
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

Марсио Дуарте
источник
Ссылка вне сайта становится бесполезной, если ссылка меняется или удаляется. Это также не делает попытки фактически ответить на вопрос
Том Дж. Новелл
Достаточно справедливо, пример добавлен.
Марсио Дуарте
1

Так как предыдущие ответы больше не работают здесь в текущих версиях WordPress, и был связанный вопрос, на который я только что ответил (апрель 2013), используя выходной буфер PHP, я решил опубликовать ссылку на этот ответ.

Также только что опубликовал Omit Родителя Тему Шаблонов страниц плагин , который отфильтровывает все шаблоны родительской темы страницы из списка шаблонов в атрибутах страницы METABOX при добавлении или редактирования WordPress «страница.»

MikeSchinkel
источник
0

10 июля 2012 - WordPress 3.4.1

Предыдущие ответы не работают и, как сказал Рарст в комментарии:

связанные с темой внутренние компоненты претерпели значительные изменения в рефакторинге и изменениях API в 3.4, поэтому многие старые вещи не будут работать

Быстрое и грязное решение 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;
}
brasofilo
источник
Билет Trac: core.trac.wordpress.org/ticket/21891
mrwweb