Привіт:) SQL-запити для WordPress можуть стати в пригоді розробнику, адміністратору сайту або SEO-фахівцю, коли стандартних можливостей адміністративної панелі недостатньо.
За допомогою SQL можна швидко знайти та змінити записи, очистити спам-коментарі, працювати з користувачами, перевірити налаштування, знайти непотрібні метаполя, змінити URL сайту, видалити старі дані та виконати багато інших операцій.
- 🔧 Що потрібно знати перед роботою з SQL
- ⚠️ Резервна копія перед SQL-запитами
- 👀 Перегляд даних
- Переглянути останні записи
- Переглянути опубліковані записи
- Переглянути сторінки
- Переглянути користувачів
- Порахувати кількість записів
- 📝 Робота з постами та сторінками
- Знайти запис за ID
- Знайти записи за частиною заголовка
- Знайти записи за частиною тексту
- Знайти всі чернетки
- Знайти записи в кошику
- Порахувати чернетки
- Знайти записи без заголовка
- Знайти записи без контенту
- Змінити статус запису
- 🔗 Робота з URL записів
- Знайти записи з конкретним URL у контенті
- Знайти старий домен
- 🧩 Робота з метаданими
- Переглянути метадані конкретного запису
- Знайти конкретний meta_key
- Порахувати використання meta_key
- Знайти рідкісні meta_key
- Видалити конкретне метаполе
- 👤 Робота з користувачами
- Переглянути всіх користувачів
- Знайти користувача за логіном
- Знайти користувача за email
- Змінити логін користувача
- Змінити email користувача
- Змінити display_name
- Змінити сайт користувача
- 🔐 Скидання пароля користувача
- 💬 Робота з коментарями
- Переглянути останні коментарі
- Знайти спам
- Видалити всі спам-коментарі
- Порахувати спам
- Видалити всі pingback
- Видалити всі trackback
- Закрити коментарі для всіх записів
- Закрити pingback
-
⚙️ Робота з
wp_options - Переглянути основні налаштування
- Переглянути URL сайту
- Змінити адресу WordPress
- Змінити email адміністратора
- Знайти великі options
- Знайти autoload options
- 🏷️ Робота з категоріями та тегами
- Переглянути всі терміни
- Знайти категорію або тег за назвою
- Переглянути кількість записів у категоріях
- Переглянути популярні теги
- 🔍 Пошук даних у базі
- Пошук у контенті
- Пошук у заголовках
- Пошук у postmeta
- Пошук у налаштуваннях
- 🧹 Очищення бази даних
- Видалення записів із кошика
- Пошук orphaned postmeta
- 🗑️ Видалення orphaned commentmeta
- 🔄 Заміна HTTP на HTTPS
- 🌐 Зміна домену сайту
- 📊 Корисні діагностичні SQL-запити
- Кількість записів за статусом
- Кількість записів за типом
- Кількість коментарів за статусом
- Кількість користувачів за датою реєстрації
- Перевірити версію MySQL/MariaDB
- Перевірити розмір таблиць
- 🔎 SQL для SEO та технічного аудиту
- Знайти записи без заголовка
- Знайти дуже короткі записи
- Знайти записи з однаковими заголовками
- Знайти записи з конкретним shortcode
- Знайти записи, у яких зустрічається iframe
- Знайти зовнішні URL у контенті
- 🛒 SQL-запити для WooCommerce
- Знайти товари
- Порахувати товари
- Знайти товари без ціни
- Знайти товари за SKU
- 🧠 SQL-запити через WP-CLI
- 🔐 Безпечне використання SQL у WordPress
- ❌ Не робіть так
- ✅ Робіть так
-
🧱 Не прив'язуйтеся до
wp_ - 🚨 Небезпечні SQL-запити
- 🧪 Безпечний алгоритм роботи з DELETE та UPDATE
- 📋 Шпаргалка SQL-запитів WordPress
- 💡 Коли SQL для WordPress дійсно потрібен?
- ❓ FAQ корисних SQL запитів для WordPress
- Чи безпечно виконувати SQL-запити у WordPress?
- Де виконувати SQL-запити WordPress?
-
Чи завжди таблиця WordPress називається
wp_posts? - Як знайти префікс таблиць WordPress?
- Як видалити всі спам-коментарі?
-
Як знайти великі
wp_options? - Чи можна змінити URL WordPress через SQL?
- Чи можна використовувати SQL для SEO-аудиту?
- Чи можна запускати SQL через WP-CLI?
- 🏁 Висновок
У цій статті зібрані практичні SQL-запити для WordPress, які можна використовувати через phpMyAdmin, Adminer, MySQL/MariaDB CLI або WP-CLI.
⚠️ Важливо: SQL-запити UPDATE і DELETE можуть незворотно змінити або видалити дані. Перед виконанням будь-якого небезпечного запиту обов'язково зробіть резервну копію бази даних.
🔧 Що потрібно знати перед роботою з SQL
WordPress зберігає основну інформацію в MySQL або MariaDB. Ядро використовує набір стандартних таблиць для постів, користувачів, коментарів, налаштувань, таксономій та метаданих.
Найчастіше використовуються:
| Таблиця | Призначення |
|---|---|
wp_posts | записи, сторінки та custom post types |
wp_postmeta | метадані записів |
wp_users | користувачі |
wp_usermeta | метадані користувачів |
wp_comments | коментарі |
wp_commentmeta | метадані коментарів |
wp_options | налаштування сайту |
wp_terms | назви категорій і тегів |
wp_term_taxonomy | інформація про тип таксономії |
wp_term_relationships | зв'язки записів із категоріями та тегами |
wp_termmeta | метадані категорій і тегів |
WordPress підтримує змінний префікс таблиць. Тому wp_ — це лише стандартний приклад.
Наприклад, у конкретному сайті таблиці можуть називатися:
abc_postsabc_optionsabc_users
Тому перед виконанням запитів потрібно перевірити реальний префікс бази даних.

