Bagaimana * menghapus * templat halaman tema orang tua dari tema anak?

17

Saya menggunakan tema TwentyTen untuk membuat tema anak, tapi sepertinya saya tidak bisa menyingkirkan templat halaman 'One kolom, no sidebar' yang ada di tema orangtua TwentyTen.

Saya pikir hanya menyalinnya dan menghapus isinya akan melakukan trik, tetapi sepertinya tidak. Adakah yang tahu bagaimana melakukan ini? Saya yakin itu sangat sederhana.

Terima kasih

osu

Osu
sumber

Jawaban:

11

Meng-override template itu akan jauh lebih mudah daripada menyingkirkannya. Logika jalannya saja.

Saya tidak mengklaim itu ide yang efisien (terlambat di sini), tetapi ini akan membuatnya nuked dari layar edit:

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] );
}
Jarang
sumber
Terima kasih untuk ini, yang terlihat seperti solusi yang bagus - ketika Anda mengatakan mengganti template, apakah maksud Anda hanya menyertakan template satu kolom di sana saja? Atau maksud Anda menimpanya dengan templat yang ingin saya gunakan (mis. Sebut saja Satu Kolom tetapi sebenarnya memiliki 2 atau 3 kolom?)?
Osu
@ Osu maksud saya mengesampingkan dengan template serupa Anda. Sejauh logika berjalan, mudah untuk mengubah tema anak dan menambahkan ke template dari tema orang tua, tetapi sulit untuk menonaktifkannya. Pada dasarnya tema anak seharusnya melakukan lebih dari sekedar tema orang tua, tidak kurang. Dan logika kode mengikuti prinsip ini.
Rarst
ah baiklah Terima kasih sudah membereskannya. Saya akan membuat template satu col untuk mereka. Cheers
Osu
Bagi siapa pun yang ingin menghapus tema dari daftar dropdown menggunakan jQuery, maka ini adalah pendekatan lain (tidak yakin apakah itu cara terbaik): pastie.org/3710683
Osu
2
Tema internal terkait @brasofilo mengalami refactoring dan perubahan API pada 3.4, jadi banyak hal yang lebih tua tidak akan berfungsi
Rarst
29

WordPress 3.9 memperkenalkan theme_page_templatesfilter.

Contoh di bawah ini dari tema Twenty Fourteen child functions.phpmenunjukkan cara menghapus templat "Halaman Kontributor":

function tfc_remove_page_templates( $templates ) {
    unset( $templates['page-templates/contributors.php'] );
    return $templates;
}
add_filter( 'theme_page_templates', 'tfc_remove_page_templates' );
Alex Angas
sumber
3
Ini harus menjadi jawaban yang diterima yang diperbarui untuk WP 3.9+
helgatheviking
9

Memperluas jawaban @ Rarst, berikut ini adalah pendekatan yang lebih umum yang tidak terkait dengan tema tertentu, tetapi dapat digunakan di dalam fungsi theme anak Anda sendiri.php untuk menghapus template halaman tema orangtua mana pun yang ingin Anda singkirkan.

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

Jadi Anda dapat menggunakannya di file functions.php tema anak Anda seperti:

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

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

Di sini saya hanya menggambarkan bahwa Anda tidak perlu melewati bagian ".php" jika Anda tidak mau.

Atau: remove_template( "sidebar-page" );- Anda tidak perlu meneruskan array jika Anda hanya ingin memodifikasi satu file.

Tom Auger
sumber
6

Ada filter baru di WP core (3.9) untuk menghapus template halaman. Ini dapat digunakan dari tema anak.

Inilah cara untuk mencapai ini di TwentyTen (diuji pada 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

Marcio Duarte
sumber
Tautan di luar situs menjadi tidak berguna jika tautan berubah atau dihilangkan. Ini juga tidak berusaha menjawab pertanyaan itu
Tom J Nowell
Cukup adil, contoh ditambahkan.
Marcio Duarte
1

Karena jawaban sebelumnya tidak lagi berfungsi di sini di versi WordPress saat ini dan ada pertanyaan terkait yang baru saja saya jawab (April 2013) menggunakan buffer output PHP saya pikir saya akan memposting tautan ke jawaban itu.

Juga baru saja menerbitkan plugin Abit Theme Theme Page Templat yang menyaring semua template halaman theme induk dari daftar dropdown templat di metabox Attributes Page ketika menambahkan atau mengedit "Halaman" WordPress .

MikeSchinkel
sumber
0

10 Juli 2012 - WordPress 3.4.1

Jawaban sebelumnya tidak berfungsi dan seperti yang dikatakan Rarst dalam komentar:

tema-tema yang terkait dengan internal mengalami refactoring besar dan perubahan API di 3.4, jadi banyak hal yang lebih tua tidak akan berfungsi

Solusi jQuery Cepat dan Kotor

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

Tidak Ada Kait untuk Itu?

Jika saya mengikuti jalur yang benar, ini adalah "aksi" yang terjadi ( /wp-includes/class-wp-theme.php), dan sepertinya tidak ada yang menghubungkan ...

/**
 * 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
sumber
Tiket trac
mrwweb