Переопределить часть родительской темы WordPress с фильтром

Не уверен, что это возможно сделать, но я пытаюсь переопределить небольшую часть в файле template_tags.php родительской темы. Я попытался скопировать тот же файл в свою дочернюю тему, но, похоже, он не переопределяет файл. Поэтому мне интересно, нужно ли мне использовать фильтр, чтобы заставить его измениться, но я не уверен, как это сделать.

Вот что я пытаюсь изменить:

            <?php if(has_header_image()){?>

            <?php
            $headerImage = get_header_image();
            if(class_exists('woocommerce')){
                if( is_woocommerce() || is_product() || is_cart() || is_shop() ){
                    $thumbId = get_post_thumbnail_id();
                    $thumbImage = wp_get_attachment_url( $thumbId );
                }

                if(!empty($thumbImage)){
                    $headerImage = $thumbImage;
                }
            }
            ?>
            <div class="rellax">
                <img src="<?php echo esc_url( $headerImage ); ?>">
            </div>
            <?php } ?>

к чему-то вроде этого:

<?php if(has_header_image()){?>

                <?php
                $headerImage = get_header_image();
                if(class_exists('woocommerce')){
                    if( is_woocommerce() || is_product() || is_cart() || is_shop() ){
                        $thumbId = get_post_thumbnail_id();
                        $thumbImage = wp_get_attachment_url( $thumbId );
                    }

                    if(!empty($thumbImage)){
                        $headerImage = $thumbImage;
                    }
                }
                ?>
                <div class="rellax">
                    <?php if ( has_post_thumbnail() ): ?>
                        <?php the_post_thumbnail(); ?>
                    <?php else : ?>
                        <img src="<?php echo esc_url( $headerImage ); ?>">
                    <?php endif; ?>
                </div>
            <?php } ?>

В целом все, что я действительно пытаюсь добавить/обновить, это эта часть:

<div class="rellax">
                    <?php if ( has_post_thumbnail() ): ?>
                        <?php the_post_thumbnail(); ?>
                    <?php else : ?>
                        <img src="<?php echo esc_url( $headerImage ); ?>">
                    <?php endif; ?>
                </div>

Я знаю, что это кажется излишним для такой мелочи, но я не хочу изменять файл непосредственно в родительской теме, если есть обновление файла, и оно стирает все изменения, которые я добавил.

Опять же, не уверен, что это возможно или лучший подход.

Вот полная функция, в которую она завернута:

if( !function_exists('business_idea_breadcrumbs')){
    function business_idea_breadcrumbs(){
        $business_idea_option = wp_parse_args(  get_option( 'business_idea_option', array() ), business_idea_default_data() );
        ?>
        <section class="sub-header">

            <?php if(has_header_image()){?>

                <?php
                $headerImage = get_header_image();
                if(class_exists('woocommerce')){
                    if( is_woocommerce() || is_product() || is_cart() || is_shop() ){
                        $thumbId = get_post_thumbnail_id();
                        $thumbImage = wp_get_attachment_url( $thumbId );
                    }

                    if(!empty($thumbImage)){
                        $headerImage = $thumbImage;
                    }
                }
                ?>
                <div class="rellax">
                    <?php if ( has_post_thumbnail() ): ?>
                        <?php the_post_thumbnail(); ?>
                    <?php else : ?>
                        <img src="<?php echo esc_url( $headerImage ); ?>">
                    <?php endif; ?>
                </div>
            <?php } ?>

            <?php if(has_header_image()){?>
                <div class="sub-header-overlay">
                <?php } ?>
                <div class="container sub-header-container">
                    <div class="row">
                        <div class="col-md-12 text-center">
                            <?php
                            if( function_exists('bcn_display') ){
                                bcn_display();
                            }else if( is_front_page() && is_home() ){
                                echo '<h1 class="page_title">' . __('Home','business-idea') . '</h1>';
                            }else if( is_archive() ){
                                the_archive_title( '<h1 class="page_title">', '</h1>' );
                                the_archive_description( '<div class="taxonomy-description">', '</div>' );
                            }else{
                                ?>
                                <h1 class="page_title"><?php single_post_title(); ?></h1>
                                <?php
                            }
                            ?>
                        </div>
                    </div>
                </div>
                <?php if(has_header_image()){?>
                </div>
            <?php } ?>
        </section>
        <?php
    }
}

person ultraloveninja    schedule 13.08.2019    source источник
comment
Не могли бы вы опубликовать полное определение функции из темы? Есть ли что-то вроде if ( ! function_exists( 'functionname' ) ) раньше? Поскольку вызова apply_filter нет, вы не можете просто отфильтровать вывод, вам нужно переопределить функцию либо в вызывающем ее шаблоне, либо путем ее повторного определения.   -  person user127091    schedule 13.08.2019
comment
@ user127091 - Аааа, да. Хорошо, я обновил свой пост. Спасибо!   -  person ultraloveninja    schedule 13.08.2019


Ответы (1)


Как указано в моем комментарии, применение фильтра будет работать только в том случае, если в исходном коде будет соответствующий вызов «apply_filter» для того, что вы пытаетесь изменить. В этом случае вам придется полностью переопределить функцию, скопировав ее в дочернюю тему и удалив

if( !function_exists('business_idea_breadcrumbs')){

плюс последняя закрывающая скобка.

Таким образом, функция будет существовать, когда родительская функция запустит проверку function_exists. Затем просто измените функцию в ребенке в соответствии с вашими потребностями.

person user127091    schedule 13.08.2019
comment
Окей круто. Похоже, это работает. Да, это единственное, в чем я никогда не был уверен, так это в том, где точно что-то менять и обновлять при работе с отношениями родительской/дочерней темы. Спасибо! - person ultraloveninja; 13.08.2019