Изучаем метаданные в WordPress: Часть 3. Работа с циклами

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

Как только вы получите данный навык, вам больше уже не придется писать повторяющуюся HTML-разметку.

Использование циклов foreach в массивах

Стандартный WordPress цикл – это цикл while. Однако зачастую при работе с метаданными удобнее воспользоваться циклом foreach.

С помощью этих циклов мы можем работать с любыми массивами, в том числе и с многомерными. Если элемент сам является массивом, мы можем вывести все его значения в том же цикле.

Ранее мы уже обращались к следующему массиву:

$heroes => array(
        'Luke'        => array(
        'full_name'   => 'Luke Skywalker',
        'home_planet' => 'Tatooine',
        'trope'       => 'Unlikely Hero',
    ),
        'Leia'        => array(
        'full-name'   => 'Leia Organa',
        'home_planet' => 'Alderaan',
        'trope'       => 'Badass Princess',
    ),
        'Han'         => array(
        'full_name'   => 'Han Solo',
        'home_planet' => 'Corell',
        'trope'       => 'Lovable Rouge',
    ),
);

Если мы хотим сделать этот массив считываемым, то в таком случае нам нужно создать цикл foreach.

Обычно циклы foreach задаются с переменными в форме множественного и единственного числа, к примеру, foreach ( $heroes as $hero ). После такого задания мы можем использовать переменную в единственном числе для представления каждого пункта в массиве.

В таком случае мы можем рассматривать многомерный массив как одномерный.

$heroes => array(
        'Luke'  => array(
            'full_name'     => 'Luke Skywalker',
            'home_planet'   => 'Tatooine',
            'trope'         => 'Unlikely Hero',
    ),
        'Leia'  => array(
            'full-name'     => 'Leia Organa',
            'home_planet'   => 'Alderaan',
            'trope'     => 'Badass Princess',
    ),
        'Han'   => array (
            'full_name'     => 'Han Solo',
            'home_planet'   => 'Corell',
            'trope'         => 'Lovable Rouge',
    ),
);
 
echo '<ul>';
 
foreach ($heroes as $hero) {
        echo '<li>Full Name: '.$hero['full_name'].'</li>';
} //end of the foreach loop
 
echo '</ul>';

Это абстрактный пример, однако я уверен, что вы отметили для себя удобство этого подхода. Вместо того чтобы переписывать (и обновлять) ту же самую разметку три раза, достаточно просто написать ее один раз, после чего пройтись в PHP-цикле по ней три раза.

В следующем нашем примере вы берем массив ID записей и для каждой записи возвращаем название поля youtube_name в виде ссылки, которая устанавливается в поле youtube_link.  С помощью этих шести простых строк кода мы можем легко обработать как 50 записей, так и 5. Этот пример показывает нам всю мощь циклов foreach, позволяющих писать удобный, расширяемый код.

$posts = array( 5, 8, 13, 21, 34 );
foreach ( $posts as $post ) {
    $link = get_post_meta( $post, 'youtube_link', 'single' );
    $name = get_post_meta( $post, 'youtube_name', 'single' );
    echo '<a href="'.$link.'">'.$name.'</a>';
} // end foreach loop

Используем get_post_meta() в основном цикле WordPress

До сих пор я вручную задавал ID записей, однако используя основной цикл WordPress, мы можем задавать ID в get_post_meta() автоматически с помощью get_the_ID(). Таким образом, используя те же самые поля, что и в прошлом примере, однако выводя их в основном цикле, чтобы, к примеру, добавить youtube-ролики под контентом записей, мы можем просто поместить после the_content(); следующий код:

$link = get_post_meta( get_the_ID(), 'youtube_link', 'single' );
$name = get_post_meta( get_the_ID(), 'youttube_name', 'single' );
echo '<a href="' . $link . '">' . $name . '</a>';

Объединяем циклы while и foreach

Чаще всего мы будем работать с одним произвольным полем, которое содержит в себе массив сериализированных данных. К примеру, одно поле может содержать заголовок видео, mime-тип, URL и описание.

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

В следующем примере я добавил к стандартному циклу записей while вторичный цикл, который проходит по каждому полю видео для вывода HTML5 видео плеера.

Не важно, одно видео размещено или несколько. Эти простые строки кода создадут плеер для каждого ролика.

if ( have_posts() {
    while ( have_posts() )  {
        the_post();
        the_content();
        $videos = get_post_meta( get_the_ID(), 'videos', false );
        foreach ( $videos as $video ) { ?>
            <div class="video">
                <h3 class="video-title"></h3>
                <video width="320" height="240" controls="controls"><source src="<?php echo $video['url']>" type="<?php echo $video['mime_type']; ?>" />
                    Sorry your browser does not support HTML5 video.
                </video>
                <?php echo $video['description'] ?>
            </div>
        <?php
        } //endforeach
    } //endwhile
} //endif

В следующей статье

В следующей статье мы изучим, как совершать запросы к базе данных по определенным мета-полям.

Блог про WordPress
Добавить комментарий

Получать новые комментарии по электронной почте.