⚠️ Резервна копія перед SQL-запитами
Перед виконанням DELETE, UPDATE або інших операцій, які змінюють дані, зробіть backup.
Якщо використовується WP-CLI, базу можна експортувати командою:
wp db export backup.sql
WP-CLI також дозволяє виконувати SQL-запити через команду wp db query.
Для критичних операцій краще спочатку виконати SELECT і перевірити, які саме записи будуть змінені.
Наприклад, замість:
DELETE FROM wp_comments
WHERE comment_approved = 'spam';
спочатку виконайте:
SELECT *
FROM wp_comments
WHERE comment_approved = 'spam';
Якщо результат правильний — переходьте до DELETE.
👀 Перегляд даних
Переглянути останні записи
SELECT ID, post_title, post_status, post_date
FROM wp_posts
ORDER BY post_date DESC
LIMIT 20;
Переглянути опубліковані записи
SELECT ID, post_title, post_date
FROM wp_posts
WHERE post_status = 'publish'
AND post_type = 'post'
ORDER BY post_date DESC;
Переглянути сторінки
SELECT ID, post_title, post_status
FROM wp_posts
WHERE post_type = 'page'
ORDER BY post_title;
Переглянути користувачів
SELECT ID, user_login, user_email, user_registered
FROM wp_users
ORDER BY ID;
Порахувати кількість записів
SELECT COUNT(*) AS total_posts
FROM wp_posts
WHERE post_type = 'post';
📝 Робота з постами та сторінками
Знайти запис за ID
SELECT *
FROM wp_posts
WHERE ID = 123;
Замість 123 вкажіть ID потрібного запису.
Знайти записи за частиною заголовка
SELECT ID, post_title, post_status
FROM wp_posts
WHERE post_title LIKE '%WordPress%';
Знайти записи за частиною тексту
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%robots.txt%';
Знайти всі чернетки
SELECT ID, post_title, post_date
FROM wp_posts
WHERE post_status = 'draft'
AND post_type = 'post'
ORDER BY post_date DESC;
Знайти записи в кошику
SELECT ID, post_title, post_date
FROM wp_posts
WHERE post_status = 'trash';
Порахувати чернетки
SELECT COUNT(*) AS drafts
FROM wp_posts
WHERE post_status = 'draft';
Знайти записи без заголовка
SELECT ID, post_status
FROM wp_posts
WHERE post_title = '';
Знайти записи без контенту
SELECT ID, post_title
FROM wp_posts
WHERE post_content = '';
Змінити статус запису
Наприклад, перевести запис із чернетки в опублікований:
UPDATE wp_posts
SET post_status = 'publish'
WHERE ID = 123;
⚠️ Обережно з таким запитом: він змінює статус безпосередньо в базі даних.
🔗 Робота з URL записів
Знайти записи з конкретним URL у контенті
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%https://example.com/%';
Це може бути корисно під час міграції сайту або зміни домену.
Знайти старий домен
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%old-domain.com%';
Але пошук лише в wp_posts не гарантує знаходження всіх входжень URL. Дані можуть також зберігатися в wp_options, wp_postmeta, wp_usermeta та інших таблицях.
🧩 Робота з метаданими
wp_postmeta використовується для зберігання додаткових даних записів, сторінок та інших post types. WordPress також має окремі meta-таблиці для користувачів, коментарів і термінів.
Переглянути метадані конкретного запису
SELECT *
FROM wp_postmeta
WHERE post_id = 123;
Знайти конкретний meta_key
SELECT *
FROM wp_postmeta
WHERE meta_key = '_thumbnail_id';
Порахувати використання meta_key
SELECT meta_key, COUNT(*) AS total
FROM wp_postmeta
GROUP BY meta_key
ORDER BY total DESC;
Це дуже корисний запит для пошуку метаполів, які створюють плагіни.
Знайти рідкісні meta_key
SELECT meta_key, COUNT(*) AS total
FROM wp_postmeta
GROUP BY meta_key
HAVING total < 5
ORDER BY total ASC;
Видалити конкретне метаполе
Спочатку:
SELECT *
FROM wp_postmeta
WHERE meta_key = 'my_custom_field';
Після перевірки:
DELETE FROM wp_postmeta
WHERE meta_key = 'my_custom_field';
⚠️ Не видаляйте meta_key, якщо не знаєте, який плагін або тема його використовує.
👤 Робота з користувачами
Переглянути всіх користувачів
SELECT ID, user_login, user_email, user_registered
FROM wp_users
ORDER BY ID;
Знайти користувача за логіном
SELECT *
FROM wp_users
WHERE user_login = 'admin';
Знайти користувача за email
SELECT *
FROM wp_users
WHERE user_email = 'user@example.com';
Змінити логін користувача
UPDATE wp_users
SET user_login = 'newlogin'
WHERE user_login = 'oldlogin';
Після цього потрібно перевірити залежності плагінів та сторонніх інтеграцій, які можуть використовувати старий логін.
Змінити email користувача
UPDATE wp_users
SET user_email = 'new@example.com'
WHERE ID = 123;
Змінити display_name
UPDATE wp_users
SET display_name = 'Нове ім’я'
WHERE ID = 123;
Змінити сайт користувача
UPDATE wp_users
SET user_url = 'https://example.com'
WHERE ID = 123;
🔐 Скидання пароля користувача
У старих довідниках часто зустрічається:
UPDATE wp_users
SET user_pass = MD5('newpassword')
WHERE user_login = 'admin';
Такий підхід краще не використовувати як основний спосіб.
Якщо є доступ до WordPress, безпечніше скористатися стандартним механізмом WordPress або WP-CLI:
wp user update 123 --user_pass='NewStrongPassword'
Або:
wp user reset-password 123
Пряме редагування user_pass через SQL варто залишати для аварійних сценаріїв, коли штатні інструменти недоступні.
💬 Робота з коментарями
Переглянути останні коментарі
SELECT comment_ID, comment_author, comment_content, comment_date
FROM wp_comments
ORDER BY comment_date DESC
LIMIT 50;
Знайти спам
SELECT *
FROM wp_comments
WHERE comment_approved = 'spam';
Видалити всі спам-коментарі
DELETE FROM wp_comments
WHERE comment_approved = 'spam';
Це один із найкорисніших SQL-запитів для очищення WordPress.
Порахувати спам
SELECT COUNT(*) AS spam_count
FROM wp_comments
WHERE comment_approved = 'spam';
Видалити всі pingback
DELETE FROM wp_comments
WHERE comment_type = 'pingback';
Видалити всі trackback
DELETE FROM wp_comments
WHERE comment_type = 'trackback';
Закрити коментарі для всіх записів
UPDATE wp_posts
SET comment_status = 'closed';
⚠️ Це змінить налаштування коментарів для всіх постів і сторінок, тому перед виконанням обов'язково зробіть резервну копію.
Закрити pingback
UPDATE wp_posts
SET ping_status = 'closed';
⚙️ Робота з wp_options
Таблиця wp_options містить важливі налаштування WordPress. Серед них — URL сайту, email адміністратора та багато даних плагінів і тем.
Переглянути основні налаштування
SELECT option_name, option_value
FROM wp_options
WHERE option_name IN (
'siteurl',
'home',
'admin_email'
);
Переглянути URL сайту
SELECT option_name, option_value
FROM wp_options
WHERE option_name IN ('siteurl', 'home');
Змінити адресу WordPress
UPDATE wp_options
SET option_value = 'https://example.com'
WHERE option_name = 'siteurl';
UPDATE wp_options
SET option_value = 'https://example.com'
WHERE option_name = 'home';
⚠️ Виконуйте це тільки під час реальної зміни домену або URL сайту.
Змінити email адміністратора
UPDATE wp_options
SET option_value = 'admin@example.com'
WHERE option_name = 'admin_email';
Знайти великі options
SELECT
option_name,
LENGTH(option_value) AS size
FROM wp_options
ORDER BY size DESC
LIMIT 50;
Це особливо корисно під час оптимізації бази даних.
Знайти autoload options
SELECT
option_name,
LENGTH(option_value) AS size
FROM wp_options
WHERE autoload = 'yes'
ORDER BY size DESC
LIMIT 50;
Великі autoload-опції можуть збільшувати обсяг даних, які WordPress завантажує під час запитів. Перед видаленням або зміною таких записів потрібно встановити, який плагін їх створив.
🏷️ Робота з категоріями та тегами
Переглянути всі терміни
SELECT *
FROM wp_terms
ORDER BY name;
Знайти категорію або тег за назвою
SELECT *
FROM wp_terms
WHERE name LIKE '%WordPress%';
Переглянути кількість записів у категоріях
SELECT
t.term_id,
t.name,
tt.taxonomy,
tt.count
FROM wp_terms t
JOIN wp_term_taxonomy tt
ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'category'
ORDER BY tt.count DESC;
Переглянути популярні теги
SELECT
t.term_id,
t.name,
tt.count
FROM wp_terms t
JOIN wp_term_taxonomy tt
ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'post_tag'
ORDER BY tt.count DESC;
🔍 Пошук даних у базі
Пошук по базі часто потрібен під час:
- перенесення сайту;
- зміни домену;
- пошуку шкідливого коду;
- видалення старого плагіна;
- пошуку старих URL;
- міграції HTTP → HTTPS;
- пошуку конкретного shortcode;
- діагностики помилок.
Пошук у контенті
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%example.com%';
Пошук у заголовках
SELECT ID, post_title
FROM wp_posts
WHERE post_title LIKE '%SEO%';
Пошук у postmeta
SELECT post_id, meta_key
FROM wp_postmeta
WHERE meta_value LIKE '%example.com%';
Пошук у налаштуваннях
SELECT option_name
FROM wp_options
WHERE option_value LIKE '%example.com%';
Для великих баз даних повний LIKE '%текст%' може бути ресурсомістким.
Якщо доступний WP-CLI, для пошуку рядка по базі можна використовувати wp db search. Офіційна документація WP-CLI наводить приклади пошуку значення в wp_options, wp_posts, wp_users та інших таблицях.
🧹 Очищення бази даних
Видалення записів із кошика
Перед видаленням:
SELECT ID, post_title
FROM wp_posts
WHERE post_status = 'trash';
Після перевірки:
DELETE FROM wp_posts
WHERE post_status = 'trash';
⚠️ Просте видалення записів із wp_posts може залишити пов'язані метадані.
Тому після ручного очищення варто перевірити wp_postmeta.
Пошук orphaned postmeta
Знайти метадані, для яких уже немає відповідного запису:
SELECT pm.meta_id, pm.post_id, pm.meta_key
FROM wp_postmeta pm
LEFT JOIN wp_posts p
ON pm.post_id = p.ID
WHERE p.ID IS NULL
LIMIT 100;
Після перевірки такі записи можна видалити:
DELETE pm
FROM wp_postmeta pm
LEFT JOIN wp_posts p
ON pm.post_id = p.ID
WHERE p.ID IS NULL;
⚠️ Перед виконанням DELETE обов'язково перевірте результат через SELECT.
🗑️ Видалення orphaned commentmeta
SELECT cm.meta_id, cm.comment_id, cm.meta_key
FROM wp_commentmeta cm
LEFT JOIN wp_comments c
ON cm.comment_id = c.comment_ID
WHERE c.comment_ID IS NULL
LIMIT 100;
Після перевірки:
DELETE cm
FROM wp_commentmeta cm
LEFT JOIN wp_comments c
ON cm.comment_id = c.comment_ID
WHERE c.comment_ID IS NULL;
🔄 Заміна HTTP на HTTPS
Під час міграції сайту на HTTPS потрібно знайти старі URL.
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%http://example.com%';
Також:
SELECT option_name
FROM wp_options
WHERE option_value LIKE '%http://example.com%';
І:
SELECT post_id, meta_key
FROM wp_postmeta
WHERE meta_value LIKE '%http://example.com%';
⚠️ Не варто бездумно виконувати глобальний REPLACE() по всій базі.
WordPress, WooCommerce та плагіни можуть зберігати серіалізовані PHP-дані. Простий SQL REPLACE() може пошкодити довжини рядків у serialized data.
Для міграції URL краще використовувати інструменти, які розуміють структуру WordPress, наприклад WP-CLI або спеціалізовані migration/search-replace інструменти.
🌐 Зміна домену сайту
Базові URL:
UPDATE wp_options
SET option_value = 'https://new-domain.com'
WHERE option_name = 'siteurl';
UPDATE wp_options
SET option_value = 'https://new-domain.com'
WHERE option_name = 'home';
Але цього недостатньо для повної міграції сайту.
Старий домен може залишитися:
- у
wp_posts; - у
wp_postmeta; - у
wp_options; - у
wp_usermeta; - у таблицях WooCommerce;
- у таблицях сторонніх плагінів.
Для складних міграцій краще використовувати інструменти, які коректно працюють із serialized data.
📊 Корисні діагностичні SQL-запити
Кількість записів за статусом
SELECT post_status, COUNT(*) AS total
FROM wp_posts
GROUP BY post_status
ORDER BY total DESC;
Кількість записів за типом
SELECT post_type, COUNT(*) AS total
FROM wp_posts
GROUP BY post_type
ORDER BY total DESC;
Це допоможе побачити, які custom post types використовуються на сайті.
Кількість коментарів за статусом
SELECT comment_approved, COUNT(*) AS total
FROM wp_comments
GROUP BY comment_approved;
Кількість користувачів за датою реєстрації
SELECT
DATE(user_registered) AS registration_date,
COUNT(*) AS total
FROM wp_users
GROUP BY DATE(user_registered)
ORDER BY registration_date DESC;
Перевірити версію MySQL/MariaDB
SELECT VERSION();
Перевірити розмір таблиць
У WP-CLI можна використовувати:
wp db size --tables
WP-CLI підтримує виведення розміру окремих таблиць WordPress.
🔎 SQL для SEO та технічного аудиту
SQL може бути корисним не тільки розробникам, а й під час SEO-аудиту WordPress.
Знайти записи без заголовка
SELECT ID, post_title, post_status
FROM wp_posts
WHERE post_type = 'post'
AND post_status = 'publish'
AND post_title = '';
Знайти дуже короткі записи
SELECT
ID,
post_title,
LENGTH(post_content) AS content_length
FROM wp_posts
WHERE post_type = 'post'
AND post_status = 'publish'
ORDER BY content_length ASC
LIMIT 100;
Знайти записи з однаковими заголовками
SELECT
post_title,
COUNT(*) AS total
FROM wp_posts
WHERE post_type = 'post'
AND post_status = 'publish'
GROUP BY post_title
HAVING total > 1
ORDER BY total DESC;
Це може бути корисно для пошуку потенційних проблем із дублюванням контенту.
Знайти записи з конкретним shortcode
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%[shortcode%';
Знайти записи, у яких зустрічається iframe
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%<iframe%';
Знайти зовнішні URL у контенті
Повноцінний аналіз зовнішніх посилань краще виконувати спеціалізованими SEO-інструментами, але SQL можна використовувати для пошуку конкретного домену:
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%example.com%';
🛒 SQL-запити для WooCommerce
WooCommerce додає власні таблиці та використовує дані WordPress для товарів, замовлень та метаданих.
Назви таблиць і структура можуть відрізнятися залежно від версії WooCommerce та способу зберігання даних, тому перед виконанням SQL потрібно перевіряти актуальну структуру конкретного сайту.
Знайти товари
У класичній моделі товар є post type:
SELECT ID, post_title, post_status
FROM wp_posts
WHERE post_type = 'product'
ORDER BY ID DESC;
Порахувати товари
SELECT COUNT(*) AS products
FROM wp_posts
WHERE post_type = 'product';
Знайти товари без ціни
SELECT p.ID, p.post_title
FROM wp_posts p
LEFT JOIN wp_postmeta pm
ON p.ID = pm.post_id
AND pm.meta_key = '_price'
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND pm.post_id IS NULL;
Знайти товари за SKU
SELECT
p.ID,
p.post_title,
pm.meta_value AS sku
FROM wp_posts p
JOIN wp_postmeta pm
ON p.ID = pm.post_id
WHERE p.post_type = 'product'
AND pm.meta_key = '_sku'
AND pm.meta_value = 'SKU123';
⚠️ Для сучасних версій WooCommerce частина даних може зберігатися не тільки в
wp_posts/wp_postmeta. Перед написанням складних SQL-запитів перевіряйте структуру таблиць конкретної версії WooCommerce.
🧠 SQL-запити через WP-CLI
Якщо є SSH-доступ до сервера, часто зручніше використовувати WP-CLI.
Наприклад:
wp db query "SELECT ID, post_title FROM wp_posts WHERE post_status = 'publish' LIMIT 10"
Перевірити таблиці:
wp db tables
Експортувати базу:
wp db export backup.sql
Пошук тексту:
wp db search "example.com"
WP-CLI має окремі команди для роботи з базою, включаючи wp db query, wp db search, wp db tables, wp db size та експорт бази.
🔐 Безпечне використання SQL у WordPress
Якщо SQL виконується безпосередньо в phpMyAdmin або Adminer, головна небезпека — випадково змінити не ті дані.
Якщо ж SQL використовується всередині плагіна або теми, особливо важливо правильно обробляти динамічні значення.
WordPress рекомендує використовувати $wpdb і wpdb::prepare() для SQL-запитів із динамічними параметрами.
Наприклад:
global $wpdb;
$user_id = 123;
$sql = $wpdb->prepare(
"SELECT * FROM {$wpdb->users} WHERE ID = %d",
$user_id
);
$user = $wpdb->get_row($sql);
Для текстового значення:
global $wpdb;
$email = 'user@example.com';
$sql = $wpdb->prepare(
"SELECT * FROM {$wpdb->users} WHERE user_email = %s",
$email
);
$user = $wpdb->get_row($sql);
Для пошуку через LIKE використовуйте esc_like() перед prepare(). WordPress окремо документує такий порядок операцій.
global $wpdb;
$search = 'WordPress';
$like = '%' . $wpdb->esc_like( $search ) . '%';
$sql = $wpdb->prepare(
"SELECT ID, post_title
FROM {$wpdb->posts}
WHERE post_title LIKE %s",
$like
);
$posts = $wpdb->get_results( $sql );
❌ Не робіть так
$id = $_GET['id'];
$sql = "SELECT * FROM wp_posts WHERE ID = $id";
Якщо значення походить від користувача, такий підхід може створити SQL injection.
✅ Робіть так
$id = absint( $_GET['id'] );
$sql = $wpdb->prepare(
"SELECT * FROM {$wpdb->posts} WHERE ID = %d",
$id
);
Окрім безпеки, WordPress рекомендує по можливості використовувати стандартний WordPress API замість ручних SQL-запитів.

🧱 Не прив'язуйтеся до wp_
У статтях про SQL часто використовують:
SELECT * FROM wp_posts;
Але wp_ — не гарантований префікс.
У WordPress префікс може бути змінений під час встановлення.
Тому в PHP краще:
global $wpdb;
$table = $wpdb->posts;
або:
$table = $wpdb->prefix . 'my_custom_table';
Для динамічних назв таблиць у сучасному WordPress wpdb::prepare() підтримує %i для identifiers.
Наприклад:
$table = $wpdb->prefix . 'my_custom_table';
$sql = $wpdb->prepare(
"SELECT * FROM %i",
$table
);
🚨 Небезпечні SQL-запити
Особливо обережно потрібно працювати з:
DELETE FROM ...
UPDATE ...
TRUNCATE TABLE ...
та:
DROP TABLE ...
Найнебезпечніший варіант:
DELETE FROM wp_posts;
Такий запит може видалити практично весь контент із таблиці постів.
Ще небезпечніше:
DROP TABLE wp_posts;
Це вже видалення всієї таблиці.
Ніколи не запускайте подібні запити на production-сайті без повного розуміння наслідків і резервної копії.
🧪 Безпечний алгоритм роботи з DELETE та UPDATE
Перед:
DELETE FROM wp_postmeta
WHERE meta_key = 'example';
виконайте:
SELECT *
FROM wp_postmeta
WHERE meta_key = 'example';
Перед:
UPDATE wp_posts
SET post_status = 'draft'
WHERE post_type = 'post';
виконайте:
SELECT ID, post_title, post_status
FROM wp_posts
WHERE post_type = 'post';
Це просте правило допомагає уникнути великої кількості помилок:
Спочатку SELECT → перевірка результату → backup → UPDATE/DELETE.
📋 Шпаргалка SQL-запитів WordPress
| Завдання | SQL |
|---|---|
| Переглянути пости | SELECT * FROM wp_posts; |
| Знайти пост за ID | SELECT * FROM wp_posts WHERE ID = 123; |
| Знайти заголовок | WHERE post_title LIKE '%текст%' |
| Порахувати пости | SELECT COUNT(*) FROM wp_posts; |
| Знайти чернетки | WHERE post_status = 'draft' |
| Знайти спам | WHERE comment_approved = 'spam' |
| Видалити спам | DELETE FROM wp_comments WHERE comment_approved = 'spam'; |
| Знайти користувача | SELECT * FROM wp_users WHERE user_login = 'admin'; |
| Змінити email | UPDATE wp_users SET user_email = '...' WHERE ID = 123; |
| Переглянути options | SELECT * FROM wp_options; |
| Переглянути URL | WHERE option_name IN ('siteurl','home') |
| Знайти meta_key | SELECT * FROM wp_postmeta WHERE meta_key = '...' |
| Порахувати meta_key | GROUP BY meta_key |
| Знайти категорії | SELECT * FROM wp_terms; |
| Перевірити версію БД | SELECT VERSION(); |

💡 Коли SQL для WordPress дійсно потрібен?
SQL особливо корисний у таких ситуаціях:
- 🔧 відновлення доступу до сайту;
- 🔄 міграція WordPress;
- 🌐 зміна домену;
- 🔐 аварійне відновлення;
- 🧹 очищення бази;
- 💬 масове видалення спаму;
- 👤 керування користувачами;
- 🔎 пошук конкретних даних;
- 📊 технічний аудит;
- 🛠️ розробка власних плагінів;
- 🛒 аналіз WooCommerce;
- 🚀 оптимізація бази даних.
При цьому SQL не завжди є найкращим інструментом. Якщо для конкретної операції WordPress уже має штатну функцію або WP-CLI-команду, краще використовувати її. Це відповідає рекомендаціям WordPress щодо безпеки та роботи з API.
❓ FAQ корисних SQL запитів для WordPress
Чи безпечно виконувати SQL-запити у WordPress?
Так, якщо ви розумієте, що робить запит, маєте резервну копію та використовуєте правильний синтаксис. Найбільший ризик становлять DELETE, UPDATE, TRUNCATE і DROP.
Де виконувати SQL-запити WordPress?
Найчастіше використовують phpMyAdmin, Adminer, MySQL/MariaDB CLI або WP-CLI.
Чи завжди таблиця WordPress називається wp_posts?
Ні. wp_ — стандартний префікс, але адміністратор може встановити інший.
Як знайти префікс таблиць WordPress?
Його можна перевірити у файлі wp-config.php:
$table_prefix = 'wp_';
Наприклад:
$table_prefix = 'abc_';
Тоді таблиця постів буде:
abc_posts
Як видалити всі спам-коментарі?
DELETE FROM wp_comments WHERE comment_approved = 'spam';
Перед видаленням рекомендується перевірити результат через SELECT.
Як знайти великі wp_options?
SELECT
option_name,
LENGTH(option_value) AS size
FROM wp_options
ORDER BY size
DESC LIMIT 50;
Чи можна змінити URL WordPress через SQL?
Так. Основні значення зберігаються в wp_options:
UPDATE wp_optionsSET option_value = 'https://example.com'WHERE option_name = 'siteurl';
UPDATE wp_optionsSET option_value = 'https://example.com'WHERE option_name = 'home';
Але для повної міграції домену цього недостатньо.
Чи можна використовувати SQL для SEO-аудиту?
Так. За допомогою SQL можна шукати записи без заголовків, дублікати заголовків, старі URL, shortcode, конкретні метаполя та інші технічні проблеми.
Чи можна запускати SQL через WP-CLI?
Так:
wp db query "SELECT COUNT(*) FROM wp_posts"
WP-CLI також має команди для пошуку, експорту, перевірки таблиць та аналізу розміру бази.
🏁 Висновок
SQL — потужний інструмент для адміністрування та розробки WordPress. Він дозволяє швидко працювати з даними, які іноді складно або неможливо змінити через стандартну адміністративну панель.
Найчастіше SQL використовується для:
- пошуку інформації;
- масового редагування;
- очищення бази;
- роботи з користувачами;
- роботи з коментарями;
- діагностики;
- міграції сайтів;
- технічного SEO-аудиту;
- аналізу WooCommerce.
Однак пряме редагування бази даних потребує обережності. Перед UPDATE або DELETE спочатку перевіряйте дані через SELECT, а перед критичними операціями робіть резервну копію.
Якщо SQL використовується у власному WordPress-коді, для динамічних значень використовуйте $wpdb->prepare(), а коли існує штатний WordPress API — віддавайте йому перевагу.
