Возврат переменной из файла шаблона в функцию в function.php

Вопрос или проблема

Я надеюсь, что кто-то сможет мне помочь. У меня есть этот кусок кода в моем function.php:

function initiative($args, $post_type)
{
  if ($post_type == "initiative") {
    global $initiative_url;
    $initiative_url="buhh/biffy";
    $args['rewrite'] = array(
      // это правильно переписывает в URL /initiative/ на /buhh/biffy, так как это объявлено в переменной $initiative_url в этом файле, но я хочу, чтобы он ссылался на значение, заданное в шаблоне single-initiative.php
      'slug' => $initiative_url
    );
  }
  return $args;
}
add_filter('register_post_type_args', 'initiative', 20, 2);

Внутри шаблона single-initiative.php у меня есть этот код:

if (isset($all_fields['parent_post']) && !empty($all_fields['parent_post'])) {
    foreach ($all_fields['parent_post'] as $parent_post_details) {
        $parent_post = get_fields($parent_post_details->ID);
        $parent_post_id = $parent_post_details->ID;
        $parent_post_permalink;
        $parent_post_permalink = get_permalink($parent_post_id);
        $initiative_url = preg_replace('/^https?:\/\/[^\/]+\.com\//', '', $parent_post_permalink);
    }
}

Внутри этого поста переменная приводит к следующему результату: staff/nick. Я попробовал с добавлением и без добавления global перед $initiative_url в single-initiative.php, и это, похоже, не имеет значения.

Мне нужно, чтобы значение, хранимое в этой переменной, передавалось в файл functions.php и правильно назначалось этому для переписывания.
Если я удалю $initiative_url=”buhh/biffy” из function.php, категория поста возвращается в URL, поэтому я просто оставляю это там для уверенности, что этот код работает. Я просто не уверен, как передать нужное значение в эту переменную для использования.

Ответ или решение

В данной ситуации вам необходимо связать значение переменной $initiative_url, определенной в файле шаблона single-initiative.php, с функцией initiative в functions.php. Это требует понимания, как в WordPress передаются данные между шаблонами и файлами функций, а также как использовать глобальные переменные и фильтры.

Теория

Когда мы говорим о шаблонах и файлах функций в WordPress, нужно учитывать, что шаблоны обслуживают отображение контента, а файлы функций обычно содержат логику обработки и настройки поведения. Ваша задача — передать переменную из файла single-initiative.php в functions.php, чтобы использовать её в фильтре register_post_type_args для настройки URL.

В PHP и WordPress для обмена данными между файлами можно использовать глобальные переменные, объекты или, что зачастую более практично, определенные хуки и фильтры. Также возможен подход с использованием базы данных или пользовательских полей, если переменная должна сохраняться и быть доступной между разными запросами.

Пример

В вашем коде вы пытаетесь напрямую использовать переменную $initiative_url как глобальную, однако, кажется, это не работает именно так, как ожидалось. Использование глобальных переменных может быть нестабильным из-за области видимости и порядка загрузки файлов. Посмотрим, как можно решить вашу задачу более надежным способом.

  1. Использование фильтров и динамически создаваемых значений:

    Для передачи значения из шаблона в функции можно использовать специальные хуки. Например, добавить к single-initiative.php внутри цикла следующее:

    if (isset($all_fields['parent_post']) && !empty($all_fields['parent_post'])) {
       foreach ($all_fields['parent_post'] as $parent_post_details) {
           $parent_post = get_fields($parent_post_details->ID);
           $parent_post_permalink = get_permalink($parent_post_details->ID);
           $initiated_url = preg_replace('/^https?:\/\/[^\/]+\.com\//', '', $parent_post_permalink);
    
           // Записываем значение в глобальный объект или запускаем фильтр
           apply_filters('set_custom_initiative_url', $initiated_url);
       }
    }
  2. Использование функции add_filter в functions.php для записи и чтения значения:

    В functions.php, определите поведение для фильтра:

    function set_custom_url($url) {
       // Здесь вы можете сохранить значение в объекте, который будет использоваться позже
       global $wp_custom_initiative_url;
       $wp_custom_initiative_url = $url;
    }
    add_filter('set_custom_initiative_url', 'set_custom_url');
    
    function initiative($args, $post_type) {
       if ($post_type == "initiative") {
           global $wp_custom_initiative_url;
           // использует записанное значение
           $args['rewrite'] = array(
               'slug' => $wp_custom_initiative_url ? $wp_custom_initiative_url : "buhh/biffy"
           );
       }
       return $args;
    }
    
    add_filter('register_post_type_args', 'initiative', 20, 2);

Применение

Использование фильтров и глобальных объектов вместо глобальных переменных может обеспечить вам более надежное управление данными. В данном случае мы создаем фильтр set_custom_initiative_url, который позволяет передать значение из шаблона в файл функций. Это хороший подход, так как он поддерживает динамическое обновление и обработку URL, а также улучшает общую читаемость и поддержку кода.

Теперь, при вызове параметров регистрации для post type initiative, будет использовано правильное значение из вашего шаблона. Такой подход также будет масштабируемым, если в будущем вам потребуется передавать больше данных или использовать их в других шаблонах или функциях.

Преимущество использования WV или подобных объектов заключается в упрощении поддержки кода, обеспечении его предсказуемости и гибкости в использовании. Также подобная структура позволяет вам в будущем безболезненно добавлять новые фичи и интеграции.

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

Оцените материал
Добавить комментарий

Капча загружается...