Як * видалити * шаблон сторінки батьківської теми з дочірньої теми?


17

Я використовую тему TwentyTen для створення дочірньої теми, але я не можу позбутися шаблону сторінки "Один стовпець, без бічної панелі", який знаходиться в батьківській темі TwentyTen.

Я думав, що просто скопіювати його та видалити вміст вдасться до цього, але здається, що це не так. Хтось знає, як це зробити? Я впевнений, що це дуже просто.

Спасибі

osu

Відповіді:


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 я мав на увазі переосмислення вашого власного подібного шаблону. Що стосується логіки, то дитячу тему легко змінювати та додавати до шаблонів батьківської теми, але їх важко відключити. В основному дитяча тема повинна робити більше, ніж батьківська тема, а не менше. І кодова логіка слідує цьому принципу.
Рарст

добренько. Дякуємо, що очистили це. Тоді я створю для них один шаблон шаблону. Ура
Осу

Для всіх, хто хоче видалити тему зі спадного списку за допомогою jQuery, тоді це ще один підхід (не впевнений, чи це найкращий спосіб): pastie.org/3710683
Osu,

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, ось більш загальний підхід, який не прив’язаний до конкретної теми, але може бути використаний всередині функції вашої власної дочірньої теми.

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

Таким чином, ви можете використовувати його у файлі function.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


Позиція за межами посилання стає марною, якщо посилання змінюється або знімається. Це також не робить спроби реально відповісти на питання
Tom J Nowell

Досить справедливо, додав приклад.
Марсіо Дуарте

1

Оскільки попередні відповіді більше не працюють у поточних версіях WordPress, і виникло пов'язане питання, на яке я щойно відповів (квітень 2013 р.) За допомогою вихідного буфера PHP, я зрозумів, що опублікую посилання на цю відповідь.

Також щойно опублікував плагін « Опустіть батьківську тему сторінки шаблонів», який фільтрує всі шаблони сторінок батьківської теми із випадаючого списку шаблонів у метабоксі «Атрибути сторінки» під час додавання або редагування «Сторінки» WordPress .


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

Квиток на поїзд
mrwweb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.