В первой части этой серии мы рассмотрели, что такое метаданные WordPress, как их можно извлечь, а также различные типы данных (например, объекты или массивы), в которых они могут быть возвращены. Теперь пришло время узнать о различных типах массивов.
Когда вы пишете массив вручную, вы знаете, какова его структура и как называется каждый индекс. Но когда вы строите массивы с помощью запросов к базе данных, вам понадобится выполнить детективную работу, чтобы определить структуру возвращаемых данных и имена индексов.
Типы массивов
Прежде чем перейти к доступным различным типам массивов, важно понять, что массив PHP — это любая переменная, которая содержит более одного фрагмента данных.
Ассоциативные и индексированные массивы
Простейшим примером массива является список значений, разделенных запятыми, внутри функции array()
, например:
1
|
$heros = array( ‘Luke’, ‘Leia’, ‘Han’);
|
PHP автоматически индексирует массивы, созданные в разделенных запятыми списках, присваивая каждому элементу числовой индекс, начиная с нуля . Это означает, что мы можем получить значение второго элемента ‘Leia’ из массива $heroes
, указав индекс 1.
Вот как это будет выглядеть:
1
2
|
$heroes = array( ‘Luke’, ‘Leia’, ‘Han’);
echo $heroes[ 1 ];
|
Для практического примера WordPress взгляните на функцию wp_get_attachment_image_src (), которая возвращает индексированный массив информации об изображении.
Мы можем получить URL, ширину и высоту изображения, используя числовые индексы из массива, который возвращает эта функция (обратите внимание, что ‘7’, передаваемый в функцию, относится к идентификатору вложения, и в этом случае он произвольный для целей наш пример):
1
2
|
$img = wp_get_attachment_image_src( 7 );
echo ‘<img src=»‘ . $img[0] . >» width=»‘ . $img[1] . ‘» height=»‘ . $img[2] . ‘» />’;
|
Конечно, отслеживание номеров индексов в массивах может привести к путанице, поэтому PHP позволяет нам создавать ассоциативные массивы. Возвращаясь к нашему примеру $heroes
, мы могли бы дать каждому элементу в нашем массиве имя:
1
2
3
4
5
|
$heroes = array(
‘unlikely_hero’ => ‘Luke’,
‘badass_princess’ => ‘Leia’,
‘lovable_rouge’ => ‘Han’,
);
|
Мы называем эти имена ключами . В этом массиве мы бы сказали, что ключ ‘ablely_hero’ имеет значение ‘Luke’. Мы можем получить значение этого ключа, поместив его в скобки рядом с переменной. Например:
1
|
echo $hereos[‘unlikely_hero’];
|
Многомерные массивы
До сих пор мы рассматривали массивы, которые по сути представляют собой список элементов, но массивы также могут состоять из других массивов. Мы называем эти многомерные массивы. При создании многомерного массива у нас по существу есть список списков, где каждый индекс или ключ в нашем массиве определяется другим массивом.
Например:
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’,
),
);
|
Этот вид массива очень полезен, поскольку он позволяет нам циклически проходить по нему, записывая разметку один раз и позволяя PHP итерировать по нему столько раз, сколько это возможно.
Инструменты для детективной работы
Как я уже говорил в начале этой статьи, работа с метаданными часто может потребовать некоторой детективной работы для обнаружения структуры массива. Как и любой детектив, вы должны убедиться, что у вас есть правильные инструменты для работы.
Разработчики-любители модифицируют свои файлы тем, чтобы временно выводить значения массивов. Но если вы хотите работать быстро и эффективно, вы сделаете это профессионально — с помощью консоли отладки.
Разработчики-любители модифицируют свои файлы тем, чтобы временно выводить значения массивов. Но если вы хотите работать быстро и эффективно, вы сделаете это профессионально — с помощью консоли отладки.
Что такое консоль отладки?
Debug Console — это одна из нескольких надстроек для плагина Debug Bar , без которых не должен обойтись ни один разработчик WordPress. Если в вашей среде разработки еще не установлена панель отладки, вам необходимо сделать это как можно скорее.
После установки этих двух плагинов вы сможете получить доступ к консоли из панели администратора, где вы сможете запускать код PHP. Теперь вместо изменения файла темы, сохранения и обновления вы можете просто поэкспериментировать с кодом прямо в браузере.
Просто нажмите «Run» и увидите результаты в нижней части экрана. Самое приятное то, что любые сгенерированные вами ошибки будут отображаться в окне результатов, а не на вашем сайте. Неустранимые ошибки ломают консоль отладки, а не ваш сайт.
Кстати, я только поцарапал поверхность того, что может делать Debug Bar. Кроме того, Debug Bar и Debug Console, а также множество других полезных утилит включены в плагин для разработчиков , который я очень рекомендую. Когда вы научитесь работать с метаданными, вы также найдете плагин Debug Bar Post Meta также весьма полезным.
var_dump против print_r
Теперь, когда у вас есть место для тестирования, как исследовать внутренности массива. Для этой работы PHP предоставляет нам две служебные функции, которые мы никогда бы не использовали для создания var_dump()
, но они идеально подходят для диагностической работы — var_dump()
и print_r()
.
Обе эти функции принимают переменную, содержащую массив, в качестве входных данных и выводят ее содержимое для изучения. var_dump()
содержит больше информации, такой как тип данных (строка, логическое значение, целое число и т. д.) и длина данных, в то время как print_r()
предназначена для более удобочитаемого человеком и пропускает эту дополнительную информацию.
Использование var_dump для поиска индекса или ключа
Вот скриншот var_dump метаданных для поста. Это показывает, как я пробурил только одно поле. Моя цель состояла в том, чтобы получить значение поля мета-заголовка, созданного плагином WordPress SEO от Yoast.
Как вы можете видеть из var_dump, что я сгенерировал из всех метаполей для идентификатора записи # 1 с помощью get_post_meta( 1 );
Я работал с ассоциативным многомерным массивом, который содержал индексированный массив только с одним индексом. Изучив var_dump, я обнаружил, что ключ, который мне нужен, был ‘_yoast_wpseo_title’ и что фактическая информация, которая мне нужна, была в первом индексе. Чтобы получить доступ к этому, я поместил ключ ‘_yoast_wpseo_title’ в его собственную переменную, а затем повторил первый индекс следующим образом:
1
2
3
|
$meta = get_post_meta(1);
$seo_title = $meta[‘_yoast_wpseo_title’];
echo ‘<div>SEO TITLE: ‘ .
|
Это хороший пример для иллюстрации стратегии поиска необходимого ключа, но это не самый эффективный способ получения информации, если вы знаете ключ. Поэтому, выполнив детективную работу по поиску правильного ключа, я бы указал ключ непосредственно в вызове get_post_meta()
. Когда нам нужен только один ключ, вы можете указать его непосредственно во втором аргументе get_post_meta()
.
Важно помнить, что get_post_meta(1, '_yoast_wpseo_title' );
не вернет нужное нам значение, а вернет массив. Добавляя true для третьего аргумента ‘single’, мы можем получить только первый индекс, который нам нужен.
Итак, чтобы напрямую отразить заголовок SEO, все в одной строке нам нужно сделать это:
1
|
get_post_meta( 1, ‘_yoast_wpseo_title’, true );
|
Использование get_user_meta ()
До сих пор в этой серии я показал вам, как работать с таблицей wp_postmeta
, которая содержит все настраиваемые поля, добавленные к типу записи.
Пользователи также могут иметь настраиваемые поля. Пользовательские метаданные, дополнительные поля, добавленные в профили пользователей, работают так же, как и метаданные публикации, но хранятся в таблице wp_usermeta
. При работе с метаданными пользователя вместо get_post_meta()
мы используем get_user_meta()
.
Эти две функции работают одинаково, они просто получают свои данные из двух разных таблиц в базе данных.
Вот пример использования get_user_meta()
для вывода собственного изображения в виде ссылки на посты автора:
1
2
3
4
5
6
|
$users = array ( 55, 89, 144, 233, 377 );
foreach ( $users as $user ) {
$link = get_author_posts_url( $user );
$img = get_user_meta( $user, ‘link_img’, ;
echo ‘<a href=»‘ . $link . ‘»><img src=»‘ . $img . ‘» /></a>’;
} //end foreach loop
|
Следующий…
В двух частях этой серии мы рассмотрели различные типы метаданных, как они хранятся и как мы можем их получить. Кроме того, мы рассмотрели два типа массивов, которые предлагает PHP, и то, как это соответствует метаданным, связанным с сообщениями и пользователями.
В следующей части серии мы рассмотрим, как мы можем выполнять итерацию по каждому типу данных, чтобы у нас была возможность и гибкость в настройке вывода для наших шаблонов.