Вопрос или проблема
Мне нужно получить значение пользовательского поля в файле functions.php. У меня уже есть вот что. Я могу получить значение на шаблоне страницы, но в этом случае оно нужно в файле functions.php, потому что мне нужно это значение в функции facewp.
add_filter( 'facetwp_preload_url_vars', function( $url_vars ) {
$offer_id = get_field('offer_type'); // нужно это значение с текущей страницы
$term = get_term( $offer_id, 'offer' ); // offer = слаг таксономии
$slug = $term->slug;
if ( empty( $url_vars['offer_type'] ) ) {
$url_vars['offer_type'] = [$slug];
}
return $url_vars;
} );
Как я могу этого добиться? Сейчас я получаю пустую переменную.
Найдено решение:
add_filter( 'facetwp_preload_url_vars', function( $url_vars ) {
// получаем ID текущей страницы
$url="http://" . $_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'REQUEST_URI' ];
$current_post_id = url_to_postid( $url );
// получаем offer_type (пользовательское поле) по ID текущей страницы
$offer_id = get_field('offer_type', $current_post_id); // возвращает ID
// получаем слаг таксономии по offer_id
$term = get_term( $offer_id, $taxonomy );
$slug = $term->slug;
// предвыбираем фасет offer_type
if ( empty( $url_vars['offer_type'] ) ) {
if($slug) {
$url_vars['offer_type'] = [$slug];
}
}
return $url_vars;
} );
Ответ или решение
Чтобы получить значение пользовательского поля в файле functions.php вашего проекта WordPress, необходимо учитывать, что данный файл не выполняется в контексте конкретной страницы, а обрабатывается на глобальном уровне. Однако вы можете использовать различные подходы для извлечения данных конкретной страницы.
Решение задачи
На основе вашего кода и описания проблемы, вы уже нашли решение, но давайте подробно рассмотрим его.
add_filter('facetwp_preload_url_vars', function($url_vars) {
// Получение ID текущей страницы
$url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$current_post_id = url_to_postid($url);
// Получение значения пользовательского поля offer_type по ID текущей страницы
$offer_id = get_field('offer_type', $current_post_id); // возвращает ID
// Получение слага таксономии по offer_id
$term = get_term($offer_id, 'offer'); // 'offer' — это слаг вашей таксономии
$slug = $term->slug;
// Предустановка фасета offer_type
if (empty($url_vars['offer_type'])) {
if ($slug) {
$url_vars['offer_type'] = [$slug];
}
}
return $url_vars;
});
Подробное объяснение:
-
Получение ID текущей страницы:
- Используется
$_SERVER['REQUEST_URI']
для формирования полного URL текущей страницы. Затем с помощью функцииurl_to_postid()
извлекается ID поста. Это необходимо, так как файлfunctions.php
не знает, какая именно страница загружается.
- Используется
-
Получение значения пользовательского поля:
get_field('offer_type', $current_post_id)
используется для получения значения поляoffer_type
для конкретной страницы, используя её ID. Это значение может быть как текстом, так и ID другой сущности (например, термина таксономии).
-
Извлечение слага термина:
- Функция
get_term()
позволяет получить объект термина, связанного с ID, полученным на предыдущем шаге. Это важно для реализации фильтрации или предустановки значений.
- Функция
-
Настройка переменных URL:
- Проверка на пустоту элемента массива
$url_vars['offer_type']
позволяет установить значение только тогда, когда оно не было установлено ранее. Это предотвращает перезапись и гарантирует, что значение будет добавлено только при необходимости.
- Проверка на пустоту элемента массива
Важно помнить:
- Убедитесь, что идентификатор, который вы получаете из пользовательского поля, действительно соответствует ID термина, который вы хотите использовать. Это может потребовать дополнительной валидации в зависимости от вашей структуры данных.
- Если вы используете кастомную таксономию, убедитесь, что указали её правильно в
get_term()
. - Тестируйте изменения в безопасной среде, прежде чем переносить на продакшн-сайт.
Заключение
Работа с пользовательскими полями в WordPress требует понимания контекста, в котором вы работаете. Использование подхода, основанного на получении ID текущего поста, позволяет динамически получать значения и эффективно использовать их в фильтрах, таких как facetwp_preload_url_vars
. Надеюсь, что это объяснение помогло прояснить процесс получения значений пользовательских полей для использования в файле functions.php
.