ACF: отправьте запрос, скройте дублирующиеся [закрытые] значения

Я запрашиваю поле 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

и т.д. и т.д., но я только хочу отобразить один экземпляр каждого, таким образом если существует дублирующееся значение, это будет скрыто. Это вообще возможно? Любые предложения значительно ценились бы!

0
21.02.2014, 23:07
3 ответа

Вы могли передать все поля в массив во время Вашего цикла с условием продолжения, лишить массив дубликатов и затем выполнить цикл 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 } ?>

Обратите внимание, что я не протестировал синтаксис или код.

Удачи!

3
19.02.2020, 23:39

Можно использовать 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 '';
     }

}
?>
1
19.02.2020, 23:39

Править: Они будут всегда возвращать то же значение, если у них будет то же имя поля

get_field('field_name1') и the_field('field_name1') то же значение, если Вы используете тот же field_name!

Смотрите на документы для get_field и the_field.

Для the_field() это говорит:

это совпадает с “эхом get_field ($field_name)”


Один способ сделать так состоял бы в том, чтобы поместить затем в массив и затем проверить, чтобы видеть, находятся ли они в использовании массива in_array().

Я вместо этого использовал бы класс или функцию, чтобы создать объект или массив с правильными значениями и затем предоставить ее к шаблону с формованными значениями. Не допустите логику в свой шаблон/представление!

Принципы MVC

Вот презентация о MVC в Wordpress Ian Dunn.

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

В основном то, что он обрисовывает в общих чертах, является этим:

MVC:Контроллеры

  • Прямой трафик в рамках приложения
  • Соберите данные из моделей, передайте представлениям
  • Не делает maniuplate данные

MVC: модели

  • Уровень Data
  • Логика бизнеса/домена дескрипторов
  • Делает тяжелый подъем

MVC: представления

  • Только презентация данных - HTML/CSS
  • Используйте встроенный PHP, но экономно
  • Никакое манипулирование данными

Толстые модели, тощие контроллеры

Например:

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
0
19.02.2020, 23:39

Теги

Похожие вопросы