Поддержка Проблемы и решения Не могу переопределить функцию.

  • Хочу изменить функцию ‘storefront_credit()’, но когда я копирую ее в functions.php дочерней темы, сайт виснет, хотя в родительской функция введена через ‘if ( ! function_exists( ‘storefront_credit’ ) ) {‘.
    Что не так?

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • А что пытаетесь сделать?
    Видимо надо удалить функцию и заменить на свой вариант

    add_action( 'init', 'custom_remove_footer_credit', 10 );
    
    function custom_remove_footer_credit () {
        remove_action( 'storefront_footer', 'storefront_credit', 20 );
        add_action( 'storefront_footer', 'custom_storefront_credit', 20 );
    }

    То, что я хотела, я уже сделала по-другому. Я удалила функцию с хука:
    ‘add_action(‘init’, function() {
    remove_action( ‘storefront_footer’, ‘storefront_credit’, 20);’,\
    потом дописала в footer.php то, что мне нужно.
    Но, Я НЕ ПОНИМАЮ!!!
    Если ф-я в родительской теме введена через проверку
    ‘if ( ! function_exists( ‘storefront_credit’ )’,
    то при загрузке родительской темы проверяется, есть ли ф-я с таким названием в дочерней, и, если есть, то родительская просто не выполняется.
    Почему мне не удается использовать именно эту функцию в дочерней??

    на самом деле, очень Хороший Вопрос.

    если в Родительской Теме, Функция определена без if(!function_exists) {}, а в Дочерней Теме эта же Функция определена с условием if(!function_exists) {}, то при инициализации сработает Функция из Дочерней Темы.

    если в Родительской Теме, Функция определена с условием if(!function_exists) {}, а в Дочерней Теме эта же Функция определена без if(!function_exists) {}, то при инициализации не сработает ни одна из Функций.

    если в Родительской Теме, Функция определена с условием if(!function_exists) {}, и в Дочерней Теме эта же Функция определена с условием if(!function_exists) {}, то при инициализации начнется веселуха, будут срабатывать обе Функции.

    если в обих Темах Функции определены без if(!function_exists) {}, то наступит колапс.

    Это мы еще не говорим о вызове самой Функции из Плагина или из Темы.

    если в Родительской Теме, Функция определена с условием if(!function_exists) {}, и в Дочерней Теме эта же Функция определена с условием if(!function_exists) {}, то при инициализации начнется веселуха, будут срабатывать обе Функции.

    Это как? Поток, что ли, раздвоится, походя породив еще одну параллельную Вселенную?

    В теории (https://wp-kama.ru/handbook/wordpress/loading например) function.php дочерней темы загружается первой, родительской после нее. Поэтому в в дочерней делать проверку несуществования функции (if(!…) смысла нет, родительские функции еще не загружены. А в родительской теме такая проверка отметает функцию, если ф-я с таким названием есть в дочерней теме.
    На практике, у меня на сайте работают три переопределенные функции, введенные без всяких if. Но, если с двумя из них проблем не было, то третья сначала вешала сайт, а на следующий день почему-то спокойно начала работать.
    Хотела переопределить четвертую, но она вообще не пошла. Вот мне и интересно, в чем дело.

    сайт виснет, хотя в родительской функция введена через ‘if ( ! function_exists( ‘storefront_credit’ ) ) {‘.
    Что не так?

    а в логах посмотрите, по какой причине сайт виснет то.
    при ошибке он должно четко падать, сразу же. а не виснуть.

    А он и падает (На сайте возникла критическая ошибка.). Простите ошибку в терминологии.

    в логах ошибок посмотрите точную причину.

    Спасибо, Flector. Все просто. Эту функцию я уже переписывала год назад и она уже была у меня в functions.php. А теперь я ее пыталась туда записать вторично.

    Поэтому в в дочерней делать проверку несуществования функции (if(!…) смысла нет, родительские функции еще не загружены.

    Я тоже так думал, пока не нарвался на 500 (уже точно не помню в какой ситуации). С тех пор не экономлю эти несколько байтиков.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    на самом деле, очень Хороший Вопрос.

    Ни одного попадания 🙂

    если в Родительской Теме, Функция определена без if(!function_exists) {}, а в Дочерней Теме эта же Функция определена с условием if(!function_exists) {}, то при инициализации сработает Функция из Дочерней Темы.

    Нет. Сначала загружается дочерняя тема, затем родительская. Если в родительской нет проверки на существование функции, при повторном определении будет фатальная ошибка.

    если в Родительской Теме, Функция определена с условием if(!function_exists) {}, а в Дочерней Теме эта же Функция определена без if(!function_exists) {}, то при инициализации не сработает ни одна из Функций.

    Нет. Сработает функция из дочерней темы.

    если в Родительской Теме, Функция определена с условием if(!function_exists) {}, и в Дочерней Теме эта же Функция определена с условием if(!function_exists) {}, то при инициализации начнется веселуха, будут срабатывать обе Функции.

    Квантовая суперпозиция в PHP? Нет, сработает только функция из дочерней темы, как и в предыдущем случае.

    если в обих Темах Функции определены без if(!function_exists) {}, то наступит колапс.

    А вот тут верно. Будет фатальная ошибка, как и в первом случае.

Просмотр 11 ответов — с 1 по 11 (всего 11)