Làm cách nào để * xóa * mẫu trang chủ đề gốc khỏi chủ đề con?


17

Tôi đang sử dụng chủ đề TwentyTen để tạo chủ đề con, nhưng dường như tôi không thể thoát khỏi mẫu trang 'Một cột, không có thanh bên' trong chủ đề gốc TwentyTen.

Tôi nghĩ chỉ cần sao chép nó và xóa nội dung sẽ làm điều đó, nhưng có vẻ như không. Có ai biết cách để làm điều này không? Tôi chắc chắn rằng nó rất đơn giản.

Cảm ơn

osu

Câu trả lời:


11

Ghi đè lên mẫu đó sẽ dễ dàng hơn nhiều so với việc loại bỏ nó. Chỉ là cách logic đi.

Tôi không khẳng định đó là ý tưởng hiệu quả (ở đây muộn), nhưng điều này sẽ khiến nó bị thu hẹp từ màn hình chỉnh sửa:

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

Cảm ơn vì điều này, có vẻ như là một giải pháp tốt - khi bạn nói ghi đè lên mẫu, bạn có nghĩa là chỉ bao gồm một mẫu một cột trong đó không? Hay bạn có nghĩa là ghi đè nó bằng một mẫu mà tôi thực sự muốn sử dụng (tức là gọi nó là Một Cột nhưng nó thực sự có 2 hoặc 3 cột?)?
Osu

@Osu Ý tôi là ghi đè với mẫu tương tự của riêng bạn. Theo logic, rất dễ để chủ đề con thay đổi và thêm vào các mẫu của chủ đề gốc, nhưng thật khó để vô hiệu hóa chúng. Về cơ bản chủ đề con được cho là làm nhiều hơn chủ đề cha mẹ, không phải ít hơn. Và mã logic tuân theo nguyên tắc này.
Rarst

à, được rồi Cám ơn giải thích rõ ràng. Tôi sẽ tạo một mẫu một col cho họ sau đó. Chúc mừng
Osu

Đối với bất kỳ ai muốn xóa chủ đề khỏi danh sách thả xuống bằng jQuery, thì đây là một cách tiếp cận khác (không chắc đó có phải là cách tốt nhất không): pastie.org/3710683
Osu

2
Nội bộ liên quan đến chủ đề @brasofilo đã trải qua quá trình tái cấu trúc và thay đổi API lớn trong 3.4, vì vậy rất nhiều công cụ cũ sẽ không hoạt động
Rarst

29

WordPress 3.9 giới thiệu theme_page_templatesbộ lọc.

Ví dụ dưới đây từ chủ đề con Twenty Fourteenfunctions.php cho thấy cách xóa mẫu "Trang cộng tác viên":

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

3
Đây phải là câu trả lời được chấp nhận cập nhật cho WP 3.9+
helgatheviking

9

Mở rộng câu trả lời của @ Rarst, đây là một cách tiếp cận chung chung hơn, không bị ràng buộc với một chủ đề cụ thể, nhưng có thể được sử dụng bên trong hàm.php của chủ đề con bạn để loại bỏ bất kỳ mẫu trang chủ đề cha mẹ nào bạn muốn loại bỏ.

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

Vì vậy, bạn có thể sử dụng nó trong tệp tin.php của chủ đề con bạn như vậy:

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

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

Ở đây tôi chỉ minh họa rằng bạn không phải vượt qua phần ".php" nếu bạn không muốn.

Hoặc: remove_template( "sidebar-page" );- bạn không cần phải vượt qua một mảng nếu bạn chỉ muốn sửa đổi một tệp duy nhất.


6

Có một bộ lọc mới trong lõi WP (3.9) để xóa các mẫu trang. Nó có thể được sử dụng từ các chủ đề trẻ em.

Đây là cách để đạt được điều này trong TwentyTen (đã thử nghiệm trên 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_temsheet-hook-semaine-16-8033.html


Một liên kết ngoại vi trở nên vô dụng nếu liên kết thay đổi hoặc bị gỡ xuống. Điều này cũng không thực sự cố gắng trả lời câu hỏi
Tom J Nowell

Đủ công bằng, ví dụ thêm.
Marcio Duarte

1

Vì các câu trả lời trước không còn hoạt động ở đây trong các phiên bản hiện tại của WordPress và có một câu hỏi liên quan mà tôi vừa trả lời (tháng 4 năm 2013) bằng cách sử dụng bộ đệm đầu ra PHP, tôi cho rằng tôi đã đăng một liên kết đến câu trả lời đó.

Đồng thời, chỉ xuất bản plugin Mẫu trang chủ đề Omit để lọc tất cả các mẫu trang chủ đề gốc từ danh sách mẫu thả xuống trong siêu dữ liệu thuộc tính trang khi thêm hoặc chỉnh sửa "Trang" WordPress .


0

Ngày 10 tháng 7 năm 2012 - WordPress 3.4.1

Các câu trả lời trước không hoạt động và như Rarst đã nói trong một bình luận:

nội bộ liên quan đến chủ đề đã trải qua quá trình tái cấu trúc lớn và thay đổi API trong 3.4, vì vậy rất nhiều thứ cũ hơn sẽ không hoạt động

Giải pháp jQuery nhanh và bẩn

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

Không có móc cho điều đó?

Nếu tôi đi theo đúng đường dẫn, đây là nơi "hành động" xảy ra ( /wp-includes/class-wp-theme.php) và có vẻ như không có gì ở đây để nối vào ...

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.