Я запрашиваю поле ACF и отображаю все результаты на фронтенде как так —
PHP:
<ul class="category-menu-items">
<?php
// args
$args = array(
'numberposts' => -1,
'post_type' => 'wpsc-product'
);
// get results
$the_query = new WP_Query( $args );
// The Loop
?>
<?php if( $the_query->have_posts() ): ?>
<ul class="inside-category-menu-items">
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li class="category-menu-item">
<a href="/shop/?view_type=default&product_search=<?php $remove = array(" ", ",", "/", ".", ":", "-", "–", "—", "!", "?", ";");
echo strtolower(str_replace($remove, "+", get_field('products_page_designer_name'))); ?>">
<?php the_field('products_page_designer_name'); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
<?php wp_reset_query(); ?>
</ul>
Это работает отлично, единственной проблемой являются значения некоторых полей, дубликаты других, например, Она произведет список как так:
Value 01
Value 02
Value 02
Value 03
Value 03
и т.д. и т.д., но я только хочу отобразить один экземпляр каждого, таким образом если существует дублирующееся значение, это будет скрыто. Это вообще возможно? Любые предложения значительно ценились бы!
Вы могли передать все поля в массив во время Вашего цикла с условием продолжения, лишить массив дубликатов и затем выполнить цикл foreach на том массиве. Это выглядело бы примерно так:
<?php
$designers = array();
while ( $the_query->have_posts() ) : $the_query->the_post();
$designers[] = get_field('products_page_designer_name');
endwhile;
// This will strip out any values that are identical.
$designers = array_unique( $designers );
// Run through your unique array of designers
foreach ( $designers as $designer ) { ?>
<li class="category-menu-item">
<a href="/shop/?view_type=default&product_search=<?php
$remove = array(" ", ",","/", ".", ":", "-", "–", "—", "!", "?", ";");
echo strtolower(str_replace($remove, "+", $designer)); ?>">
<?php echo $designer; ?>
</a>
</li>
<?php } ?>
Обратите внимание, что я не протестировал синтаксис или код.
Удачи!
Можно использовать get_field_object
функция для получения всего поля, которые создают для сообщения и генерируют ACF.
Вот код для получения всех пользовательских полей от идентификатора группы:
<?php
$groupID='23';
$custom_field_keys = get_post_custom_keys($groupID);
foreach ( $custom_field_keys as $key => $fieldkey )
{
if (stristr($fieldkey,'field_'))
{
// get_field_object( $field_name, $post_id, $options )
// - $value has already been loaded for us, no point to load it again in the get_field_object function
$field = get_field_object($fieldkey, $groupID);
echo '';
echo '<span><span>' . $field['label'] . '</span>:';
echo ''. get_field($field['name']) . '</span>';
echo '';
}
}
?>
get_field('field_name1')
и the_field('field_name1')
то же значение, если Вы используете тот же field_name!
Смотрите на документы для get_field и the_field.
Для the_field()
это говорит:
это совпадает с “эхом get_field ($field_name)”
Один способ сделать так состоял бы в том, чтобы поместить затем в массив и затем проверить, чтобы видеть, находятся ли они в использовании массива in_array()
.
Я вместо этого использовал бы класс или функцию, чтобы создать объект или массив с правильными значениями и затем предоставить ее к шаблону с формованными значениями. Не допустите логику в свой шаблон/представление!
Вот презентация о MVC в Wordpress Ian Dunn.
По существу то, что необходимо хотеть сделать, устраняют повторное использование кода как можно больше. Именно это MVC пытается выполнить, а также хранение всего в логической структуре.
В основном то, что он обрисовывает в общих чертах, является этим:
Толстые модели, тощие контроллеры
Например:
function get_menu_items_object() {
$menu_items = array();
$add_to_menu_items = array(
'designer_name1' => get_field('products_page_designer_name'),
'designer_name2' => the_field('products_page_designer_name')
);
foreach($add_to_menu_items as $item_key => $item) {
if (!in_array($item, $menu_items)){
$menu_items[$item_key] = $item;
} else {
$menu_items[$item_key] = '';
}
return (object) $menu_items;
}
Затем все, что необходимо было бы сделать:
$menu_items_object = get_menu_items_object();
echo $menu_items_object->designer_name1; //value echoed
echo $menu_items_object->designer_name2; //value echoed. If '' then it is nothing