Не возвращайте повторяющийся заголовок в цикле WordPress - PullRequest
0 голосов
/ 27 марта 2019

У меня есть этот стандартный цикл для возврата заголовков пользовательского типа сообщения:

    <ul>
    <?php 
        $args = array(
        'post_type'         => 'food_types',
        'posts_per_page'    => -1
        );
        $query = new WP_Query($args);
        while ($query->have_posts()) : $query->the_post(); ?>
        <li><?php echo the_title();?></li>
        <?php endwhile;
        wp_reset_postdata();
    ?>
    </ul>

Проблема в том, что часто появляются сообщения с одинаковым заголовком.

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

Например, если есть сообщения с этими заголовками ...

Tomato
Orange
Orange
Apple
Apple
Egg
Banana
Banana

... тогдацикл должен только возвращать это:

Tomato
Orange
Apple
Egg
Banana

Надеюсь, это имеет смысл.

Ответы [ 3 ]

0 голосов
/ 27 марта 2019

the_title() не требует эха.проверка:

<ul>
    <?php 
    $args = array(
        'post_type'         => 'food_types',
        'posts_per_page'    => -1
    );

    $query = new WP_Query($args);
    while( $query->have_posts() ) : $query->the_post(); ?>
        <li><?php the_title();?></li>
    <?php endwhile;
     wp_reset_postdata(); ?>
</ul>
0 голосов
/ 27 марта 2019

Если вы беспокоитесь только об названиях фруктов, возможно, имеет смысл создать отдельный набор данных для него и даже не беспокоить зацикливание всех постов, что устраняет бремя отслеживания названий внутри цикла.

$args = array(
    'post_type'         => 'food_types',
    'posts_per_page'    => -1
);
$query = new WP_Query($args);

// Simply build a list of post titles
$fruits = array_column( $query->posts, 'post_title'); // PHP7+

// Get unique values
$fruits = array_unique( $fruits );

// Then all you have to do is loop that list
foreach($fruits as $fruit) : ?>

    // Echo shorthand
    <li><?= $fruit;?></li>

<?php endforeach;
wp_reset_postdata();
0 голосов
/ 27 марта 2019

Допустимо ли дублирование в базе данных, если нет, то вы можете запустить скрипт для удаления дубликатов, так как это может привести к снижению производительности.

Если в списке не слишком много элементовТогда быстрое решение для вашего текущего кода может просто добавить каждый заголовок в массив, а затем продолжить цикл while, если элемент был добавлен ранее.

Использование: https://www.php.net/manual/en/function.array-push.php и https://www.php.net/manual/en/function.in-array.php

Так что-то вроде этого .. NB: это только в концепции ... Я не проверял код .:

<ul>
<?php 
    $args = array(
    'post_type'         => 'food_types',
    'posts_per_page'    => -1
    );
    $query = new WP_Query($args);
    $list = array();
    while ($query->have_posts()) : $query->the_post(); 
    if(in_array(get_the_title(), $list)){ continue; }
    $list[] = get_the_title();
    ?>
    <li><?php echo get_the_title();?></li>
    <?php endwhile;
    wp_reset_postdata();
?>
</ul>

* Модифицировано для использования get_the_title (), как вы объяснили в комментариях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...