Вопрос или проблема
Я надеюсь, что кто-то сможет мне помочь. У меня есть этот кусок кода в моем 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
как глобальную, однако, кажется, это не работает именно так, как ожидалось. Использование глобальных переменных может быть нестабильным из-за области видимости и порядка загрузки файлов. Посмотрим, как можно решить вашу задачу более надежным способом.
-
Использование фильтров и динамически создаваемых значений:
Для передачи значения из шаблона в функции можно использовать специальные хуки. Например, добавить к
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); } }
-
Использование функции 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, обеспечивая при этом легкость управления и способности к дальнейшему расширению приложения.