osu
  • 0
Новичок

Как *удалить* шаблон страницы родительской темы из дочерней темы?

  • 0

Я использую тему TwentyTen для создания дочерней темы, но не могу избавиться от шаблона страницы «Один столбец, без боковой панели», который находится в родительской теме TwentyTen.

Я думал, что просто скопировать его и удалить содержимое поможет, но, похоже, нет. Кто-нибудь знает как это сделать? Я уверен, что это очень просто.

Спасибо

осу

Share
  1. Переопределить этот шаблон было бы намного проще, чем избавиться от него. Как раз по логике.

    Я не утверждаю, что это эффективная идея (поздно здесь), но это уничтожит ее с экрана редактирования:

    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] );
    }
    
    • 0
  2. WordPress 3.9 представляет theme_page_templates фильтр.

    В приведенном ниже примере из дочерней темы Twenty Fourteenfunctions.php показано, как удалить шаблон «Страница участника»:

    function tfc_remove_page_templates( $templates ) {
        unset( $templates['page-templates/contributors.php'] );
        return $templates;
    }
    add_filter( 'theme_page_templates', 'tfc_remove_page_templates' );
    
    • 0
  3. Расширяя ответ @Rarst, вот более общий подход, который не привязан к конкретной теме, но может использоваться внутри functions.php вашей собственной дочерней темы для уничтожения любых шаблонов страниц родительской темы, от которых вы хотите избавиться.

    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" ); — вам не нужно передавать массив, если вы хотите изменить только один файл.

    • 0
  4. В ядре WP (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

    • 0
  5. Поскольку предыдущие ответы больше не работают здесь в текущих версиях WordPress, и был связанный вопрос, на который я только что ответил (апрель 2013 г.), используя выходной буфер PHP, я решил опубликовать ссылку на этот ответ.

    Также только что опубликован плагин Omit Parent Theme Page Templates, который отфильтровывает все шаблоны страниц родительской темы из выпадающего списка шаблонов в метабоксе «Атрибуты страницы» при добавлении или редактировании «Страницы» WordPress.

    • 0
  6. 10 июля 2012 г. — WordPress 3.4.1

    Предыдущие ответы не работают, и, как сказал Рарст в комментарии:

    Внутренние элементы, связанные с темой, подверглись серьезному рефакторингу и изменениям API в версии 3.4, поэтому многие старые вещи не будут работать.

    Быстрое и грязное решение 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
        }
    }
    

    Нет крючка для этого?

    Если я следовал правильному пути, то здесь происходит «действие» ( /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;
    }
    
    • 0

Оставить ответ

You must login to add an answer.