В первой части этой серии статей мы рассказали, что такое метаданные, как они могут быть получены, а также в виде каких типов данных (массивы или объекты) они могут быть представлены. Теперь пришла пора узнать о разных типах массивов.
Когда вы создаете массив вручную, вы знаете, какова его структура и каково название каждого индекса. Однако когда вы создаете массивы через запрос к базе данных, вы должны потратить некоторое время, чтобы изучить, какова будет структура возвращаемых данных и какими будут названия индексов.
Типы массивов
Перед тем как перейти к описанию различных типов массивов, нужно сделать одно важное замечание. В PHP массивом является любая переменная, которая содержит в себе более одной части данных.
Ассоциативные массивы против индексных массивов
Самый простой пример массива – разделенный запятыми список значений, находящийся внутри функции array():
$heros = array( 'Luke', 'Leia', 'Han');
PHP автоматически индексирует массивы, созданные в виде разделенных запятыми списков, присваивая каждому элементу числовой индекс, начиная с нуля. Отсюда следует, что мы могли бы получить значение второго пункта ‘Leia’ в массиве $heroes путем определения индекса 1.
Вот, как это выглядело бы:
$heroes = array( 'Luke', 'Leia', 'Han'); echo $heroes[ 1 ];
Для практических примеров взгляните на функцию wp_get_attachment_image_src(), которая возвращает индексный массив с информацией об изображении.
Мы можем получить URL, высоту и ширину изображения, используя числовые индексы массива, который возвращает данная функция (обратите внимание, что число ‘7’, передаваемое в функцию, относится к ID вложения, и в данном случае используется нами с иллюстративной целью):
$img = wp_get_attachment_image_src( 7 ); echo '<img src="' . $img[0] . >" width="' . $img[1] . '" height="' . $img[2] . '" />';
Естественно, отслеживание индексов в массивах может оказаться довольно запутанным шагом, поэтому в PHP предусмотрены ассоциативные массивы. Возвращаясь к нашему примеру $heroes, мы могли бы дать каждому пункту нашего массива определенное название:
$heroes = array( 'unlikely_hero' => 'Luke', 'badass_princess' => 'Leia', 'lovable_rouge' => 'Han', );
Эти названия обычно именуются ключами. Применительно к данному массиву мы могли бы сказать, что ключ unlikely_hero содержит значение Luke. Мы можем получить значение этого ключа, помещая его в квадратные скобки следом за переменной:
echo $hereos['unlikely_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', ), );
Инструменты исследования
Как я говорил в самом начале статьи, работа с метаданными может потребовать некоторого исследования для обнаружения структуры массива. Как любой детектив, вы должны убедиться в том, что у вас имеются подходящие средства для работы.
Разработчики-любители временно меняют файлы своей темы для вывода значений массива. Однако если вы хотите работать быстро и эффективно, вы можете пойти путем профессионалов – воспользоваться консолью отладки.
Что такое консоль отладки?
Консоль отладки (Debug Console) – это одно из дополнений к плагину Debug Bar, без которого невозможно представить себе ни одного разработчика WordPress. Если у вас не установлен плагин Debug Bar в вашей среде разработки, вы должны сделать это как можно быстрее.
После того как вы установите эти два плагина, вы сможете получить доступ к консоли отладки из администраторской панели, где вы можете уже запускать PHP-код. Теперь вам не понадобится изменять файлы темы, сохранять и обновлять их – вы сможете быстро экспериментировать с кодом прямо в браузере.
Просто щелкните run и наблюдайте за результатами в самом низу экрана. Плюс такого подхода – любые ошибки будут отражены в поле результатов, а не во фронтэнде вашего сайта. Фатальные ошибки могут повредить консоль отладки, но не ваш сайт.
Как Debug Bar и Debug Console, так и масса других полезных утилит включены в Developer Plugin, который я рекомендую использовать. Поскольку вы только учитесь работать с метаданными, то, скорее всего, вам покажется удобным плагин Debug Bar Post Meta.
var_dump против print_r
Теперь, когда у вас есть среда тестирования, вы можете исследовать «внутренности» массивов. С этой целью в PHP имеются две полезных функции, которые никогда не используются при выводе во фронтэнде, но полезны при диагностике — var_dump() и print_r().
Обе эти функции принимают переменную, содержащую массив, и возвращают его содержимое для нас, которое мы можем уже исследовать. var_dump() предлагает больше информации, как, к примеру, тип данных (string, boolean, integer и т.д.), размер данных и т.д., в то время как print_r() опускает дополнительную информацию и выводит данные в удобном виде.
Используем var_dump для поиска индекса или ключа
Вот скриншот var_dump для метаданных записи. Из него видно, как я «вывернул наизнанку» всего одно поле. Моя цель заключалась в том, чтобы получить значение мета-поле title, созданное плагином WordPress SEO by Yoast.
Как показала функция var_dump, в которую я передал все мета-поля для записи с ID #1 через get_post_meta( 1 );, мне нужно было работать с ассоциативным многомерным массивом, который содержал в себе индексный массив с одним индексом. Исследовав var_dump, я обнаружил, что ключ, который мне требуется, носит название ‘_yoast_wpseo_title’, и актуальная для меня информация содержится в первом индексе. Чтобы получить доступ к ней, я поместил ключ в отдельную переменную, после чего вывел первый индекс с помощью echo:
$meta = get_post_meta(1); $seo_title = $meta['_yoast_wpseo_title']; echo '<div>SEO TITLE: ' . $seo_title[0] . '</div>';
Это хороший пример, иллюстрирующий стратегию поиска нужного ключа, однако это не самый эффективный способ получения информации, если вы знаете ключ. Таким образом, сразу после нахождения верного ключа я мог бы указать ключ непосредственно в get_post_meta(). Когда нам нужен всего один ключ, мы можем определить его в качестве второго аргумента get_post_meta().
Важно помнить, что get_post_meta(1, ‘_yoast_wpseo_title’ ); не вернет значение, которое нам требуется – вместо этого мы получим массив. Но достаточно добавить true в качестве третьего параметра ‘single’, и мы получим первый индекс, который нам нужен.
Таким образом, чтобы вывести на экран SEO-заголовок через echo с помощью одной строки, мы должны указать следующее:
get_post_meta( 1, '_yoast_wpseo_title', true );
Используем get_user_meta()
До сих пор мы с вами работали с таблицей wp_postmeta, которая содержит в себе все поля, добавленные к типу записи.
Пользователи тоже могут иметь произвольные поля. Пользовательские метаданные — дополнительные поля, добавленные к пользовательским профилям — работают аналогично метаданным записей, однако сохраняются в таблицу wp_usermeta. При работе с пользовательскими метаданными вместо get_post_meta() мы будем использовать get_user_meta().
Эти две функции работают тождественно: они просто получают свои данные из двух разных таблиц в базе данных.
Вот пример использования get_user_meta() для вывода произвольного изображения, которое будет являться ссылкой на записи автора:
$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
В следующей статье…
В следующей статье мы посмотрим на выполнение итераций по разным типам данных, что даст нам мощь и гибкость для изменения вывода наших шаблонов.
Источник: code.tutsplus.com/categories/wordpress
Можно ещё ещё http://wordpress.org/plugins/kint-debugger/ поставить и функция d() будет выводить всю инфу как var_dump()только удобней и в дебаг баре
Спасибо за наводку, полезный плагин.