Jak * usunąć * szablon strony nadrzędnej z motywu podrzędnego?


17

Używam motywu TwentyTen do tworzenia motywu podrzędnego, ale wydaje się, że nie mogę pozbyć się szablonu strony „Jedna kolumna, bez paska bocznego”, który jest w nadrzędnym motywie TwentyTen.

Myślałem, że po prostu skopiowanie go i usunięcie zawartości załatwi sprawę, ale wydaje się, że nie. Czy ktoś wie jak to zrobić? Jestem pewien, że to bardzo proste.

Dzięki

osu

Odpowiedzi:


11

Przesłonięcie tego szablonu byłoby znacznie łatwiejsze niż pozbycie się go. Taka jest logika.

Nie twierdzę, że jest to skuteczny pomysł (tutaj późno), ale to by go nuknęło z ekranu edycji:

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

Dzięki za to, wygląda to na dobre rozwiązanie - kiedy mówisz o przesłonięciu szablonu, czy masz na myśli po prostu umieszczenie tam szablonu z jedną kolumną? A może masz na myśli zastąpienie go szablonem, którego naprawdę chcę użyć (tzn. Nazwać jedną kolumną, ale tak naprawdę ma 2 lub 3 kolumny?)?
Osu,

@Osu Miałem na myśli zastąpienie własnym podobnym szablonem. Jeśli chodzi o logikę, motyw podrzędny można łatwo zmieniać i dodawać do szablonów motywu nadrzędnego, ale trudno je wyłączyć. Zasadniczo motyw podrzędny powinien robić więcej niż motyw nadrzędny, a nie mniej. Logika kodu jest zgodna z tą zasadą.
Rarst

ah, ok. Dzięki za wyjaśnienie. Stworzę dla nich szablon jednokolumnowy. Pozdrawiam
Osu,

Dla każdego, kto chce usunąć motyw z listy rozwijanej za pomocą jQuery, jest to inne podejście (nie jestem pewien, czy jest to najlepszy sposób): pastie.org/3710683
Osu

2
Wewnętrzne elementy tematyczne @brasofilo przeszły gruntowne refaktoryzacje i zmiany API w wersji 3.4, więc wiele starszych rzeczy nie będzie działać
Rarst

29

WordPress 3.9 wprowadza theme_page_templatesfiltr.

Poniższy przykład z motywu dwudziestu czternastu dzieci functions.phppokazuje, jak usunąć szablon „Strona współtwórcy”:

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

3
To powinna być zaktualizowana zaakceptowana odpowiedź dla WP 3.9+
helgatheviking

9

Rozwijając odpowiedź @ Rarst, oto bardziej ogólne podejście, które nie jest powiązane z konkretnym motywem, ale może być użyte w funkcjach własnego motywu podrzędnego.

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

Możesz więc użyć go w pliku functions.php motywu podrzędnego w następujący sposób:

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

function remove_parent_templates() {
    remove_template( array( "showcase.php", "sidebar-page" ) );
}

Tutaj tylko ilustruję, że nie musisz przechodzić przez część „.php”, jeśli nie chcesz.

Lub: remove_template( "sidebar-page" );- nie musisz przekazywać tablicy, jeśli chcesz zmodyfikować tylko jeden plik.


6

W WP WP (3.9) znajduje się nowy filtr do usuwania szablonów stron. Można go używać z motywów potomnych.

Oto jak to osiągnąć w TwentyTen (testowany na 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


Link poza witryną staje się bezużyteczny, jeśli link się zmieni lub zostanie usunięty. Nie próbuje to również odpowiedzieć na pytanie
Tom J Nowell

W porządku, dodano przykład.
Marcio Duarte,

1

Ponieważ poprzednie odpowiedzi już nie działają tutaj w bieżących wersjach WordPress i pojawiło się powiązane pytanie, na które właśnie odpowiedziałem (kwiecień 2013 r.) Za pomocą bufora wyjściowego PHP, pomyślałem, że opublikuję link do tej odpowiedzi.

Właśnie opublikowałem wtyczkę Pomiń szablony stron motywów nadrzędnych, która odfiltrowuje wszystkie szablony stron motywów nadrzędnych z listy rozwijanej szablonów w metaboksie Atrybuty strony podczas dodawania lub edytowania „Strony” WordPress .


0

10 lipca 2012 r. - WordPress 3.4.1

Poprzednie odpowiedzi nie działają i, jak powiedział Rarst w komentarzu:

wewnętrzne elementy tematyczne przeszły poważne refaktoryzacje i zmiany API w wersji 3.4, więc wiele starszych rzeczy nie będzie działać

Szybkie i brudne rozwiązanie 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
    }
}

Nie masz do tego haka?

Jeśli podążyłem właściwą ścieżką, dzieje się tutaj „akcja” ( /wp-includes/class-wp-theme.php) i wygląda na to, że nie ma tu nic do zaczepienia ...

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.