Bir ana tema sayfası şablonunu alt temadan * nasıl kaldırırım *?


17

Bir alt tema oluşturmak için TwentyTen temasını kullanıyorum, ancak TwentyTen üst temasında bulunan 'Bir sütun, kenar çubuğu yok' sayfa şablonundan kurtulamıyorum.

Ben sadece kopyalamak ve içeriği silmek hile yapacağını düşündüm, ama öyle görünmüyor. Bunu nasıl yapacağını bilen var mı? Eminim çok basit.

Teşekkürler

osu

Yanıtlar:


11

Bu şablonu geçersiz kılmak, şablondan kurtulmaktan çok daha kolay olurdu. Tam mantığın gidişatı.

Etkili bir fikir olduğunu iddia etmiyorum (buraya geç), ancak bu düzenleme ekranından çekildi:

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

Bunun için teşekkürler, bu iyi bir çözüm gibi görünüyor - şablonu geçersiz kıldığınızı söylediğinizde, yine de oraya bir sütun şablonu eklemeyi mi kastediyorsunuz? Ya da aslında kullanmak istediğim bir şablonla geçersiz kılmayı mı kastediyorsunuz (yani bir Sütun olarak adlandırın, ancak aslında 2 veya 3 sütunu var mı?)?
Osu

@Osu Kendi benzer şablonunuzla geçersiz kılmak istedim. Mantıka gelince, çocuk temasının değiştirilmesi ve ana temanın şablonlarına eklenmesi kolaydır, ancak bunları devre dışı bırakmak zordur. Temel olarak alt temanın ana temadan daha fazlasını değil, daha azını yapması gerekir. Kod mantığı da bu prensibi izler.
Rarst

Ah tamam. Temizlediğin için teşekkürler. O zaman onlar için bir col şablonu oluşturacağım. Şerefe
Osu

Temayı jQuery kullanarak açılır listeden kaldırmak isteyen herkes için, o zaman bu başka bir yaklaşımdır (bunun en iyi yol olup olmadığından emin değilim): pastie.org/3710683
Osu

2
@brasofilo temasıyla ilgili iç öğeler 3.4'te büyük yeniden düzenleme ve API değişikliklerinden geçti, bu yüzden birçok eski şey çalışmaz
Rarst

29

WordPress 3.9 bir theme_page_templatesfiltre sunar.

Yirmi Ondört alt temasından aşağıdaki örnek functions.php, "Katılımcı Sayfası" şablonunun nasıl kaldırılacağını gösterir:

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

3
Bu, WP 3.9+ için güncel kabul edilmiş cevap olmalıdır
helgatheviking

9

@ Rarst'ın cevabına genişleyerek, belirli bir temaya bağlı olmayan, ancak kendi alt temanızın işlevlerinde kullanılabilecek daha genel bir yaklaşım var.

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

Böylece, çocuğunuzun theme.php dosyasında şöyle kullanabilirsiniz:

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

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

Burada sadece ".php" bölümünü geçmek istemediğinizi gösteriyorum.

Veya: remove_template( "sidebar-page" );- yalnızca tek bir dosyayı değiştirmek istiyorsanız bir dizi iletmeniz gerekmez.


6

WP çekirdeğinde (3.9) sayfa şablonlarını kaldırmak için yeni bir filtre var. Çocuk temalarından kullanılabilir.

Bunu TwentyTen'de (WP 3.9'da test edildi) nasıl başaracağınız aşağıda açıklanmıştır:

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


Bağlantı değişirse veya kaldırılırsa, bir site dışı bağlantı işe yaramaz hale gelir. Bu ayrıca soruyu gerçekten cevaplamak için hiçbir girişimde
bulunmaz

Yeterince adil, örnek eklendi.
Marcio Duarte

1

Önceki cevaplar artık WordPress'in mevcut sürümlerinde çalışmadığından ve bir PHP çıktı arabelleği kullanarak yeni yanıtladığım (Nisan 2013) ilgili bir soru olduğundan, bu cevaba bir bağlantı göndereceğimi düşündüm .

Ayrıca, bir WordPress "Sayfası" eklerken veya düzenlerken Sayfa Nitelikleri meta kutusundaki şablonların açılır listesinden tüm ana tema sayfası şablonlarını filtreleyen Üst Tema Sayfa Şablonlarını Atla eklentisini de yayınladık .


0

10 Temmuz 2012 - WordPress 3.4.1

Önceki cevaplar çalışmıyor ve Rarst'ın bir yorumda söylediği gibi:

temayla ilgili iç öğeler 3.4'te büyük yeniden düzenleme ve API değişikliklerinden geçti, bu nedenle daha eski şeyler işe yaramayacak

Hızlı ve Kirli jQuery Çözümü

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

Bunun için kanca yok mu?

Doğru yolu izlersem, "eylem" in gerçekleştiği yer ( /wp-includes/class-wp-theme.php) ve burada asılacak hiçbir şey yok gibi görünüyor ...

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.