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

  • Решено vakho114

    (@vakho114)


    Есть моя тема mytheme, созданная при помощи underscores.me.
    Есть моя дочерняя тема mytheme-child.

    В дочерней теме есть файл file.php по адресу
    /mytheme-child/template-parts/myTemplateParts/file.php
    (это его полный текст), который содержит функцию buildMainMenu():
    ———————————————————

    <?php
      echo('</br>HELLO, buildMainMenu()</br>');
      function buildMainMenu(){
        echo('</br>buildMainMenu: I have been started !</br>');
      }

    В дочерней теме есть файл /mytheme-child/functions.php
    (это его полный текст), который загружает (включает)
    файл file.php:
    ——————————————————-

    <?php
     echo('</br>START require "/template-parts/myTemplateParts/file.php"</br>');
     require get_stylesheet_directory_uri() . '/template-parts/myTemplateParts/file.php';
     echo('</br>END require</br>');

    В дочерней теме есть файл header.php
    /mytheme-child/header.php, в котором
    вызывается функция buildMainMenu() из file.php
    ——————————-

    <HTML-код...>
    <?php
        echo('</br>HELLO, DOLLY !</br>');
        buildMainMenu();
    ?>
    <HTML-код...>

    Запускаю свою страницу.
    На экран выходят сообщения (echo):
    START require — в functions.php запускается require
    HELLO, buildMainMenu() — загрузился file.php
    END require — в functions.php завершил работу require
    HELLO, DOLLY ! — заработал header.php
    Fatal error: Uncaught Error: Call to undefined function buildMainMenu() in…

    Если текст функции перенести из file.php в файл functions.php,
    выбросив оператор require, — всё работает.

    Что не так ?

    В PHP-инструкции говорится, что «…все функции и классы,
    объявленные во включаемом файле, имеют глобальную область видимости.»

    Где я ошибся ?

    Спасибо !

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Юрий

    (@yube)

    В обязательном порядке подключается только functions.php темы. Шаблоны, а тем более частичные шаблоны подключаются по мере необходимости. То есть, Ваш /mytheme-child/template-parts/myTemplateParts/file.php вряд ли будет подключен до скрипта header.php, а потому функция buildMainMenu() на момент выполнения header.php не будет существовать.

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

    Юрий:
    Значит, несмотря на то, что оператор require в functions.php
    отработал штатно, функции buildMainMenu() нет. Интересно-интересно.
    Я посмотрел functions.php из материнской темы. Так там при
    помощи require загружено большое количество всяких файлов.
    И я решил сделать декомпозицию программ, чтобы не валить
    их всех в один файл functions.php.

    А как происходит «оживление» функций из благополучно загруженных
    PHP-файлов ? Кто подключает их «по мере необходимости» ?

    Спасибо.

    Модератор Юрий

    (@yube)

    Ой, я проморгал, извините.
    require get_stylesheet_directory_uri()
    Что тут делает uri?
    Не знаю, может, и можно подгрузить скрипт по http, но это, как минимум, странно для локального файла.

    Сделайте в отладочном выводе полные пути к подключаемым файлам. Это проще увидеть глазами, чем мысленно компилировать.

    Мне кажется, Вы перемудрили с дочерней и подключением скриптов из папки для шаблонов.

    Юрий:

    Большое спасибо вам за то, что обратили моё внимание
    на get_stylesheet_directory_uri(). Вместо этой функции
    я поставил get_stylesheet_directory() — полный локальный путь
    до дочерней папки. Включил страницу, и всё заверте….

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