วิธี * ลบ * เทมเพลตหน้าธีมพาเรนต์ออกจากธีมย่อย?


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 ฉันหมายถึงการเอาชนะด้วยเทมเพลตที่คล้ายกันของคุณเอง เท่าที่ตรรกะดำเนินไปมันเป็นเรื่องง่ายสำหรับธีมลูกที่จะเปลี่ยนและเพิ่มแม่แบบของธีมหลัก แต่ยากที่จะปิดการใช้งาน โดยทั่วไปธีมลูกควรจะทำมากกว่าธีมหลักไม่น้อย และตรรกะรหัสตามหลักการนี้
Rarst

อาโอเค. ขอบคุณที่ล้างข้อมูล ฉันจะสร้างเทมเพลต col หนึ่งอันสำหรับพวกเขาแล้ว ไชโย
Osu

สำหรับผู้ที่ต้องการลบชุดรูปแบบจากรายการแบบหล่นลงโดยใช้ jQuery นี่เป็นอีกวิธีหนึ่ง (ไม่แน่ใจว่าเป็นวิธีที่ดีที่สุดหรือไม่): pastie.org/3710683
Osu

2
@brasofilo internals ที่เกี่ยวข้องกับชุดรูปแบบได้รับการปรับเปลี่ยนครั้งใหญ่และการเปลี่ยนแปลง 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.php ของชุดรูปแบบลูกของคุณเองเพื่อ nuke แม่แบบชุดรูปแบบหน้าแม่แบบที่คุณต้องการกำจัด

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 core (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

ยุติธรรมพอตัวอย่างเพิ่ม
Marcio Duarte

1

เนื่องจากคำตอบก่อนหน้านี้ไม่ทำงานที่นี่ใน WordPress รุ่นปัจจุบันอีกต่อไปและมีคำถามที่เกี่ยวข้องซึ่งฉันเพิ่งตอบ(เมษายน 2013)โดยใช้บัฟเฟอร์เอาต์พุต PHP ฉันคิดว่าฉันจะโพสต์ลิงก์ไปยังคำตอบนั้น

นอกจากนี้เพิ่งเผยแพร่ปลั๊กอินOmit Parent Theme Page Templatesที่กรองเทมเพลตหน้าธีมหลักทั้งหมดจากรายการแบบเลื่อนลงของเทมเพลตใน Page Attributes metabox เมื่อเพิ่มหรือแก้ไข WordPress "หน้า"


0

10 กรกฎาคม 2555 - WordPress 3.4.1

คำตอบก่อนหน้านี้ไม่ทำงานและอย่างที่ Rarst พูดในความคิดเห็น:

internals ที่เกี่ยวข้องกับชุดรูปแบบต้องผ่านการปรับโครงสร้างครั้งใหญ่และการเปลี่ยนแปลง API ใน 3.4 ดังนั้นสิ่งที่เก่ากว่าจำนวนมากจะไม่ทำงาน

jQuery Solution ที่รวดเร็วและสกปรก

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.