• DONATE to NULLED!
    Вы можете помочь Форуму и команде, поддержать финансово.
    starwanderer - модератор этого раздела будет Вам благодарен!

Помощь Переопределение function.php в дочерней теме

denism300

Постоялец
Регистрация
10 Май 2014
Сообщения
129
Реакции
4
Скажу сразу, WP я еще только начинаю изучать, поэтому, не пинайте, если что :)

Понадобилось переопределить функцию из файла function.php с целью добавления позиций виджетов.
Покурил мануалы, сделал так.
function.php родительской темы:
Код:
function web2feel_widgets_init() {
    register_sidebar( array(
        'name'          => __( 'Sidebar', 'web2feel' ),
        'id'            => 'sidebar-1',
        'before_widget' => '<aside id="%1$s" class="widget %2$s">',
        'after_widget'  => '</aside>',
        'before_title'  => '<h2 class="widget-title">',
        'after_title'   => '</h2>',
    ));
   
    register_sidebar(array(
        'name' => 'Footer',
        'before_widget' => '<div class="botwid col-sm-6 col-md-3 %2$s">',
        'after_widget' => '</div>',
        'before_title' => '<h2 class="bothead">',
        'after_title' => '</h2>',
    ));   
}

переопределил согласно мануалу в файл function.php дочерней темы, добавив еще одну позицию для виджетов:
Код:
<?php
if( ! function_exists('web2feel_widgets_init')):
    function web2feel_widgets_init() {
        register_sidebar( array(
            'name'          => __( 'Sidebar', 'web2feel' ),
            'id'            => 'sidebar-1',
            'before_widget' => '<aside id="%1$s" class="widget %2$s">',
            'after_widget'  => '</aside>',
            'before_title'  => '<h2 class="widget-title">',
            'after_title'   => '</h2>',
        ));
   
        register_sidebar(array(
            'name' => 'Footer',
            'before_widget' => '<div class="botwid col-sm-6 col-md-3 %2$s">',
            'after_widget' => '</div>',
            'before_title' => '<h2 class="bothead">',
            'after_title' => '</h2>',
        ));
   
        register_sidebar(array(
            'name' => 'Header',
            'before_widget' => '<div class="login-menu">',
            'after_widget' => '</div>',
            'before_title' => '<h2 class="widget-title">',
            'after_title' => '</h2>',
        ));   
    }
   
endif;
?>

и не работает. вместо сайта - белая страница, в логах следующая запись:
[20-Jan-2016 11:37:30 UTC] PHP Fatal error: Cannot redeclare web2feel_widgets_init() (previously declared in \wp-content\themes\Zenith-child\functions.php:5) in \wp-content\themes\Zenith\functions.php on line 109
 
Такая строка должна быть в родительской теме в первую очередь.
if( ! function_exists('web2feel_widgets_init')) :

Вообще никто не запрещает создать свою функцию с инициализацией своих сайдбаров, убрать только инициализацию "родительского" сайдбара.

function web2feel_widgets_init() {

переназвать в какойнить
function my_widgets_init() {

ну и добавить в конце или вначале
add_action( 'widgets_init', 'my_widgets_init' );

Т.е. весь код примерно такой

add_action( 'widgets_init', 'my_widgets_init' );
function my_widgets_init() {
register_sidebar(array(
'name' => 'Footer',
'before_widget' => '<div class="botwid col-sm-6 col-md-3 %2$s">',
'after_widget' => '</div>',
'before_title' => '<h2 class="bothead">',
'after_title' => '</h2>',
));

register_sidebar(array(
'name' => 'Header',
'before_widget' => '<div class="login-menu">',
'after_widget' => '</div>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
));

}
 
Такая строка должна быть в родительской теме в первую очередь.
if( ! function_exists('web2feel_widgets_init')) :
в родительской теме объявление виджетов в такую конструкцию не обернуто

сделал так:
Код:
<?php
    remove_action( 'widgets_init', 'web2feel_widgets_init' );
   
    function my_widgets_init() {
        register_sidebar( array(
            'name'          => __( 'Sidebar', 'web2feel' ),
            'id'            => 'sidebar-1',
            'before_widget' => '<aside id="%1$s" class="widget %2$s">',
            'after_widget'  => '</aside>',
            'before_title'  => '<h2 class="widget-title">',
            'after_title'   => '</h2>',
        ));
   
        register_sidebar(array(
            'name'             => 'Footer',
            'before_widget' => '<div class="botwid col-sm-6 col-md-3 %2$s">',
            'after_widget'     => '</div>',
            'before_title'     => '<h2 class="bothead">',
            'after_title'     => '</h2>',
        ));
   
        register_sidebar(array(
            'name'             => 'Header',
            'before_widget' => '<div class="login-menu">',
            'after_widget'    => '</div>',
            'before_title'     => '<h2 class="widget-title">',
            'after_title'     => '</h2>',
        ));   
    }
    add_action( 'widgets_init', 'my_widgets_init' );
?>

но, почему-то код
Код:
remove_action( 'widgets_init', 'web2feel_widgets_init' );
не срабатывает. и у меня получилось 1 позиция Sidebar (странно, почему только одна?), 2 позиции Footer и одна Header
в итоге, я в конечном итоге сделал так:
Код:
<?php
   
    function my_widgets_init() {
        register_sidebar( array(
            'name'          => __( 'Sidebar', 'web2feel' ),
            'id'            => 'sidebar-1',
            'before_widget' => '<aside id="%1$s" class="widget %2$s">',
            'after_widget'  => '</aside>',
            'before_title'  => '<h2 class="widget-title">',
            'after_title'   => '</h2>',
        ));
   
        register_sidebar(array(
            'name'             => 'Header',
            'before_widget' => '<div class="login-menu">',
            'after_widget'    => '</div>',
            'before_title'     => '<h2 class="widget-title">',
            'after_title'     => '</h2>',
        ));   
    }
    add_action( 'widgets_init', 'my_widgets_init' );
?>
 
в родительской теме объявление виджетов в такую конструкцию не обернуто
Вот в том то и проблема. Т.е. по уму должно быть обернуто как минимум в родительской, желательно и в дочерней. Но функции дочерней в приоритете.

А у этого
remove_action( 'widgets_init', 'web2feel_widgets_init' );

скорей всего приоритет не дает сделать римув. надо смотреть как web2feel_widgets_init() инициализируется в родительской. есть ли приоритет.
теоретически можно попробовать сделать
remove_action( 'widgets_init', 'web2feel_widgets_init', 9999 );
Но если работает 2й вариант, то я бы инициализацию родительской не трогал. Вдруг в будущих версиях добавят разрабы чегонить новое.
 
Кстати, вроде как id в инициализации сайдбара обязательный аргумент, по крайней мере потом проще обращаться к нему собственно по id
т.е. так

'name' => 'Header',
'id' => 'header',
'before_widget' => '<div class="login-menu">',
'after_widget' => '</div>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
 
Назад
Сверху