Статьи

Освоение метаданных WordPress: работа с циклами

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

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

Стандартный цикл WordPress представляет собой цикл while, например, «пока есть элементы для цикла, продолжайте цикл». Часто при работе с метаданными проще работать с циклом foreach .

Эти циклы позволяют нам писать наш PHP, как если бы мы работали с одним массивом, а затем для каждого элемента выводить каждый элемент из многомерного массива через один и тот же цикл.
Ранее мы смотрели на этот массив:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
$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 множественном и единственном числе в форме переменной, т. foreach ( $heroes as $hero ) и оттуда мы можем использовать единственную переменную для представления каждого элемента в массиве.

Затем мы можем рассматривать наш многомерный массив как один отдельный массив.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$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 повторить ее три раза.

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

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

1
2
3
4
5
6
$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

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

1
2
3
$link = get_post_meta( get_the_ID(), ‘youtube_link’, ‘single’ );
$name = get_post_meta( get_the_ID(), ‘youttube_name’, ‘single’ );
echo ‘<a href=»‘ . $link . ‘»>’ .

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
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, и применили эти знания для изучения массивов и циклов PHP. Мы также рассмотрели некоторые практические примеры того, как использовать эти данные или массивы данных в цикле.

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