Отображение всех значений произвольного поля, созданного с помощью ACF на странице
Я использую Advanced Custom Fields / ACF для создания произвольных полей. Одно из них - список чекбоксов, которые отображают некоторые опции (опция1, опция2, опция3...).
Теперь я хочу отобразить все опции этого поля на отдельной странице во фронтенде следующим образом:
Опции:
- опция 1
- опция 2
- опция 3
- ...
Как я могу получить все опции с ключами из ACF?
Функция get_field_object
в ACF позволяет получить информацию и настройки для конкретного поля.
Сначала вам понадобится ключ поля, которое вы хотите вывести. При редактировании группы полей нажмите на вкладку "Параметры экрана" в верхней части страницы. Вы увидите опцию для отображения ключа поля (по умолчанию он скрыт для экономии места):
Получив ключ, вы можете загрузить объект поля и вывести его значения:
$field_key = "field_5039a99716d1d";
$field = get_field_object($field_key);
if( $field )
{
echo '<select name="' . $field['key'] . '">';
foreach( $field['choices'] as $k => $v )
{
echo '<option value="' . $k . '">' . $v . '</option>';
}
echo '</select>';
}

Было бы удобно, если бы мы могли ссылаться на имя так же легко, как и на ключ. Таким образом, если это используется в плагине, и когда-то понадобится протестировать его на другом экземпляре WordPress с включённым ACF, не придётся искать ключ и менять его снова только потому, что вы находитесь в окружении B.

Если вам нужно вывести что-то при отмеченном чекбоксе, используйте:
<?php if(in_array('news', get_field('checkbox') )): ?>
<h1>Чекбокс "Новости" был отмечен!</h1>
<?php endif; ?>
Если вам нужно просто отобразить список отмеченных опций, используйте это:
<p>Категории: <?php get_field('checkbox'); ?></p>
Это вернет массив значений, которым можно управлять с помощью объявления foreach
. Использование the_field('checkbox')
даст строку с разделенными запятыми опциями, которую также можно разделить.
Я также рекомендую посетить сайт ACF и изучить документацию. Большинство вопросов такого типа подробно освещены там, а разработчик активно участвует в форумах поддержки.
РЕДАКТИРОВАНИЕ: Если вам нужен список доступных опций для вывода на страницу и создания динамического запроса, у меня есть готовое решение. Это код, который я написал вчера для получения списка мета-значений из заданного ключа пользовательского поля (используя ACF). Я сделал его достаточно универсальным. Есть еще часть JS для обработки ajax-запроса и довольно запутанный php-код для вывода полученных записей. Я не могу их переписать - JS это стандартный ajax вызов/ответ в WordPress, а PHP представляет собой набор условных проверок для 12 различных полей ACF, которые мы отображаем (2 из них - повторители). Основная часть - это приведенный здесь код, кнопка onClick
вызывает ajax-функцию в отдельном JS файле, а php для самой ajax-функции по сути создает массив аргументов для запроса, один из которых - $selectedOption
или $_POST['option']
как meta_value. Это передается в new WP_Query( $args );
, который затем используется в цикле, вывод которого возвращается в js через add_action('wp_ajax_the_ajax_hook', 'fetch_option_list');
и add_action( 'wp_ajax_nopriv_the_ajax_hook', 'fetch_option_list' ); //для незарегистрированных пользователей
.
// Получить список meta_values для заданного meta_key и post_type (page, post, custom post type)
function meta_list($key = '', $type = '', $status = 'publish'){
global $wpdb;
$r = $wpdb->get_col($wpdb->prepare( "
SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
ORDER BY pm.meta_value ASC", $key, $status, $type));
return $r;
}
// ДОБАВЛЕНИЕ ФОРМЫ НА СТРАНИЦУ
function meta_ajax_frontend(){
$formlist = meta_list('metakey', 'posttype');
echo '<form id="optionSelect">';
echo '<select id="optionList" name="optionList">';
foreach($formlist as $fl => $val) {
echo '<option>' . $val . '</option>';
}
echo '</select>';
echo '<input name="action" type="hidden" value="the_ajax_hook" />
<input id="submit_button" value = "Поиск" type="button" onClick="fetch_meta();" />
</form>
<div id="meta_list">
Пожалуйста, выберите опцию из списка
</div>';
}

Ммм, если я сделаю так, то выведу опции, назначенные для "записи", а мне нужно показать все опции на "странице" в виде полного списка опций.

Мне интересно, зачем вам нужно отображать список опций из бэкенда на фронтенде. Вы хотите просто отобразить список опций с выделенными в админке элементами? Если вы пытаетесь использовать это как часть формы (позволяя пользователю изменять выбранные данные), это не тот плагин или метод для этого. Однако, если вам нужен список опций для предварительной фильтрации при перезаписи запроса, у меня как раз может быть то, что вам нужно. Я скоро отредактирую свой пост выше, добавив этот код.

Привет, это Боб с другого аккаунта. Мне нужны опции из бэкенда, чтобы создать своего рода "меню" из них. Думаю, ваш код получает записи и опции, назначенные им. А мне нужен просто список опций, как тот, который появляется в бэкенде при создании записи. Я продолжу работать с вашим кодом, чтобы попробовать что-то придумать. Спасибо, @SickHippie.

Нет, он извлекает список выбранных опций из этого чекбокса - то есть показывает "вот чекбокс, есть посты, которым присвоены значения 'опция 1', 'опция 2', 'опция 4' и так далее. Он буквально просто вытягивает список meta_value на основе этого meta_key. Мне это было нужно для динамического списка, но если вы создадите черновик поста со всеми отмеченными чекбоксами, он извлечет все варианты в массив. Именно этот массив я перебираю с помощью foreach
. Последующие функции получают список постов через ajax, но эту часть я опустил.
