Загальний приклад шаблону сховища в WordPress
З мого досвіду, те, як ми спочатку взаємодіємо з шаблоном дизайну сховища, часто впливає на те, як ми думаємо про шаблон. (Перші враження залишаються незабутніми, чи не так?)
Мета цієї публікації — показати, як це можна реалізувати у WordPress, зокрема під час написання об’єктно-орієнтованих плагінів для читання даних (запис даних може бути розглянуто в іншій публікації), але перед тим, як це зробити, я спробував подумати про кілька узгодженостей між варіанти візерунка, які я бачив.
Загалом, це те, що, на мою думку, повинен робити шаблон сховища:
- забезпечити єдине місце для читання даних,
- абстрагувати деталі того, як здійснюється доступ до даних,
- і мати для цього узгоджений інтерфейс.
Це означає, що все, що вам потрібно отримати з програми, можна отримати з бази даних. Але те, як його витягли, можна вважати чорною скринькою. Це залежить від розробника, який реалізує шаблон.
І у випадку тих, хто читає цей пост, це, швидше за все, ми.
Шаблон сховища в WordPress
Пару років тому я писав про шаблон репозиторію, наводячи конкретний приклад. Це все ще актуально, але мета того, що я хочу висвітлити в цій публікації, дещо інша.
Замість того, щоб показувати конкретну реалізацію, засновану на фактичному прикладі, я б радше продемонстрував, як ми можемо використовувати цей шаблон у нашій повсякденній роботі.
Читаючи це, слід пам’ятати про дві речі:
- з точки зору користувача, базове сховище даних не має значення,
- З точки зору розробника, шаблон дозволяє нам працювати з кількома джерелами даних, а також макетувати зразкове сховище даних, щоб ми могли проводити модульне тестування даних.
При реалізації шаблону не має значення, звідки надходять дані. Принаймні до тих пір, поки ви є розробником або клієнтським об’єктом, який звертається до нього. Сховищем даних може бути база даних, набір функцій API або комбінація обох.
Тоді припустімо, що ви працюєте з користувацьким типом публікації для подій, і ви також працюєте з метаданими публікації та параметрами, пов’язаними з чимось на зразок подій.
Ви можете зробити щось на кшталт:
- отримати назву події,
- знайти інформацію про місце проведення заходу,
- отримати перший тип публікації та статус, упорядкований за її ідентифікатором
Уся ця інформація може бути розкидана в різних місцях, і спосіб її отримання може відрізнятися.
1 Отримання назви події
Якщо ми працюємо з користувальницьким типом публікації, і нам потрібно отримати назву події, ми можемо використати для цього ідентифікатор публікації та одну з функцій API WordPress.
<?php
/**
* Retrieves the title of the Event, a custom post type.
*
* @param int $eventId the ID of the event post type
* @return string the title of the post.
*/
public function getName(int $eventId): string
{
return get_the_title($eventId);
}
Це один випадок, коли сховище даних все ще абстраговано від нас і натомість використовує існуючий API WordPress.
2 Отримання місця події
У цьому випадку ми можемо припустити, що місце події було введено вручну або, можливо, отримано стороннім API. А оскільки місцезнаходження пов’язане з конкретною подією, воно може бути в таблиці метаданих публікації.
Знову ж таки, ми можемо отримати його за допомогою вже існуючих функцій API; однак у подібних ситуаціях має сенс мати допоміжну функцію, тому що ми, ймовірно, матимемо доступ і до інших метаданих.
Отже, спочатку помічник :
<?php
/**
* A helper function for easily retrieving post meta data for a given Event.
*
* @param int $id the ID of the event
* @param string $key the key for the post meta data for which we're retrieveing the data
*
* @return string the result of retrieiving the meta data
*/
private function get(int $id, string $key): string
{
return get_post_meta($id, $key, true);
}
А потім функція, яка використовує помічник для отримання розташування :
<?php
/**
* @param int $eventID the ID of the event
* @return string the name of the event of an empty string
*/
public function getLocationName($eventId): string
{
return $this->get($eventId, 'ymc-event-location-name');
}
Але в цих двох прикладах ми все ще використовуємо наявні функції API. А як щодо випадку, коли нам потрібно спілкуватися з базою даних?
3 Отримання URL-адреси однієї публікації
У цьому випадку ми будемо спілкуватися безпосередньо з базою даних WordPress. Якщо ви знайомі з об’єктом $wpdb і SQL, то це не буде великою проблемою.
Якщо ви ні, я рекомендую прочитати про функцію підготовки, а також про функцію get_results.
Враховуючи це, ми можемо написати запит, який виконуватиме наступне:
- захопити всі публікації, де ідентифікатор відповідає певному значенню, тип публікації та статус публікації є певним значенням, і ми впорядкуємо результати за зростанням значення ідентифікатора,
- потім ми використаємо результати цього запиту, щоб отримати одне значення.
І ми можемо зробити це, отримавши доступ до бази даних і написавши вкладений запит:
<?php
/**
* @return string the URL to the event next to the current event.
*/
public function getNextEventUrl()
{
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT *
FROM $wpdb->posts
WHERE ID > (SELECT ID
FROM $wpdb->posts
WHERE ID = %d
AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID ASC) AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID ASC
LIMIT 1
",
get_the_ID(),
'ymc-events',
'publish',
'ymc-events',
'publish') );
$result = (isset($result[0]))? $result[0]: '';
return $result;
}
І тоді все це можна інкапсулювати в один клас, який буде, скажімо, репозиторієм подій (або EventRepository ).
Проте я розповім про це більше в наступній публікації. А саме, як обробляти визначення того, які функції куди належать, домовленості про іменування та як обробляти збереження, якщо ви також захочете ввести це у свій репозиторій.
Репозиторій визначено
Перш за все майте на увазі:
Шаблон репозиторію маскує спосіб отримання даних, але забезпечує послідовний спосіб отримання даних, з якими вони пов’язані.
Хтось також може додати, як його можна отримати та як це можна написати, але, можливо, я обговорю це в іншій публікації.

