Запити до бази даних для швидкого оновлення даних, частина 1
Це не перший раз, коли я згадую про це, але одна з проблем, пов’язаних із написанням прямих запитів до бази даних для оновлення інформації в базі даних WordPress, полягає в тому, що ви залишаєте себе відкритими для чогось на зразок:
Так, але є API, щоб робити щось подібне.
І в багатьох випадках це правильно. Я також великий прихильник їх використання. Але бувають випадки, коли прямі, параметризовані запити до бази даних можуть бути більш оптимальним вибором.
Ні, це не база даних, але чи не було б чудово, якби вони виглядали так? Фото Тобіаса Фішера на Unsplash
Це, звичайно, залежить від середовища, в якому ви працюєте, відповідно до вимог вашого проекту.
Отже, це ще одна публікація, яка буде ілюстрацією того, як використовувати $wpdb для швидкого оновлення інформації на основі метаданих (без використання чогось на зразок WP_Query або WP_Meta_Query для її обробки).
Я збираюся розділити це на дві частини, тому що початкова функція, яку я збираюся вам показати, виконує більше ніж одну дію.
Я не прихильник цього.
По-друге, це також можливість перепроектувати функції, щоб вони вели себе більш об’єктно-орієнтованими (це те, чого я прихильник і що я завжди радий просувати ).
Але наразі дозвольте мені викласти суть проблеми
- Я імпортую трохи інформації зі стороннього API.
- Інформація відображається в таблиці wp_posts, а також у таблиці wp_postmeta.
- Існують певні метадані, які є критеріями для визначення статусу публікації. Або, пряміше кажучи, якщо фрагмент метаданих присутній, статус публікації повинен бути встановлений на чернетку, щоб вона не відображалася в основному запиті.
Щоб вирішити цю проблему, потрібно зробити дві речі:
- Нам потрібні ідентифікатори постів,
- І нам потрібно змінити статус постів.
Перш ніж налаштувати запити та решту коду, припустімо, що мета-ключ, який ми використовуємо, творчо називається acme-status. І з цього, давайте почнемо.
1 Візьміть ідентифікатори публікацій із пов’язаним мета-ключем
Спочатку ми створимо функцію під назвою setInactivePosts. Це більш загальне, ніж це було б, якщо ви працюєте в певному домені, але ви розумієте суть.
Потім ми збираємося налаштувати запит, який буде отримувати всі ідентифікатори публікацій, які мають цей конкретний мета-ключ :
<?php
function setInactivePosts()
{
// First, find the post IDs with an empty acme-status.
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = %s
AND meta_value = ''
",
'acme-status') );
// More to come...
Тут ми маємо масив результатів. Але перш ніж щось робити, нам потрібно переконатися, що у нас є дані, на основі яких можна працювати.
2 Вийти раніше?
Перш ніж продовжувати оновлення інформації, ми повинні перевірити, чи є результати. А якщо їх немає?
<?php
// See previous gist.
// If there aren't any results, there's nothing to do.
if (0 === count($results)) {
return;
}
// More to come...
Тоді ми можемо втекти.
3 Оновіть статус публікації
Але якщо є результати, ми повинні переглянути їх і оновити статус публікації :
<?php
// See previous gist.
// Otherwise, set the post_status of the specified post IDs to 'draft'.
foreach ($results as $result) {
$wpdb->get_results(
$wpdb->prepare(
"
UPDATE $wpdb->posts
SET post_status = %s
WHERE ID = %d
",
'draft',
(int) ($result->post_id)) );
}
То як це все разом виглядає?
4 Всі разом
Коли ми об’єднаємо цю функцію, більшу, ніж потрібно, ви побачите ось що :
<?php
function setInactivePosts()
{
// First, find the post IDs with an empty acme-status.
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = %s
AND meta_value = ''
",
'acme-status') );
// If there aren't any results, there's nothing to do.
if (0 === count($results)) {
return;
}
// Otherwise, set the post_status of the specified post IDs to 'draft'.
foreach ($results as $result) {
$wpdb->get_results(
$wpdb->prepare(
"
UPDATE $wpdb->posts
SET post_status = %s
WHERE ID = %d
",
'draft',
(int) ($result->post_id)) );
}
}
Але в наступній публікації ми трохи реорганізуємо це, щоб зробити його більш об’єктно-орієнтованим.
Примітка для адміністраторів баз даних
Для тих із вас, хто добре розбирається в SQL-fu, ви знаєте, що це, швидше за все, можна вирішити за допомогою одного запиту; однак мета цього допису та наступного допису подвійна:
- Щоб показати, як використовувати $wpdb для швидкого досягнення чогось,
- Показати, як розбити процедурний метод виконання чогось на об’єктно-орієнтований метод виконання чогось.
З огляду на це, дякую за всі запитання. 👍🏻
