Краткий ответ: WordPress-плагин, написанный через ChatGPT, нужно проверять не только на то, “работает или нет”. Нужно проверить структуру файлов, безопасность, nonce, права пользователей, sanitization, escaping, SQL-запросы, AJAX, REST API, debug.log, PHP-совместимость, нагрузку на базу, работу с WooCommerce, обновление, отключение и удаление плагина.
ChatGPT может быстро создать рабочий черновик плагина, но финальный код нельзя ставить на живой сайт без ревью. Особенно если плагин сохраняет данные, работает с пользователями, формами, файлами, заказами WooCommerce, оплатой, CRM, Telegram, API или админскими настройками.
Если плагин уже установлен и после правок начал ломать сайт, сначала разберите общую проблему по статье что делать, если проект после вайб-кодинга начал ломаться. Если проблема не в одном плагине, а в качестве AI-кода в целом, полезно свериться с разбором почему код от ChatGPT работает, но его сложно поддерживать.
Плагин WordPress — это не просто PHP-файл. Даже маленький плагин может подключаться к хукам WordPress, создавать шорткоды, добавлять AJAX-обработчики, сохранять настройки в wp_options, создавать таблицы MySQL, выводить HTML, подключать CSS/JS и менять поведение админки.
ChatGPT часто пишет код под конкретный пример из промпта. Если в промпте не было требований по безопасности, совместимости, ролям пользователей, WooCommerce, нагрузке, удалению данных и обновлениям, эти части могут быть пропущены.
Чаще всего проблемы появляются из-за таких причин:
Проверку AI-плагина лучше начинать на staging-копии или локальной копии сайта. Не ставьте непроверенный плагин сразу на рабочий сайт, особенно если там WooCommerce, заявки, личный кабинет или платёжные модули.
| Что проверить | Где смотреть | Что считается проблемой |
|---|---|---|
| Структура плагина | папка плагина, главный PHP-файл, includes, assets | всё лежит в одном файле, нет разделения логики |
| Заголовок плагина | главный PHP-файл | нет Plugin Name, Version, Author, Text Domain |
| Имена функций | все PHP-файлы | save_data(), get_items(), render_table() без уникального префикса |
| Безопасность форм | HTML формы, обработчик PHP | нет nonce, current_user_can(), sanitization |
| AJAX | wp_ajax_*, JavaScript, Network | нет check_ajax_referer(), action не совпадает, нет проверки прав |
| SQL | $wpdb-запросы | нет $wpdb->prepare(), нет лимитов, запросы внутри циклов |
| Вывод данных | HTML, таблицы, shortcode, admin page | нет esc_html(), esc_attr(), esc_url() |
| Подключение CSS/JS | wp_enqueue_scripts, admin_enqueue_scripts | скрипты грузятся на всех страницах без необходимости |
| Ошибки PHP | debug.log, error_log | warning, notice, fatal error после активации |
| Удаление плагина | uninstall.php, register_uninstall_hook() | данные остаются в базе без контроля или удаляются без предупреждения |
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Проверка плагина от ChatGPT должна идти по шагам: сначала безопасность и критические ошибки, потом структура, производительность, совместимость и удобство поддержки.
Если плагин уже большой, работает с оплатой, заказами, API или личными данными, лучше не ограничиваться поверхностной проверкой. В таких случаях логичнее делать технический аудит и доработку, как в услуге доработка проекта после вайб-кодинга.
Важно: код ниже нужен для диагностики и примеров проверки. Перед изменением wp-config.php, functions.php, кастомного плагина или базы данных сделайте backup. Не включайте вывод ошибок посетителям сайта.
Куда вставлять: в файл wp-config.php, выше строки /* That’s all, stop editing! */. Код включает запись ошибок в debug.log, но не показывает ошибки пользователям.
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);
После этого проверьте файл:
/wp-content/debug.log
Проверка синтаксиса PHP из терминала. Команды запускаются локально или на сервере в папке плагина:
php -l my-plugin.php
find . -name "*.php" -print0 | xargs -0 -n1 php -l
Проверка плагина через WP-CLI. Команды выполняются из корня WordPress-сайта:
wp plugin list
wp plugin activate plugin-folder-name
wp plugin deactivate plugin-folder-name
wp option get siteurl
wp option get home
Быстрый поиск опасных мест в AI-сгенерированном плагине. Команды запускаются в папке плагина:
grep -R "$_POST" . -n
grep -R "$_GET" . -n
grep -R "$_REQUEST" . -n
grep -R "$wpdb->query" . -n
grep -R "$wpdb->get_results" . -n
grep -R "wp_ajax_" . -n
grep -R "add_shortcode" . -n
grep -R "wp_redirect" . -n
grep -R "eval(" . -n
grep -R "base64_decode" . -n
Важно: найденная строка не всегда означает ошибку. Проверяйте контекст: есть ли nonce, проверка прав, sanitization, escaping и $wpdb->prepare().
Пример безопасного AJAX-обработчика. Куда вставлять: в главный файл плагина или отдельный PHP-файл, подключённый внутри плагина.
add_action('wp_ajax_sc_plugin_save_settings', 'sc_plugin_save_settings');
function sc_plugin_save_settings() {
if (!current_user_can('manage_options')) {
wp_send_json_error(array(
'message' => 'Недостаточно прав.'
), 403);
}
check_ajax_referer('sc_plugin_settings_nonce', 'nonce');
$title = isset($_POST['title']) ? sanitize_text_field(wp_unslash($_POST['title'])) : '';
if ($title === '') {
wp_send_json_error(array(
'message' => 'Поле title пустое.'
), 400);
}
update_option('sc_plugin_title', $title, false);
wp_send_json_success(array(
'message' => 'Настройки сохранены.'
));
}
Пример jQuery-запроса для WordPress. Куда вставлять: в JS-файл плагина или временно в админский шаблон для диагностики. В реальном плагине nonce лучше передавать через wp_localize_script().
jQuery(document).on('click', '.sc-plugin-save-button', function(e) {
e.preventDefault();
var title = jQuery('.sc-plugin-title').val();
var nonce = jQuery('.sc-plugin-nonce').val();
jQuery.ajax({
url: '<?php echo admin_url("admin-ajax.php") ?>',
type: 'POST',
dataType: 'json',
data: {
action: 'sc_plugin_save_settings',
nonce: nonce,
title: title
},
success: function(response) {
if (response.success) {
console.log(response.data.message);
} else {
console.log(response.data.message);
}
},
error: function(xhr) {
console.log('Ошибка AJAX:', xhr.status);
}
});
});
Пример проверки SQL-запроса. Куда вставлять: в PHP-файл плагина, где выполняется выборка данных.
function sc_plugin_get_items_by_status($status) {
global $wpdb;
$status = sanitize_text_field($status);
if ($status === '') {
return array();
}
$table_name = $wpdb->prefix . 'sc_plugin_items';
return $wpdb->get_results(
$wpdb->prepare(
"SELECT id, title, status, created_at
FROM {$table_name}
WHERE status = %s
ORDER BY created_at DESC
LIMIT 100",
$status
)
);
}
После диагностики на рабочем сайте отключите debug-режим:
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);
Проверьте, есть ли корректный заголовок плагина. Без него WordPress может не распознать плагин или неправильно показать его в админке.
/*
Plugin Name: SC Custom Plugin
Description: Custom functionality for WordPress.
Version: 1.0.0
Author: Sites Creator
Text Domain: sc-custom-plugin
*/
Также проверьте, чтобы прямой доступ к PHP-файлам был закрыт:
if (!defined('ABSPATH')) {
exit;
}
Плохой признак — общие имена функций:
Лучше использовать уникальный префикс:
Если плагин сохраняет настройки, проверьте:
Проверьте каждый обработчик wp_ajax_ и wp_ajax_nopriv_. Если обработчик меняет данные, он должен проверять nonce и права пользователя.
| Тип AJAX | Что проверить | Риск |
|---|---|---|
| wp_ajax_* | nonce, current_user_can(), sanitization | авторизованный пользователь может выполнить лишнее действие |
| wp_ajax_nopriv_* | ограничения, nonce, rate limit, валидация | гость или бот может спамить запросами |
| Сохранение настроек | manage_options, check_ajax_referer() | изменение настроек без прав |
| Загрузка файлов | тип файла, размер, права, nonce | загрузка вредоносных файлов |
| Удаление данных | права, nonce, подтверждение | потеря данных |
AI часто пишет SQL, который работает на тесте, но плохо выдерживает реальный сайт.
Проверьте:
Плагин не должен подключать свои скрипты и стили на всех страницах сайта, если они нужны только на одной странице админки или конкретном шорткоде.
Проверьте:
Если плагин касается WooCommerce, проверяйте не только страницу настроек. Нужно пройти весь путь клиента.
| Признак | Черновик от ChatGPT | Готовый к работе плагин |
|---|---|---|
| Структура | один большой файл | логика разделена по файлам |
| Безопасность | может не быть nonce и прав | есть nonce, current_user_can(), sanitization, escaping |
| SQL | запросы собраны строками | используется $wpdb->prepare() |
| Ошибки | ошибки не обрабатываются | есть fallback и понятные сообщения |
| AJAX | работает только на тесте | проверен в Network, с ролями и ошибками |
| Производительность | нет лимитов и пагинации | есть LIMIT, пагинация, индексы, кеш где нужно |
| Поддержка | сложно понять, что менять | есть понятные функции, префиксы и структура |
| Удаление | непонятно, что остаётся в базе | есть controlled uninstall-логика |
После нормальной проверки плагина должно быть понятно, можно ли ставить его на рабочий сайт, что нужно исправить и какие риски остаются.
Лучший вариант — установить плагин на копии сайта. Так можно увидеть конфликты с реальной темой, плагинами, WooCommerce, кешем и ролями пользователей без риска для рабочего проекта.
Если плагин меняется через ChatGPT несколько раз, ведите Git. Тогда видно, какие строки изменились и можно быстро откатить опасную правку.
Плагин может работать у администратора, но ломаться у менеджера магазина, редактора или обычного пользователя. Проверяйте роли отдельно.
Создайте тест, где таблица пустая, поле не заполнено, API не ответил, пользователь не авторизован, файл не загружен. Хороший плагин должен обрабатывать такие ситуации без белого экрана.
После установки AI-плагина проверьте сайт после обновления WordPress, темы и ключевых плагинов. Если плагин ломается после обновлений, смотрите порядок восстановления в статье после обновления плагина сломался сайт WordPress.
Если плагин уже установлен и ведёт себя нестабильно, ищите проблему по симптомам.
| Проблема | Вероятная причина | Что делать |
|---|---|---|
| Сайт падает после активации | PHP fatal error, конфликт функции, несовместимость PHP | проверить debug.log, php -l, error_log, переименовать папку плагина |
| Админка открывается с ошибками | ошибка admin hook, CSS/JS конфликт, capability | проверить wp-admin, консоль, debug.log, роли |
| AJAX возвращает 400 | неверный action, nonce, структура POST | проверить Network, data, check_ajax_referer() |
| AJAX возвращает 403 | нет прав, WAF, security-плагин | проверить current_user_can(), роль, server logs |
| AJAX возвращает 500 | PHP fatal error внутри обработчика | проверить debug.log и error_log |
| Данные не сохраняются | не совпадают имена полей, sanitize обнуляет значение, SQL-ошибка | логировать входные данные, проверить SQL и wp_options |
| Данные выводятся криво | нет escaping или неправильная кодировка | проверить esc_html(), esc_attr(), wp_kses() |
| Сайт стал медленнее | скрипты грузятся везде, SQL без лимитов, API на каждом хите | проверить Query Monitor, Network, SQL, wp_enqueue |
| WooCommerce начал ломаться | конфликт хуков, кеш, checkout, сессии, оплата | проверить товар, корзину, checkout, оплату, WooCommerce logs |
Проверьте плагин на staging-копии: PHP-синтаксис, debug.log, структуру файлов, nonce, права пользователей, sanitization, escaping, SQL через $wpdb->prepare(), AJAX, REST API, CSS/JS, нагрузку, WooCommerce-сценарии, отключение и удаление.
Не стоит. Сначала сделайте backup и проверьте плагин на тестовой копии. Даже если код выглядит простым, он может вызвать fatal error, конфликт функций, ошибку AJAX или проблему безопасности.
Самые опасные места: SQL без prepare, AJAX без nonce, действия без current_user_can(), вывод без escaping, загрузка файлов без проверки, общие имена функций и отсутствие обработки ошибок.
Проверьте все входные данные, сохранение, вывод, AJAX, REST API, права пользователей, SQL-запросы, загрузку файлов и логи. Для действий, которые меняют данные, должны быть nonce и проверка прав.
Признаки: один огромный файл, общие имена функций, нет nonce, нет sanitization, SQL собран строкой, CSS/JS грузятся везде, нет uninstall-логики, нет обработки ошибок, debug.log показывает warning или notice.
Через FTP/SFTP переименуйте папку плагина в /wp-content/plugins/, проверьте debug.log и error_log. После восстановления не активируйте плагин снова на рабочем сайте без исправления причины.
Откройте DevTools браузера, вкладку Network, выполните действие и проверьте запрос к admin-ajax.php: action, nonce, POST-данные, HTTP-статус, JSON-ответ и ошибки в debug.log.
Да. Даже шорткод может делать SQL-запросы, выводить пользовательские данные, подключать CSS/JS, ломать верстку или создавать нагрузку. Вывод должен быть экранирован.
Ищите $wpdb->query(), $wpdb->get_results(), $wpdb->get_var(), $wpdb->insert(), $wpdb->update(). Проверьте, что данные очищаются, запросы подготовлены через $wpdb->prepare(), есть LIMIT и учитывается $wpdb->prefix.
Если код хаотичный, небезопасный, дублируется, ломается при каждой правке, работает с заказами или персональными данными и не имеет понятной структуры, часто надёжнее переписать критические части.
WordPress-плагин, написанный через ChatGPT, можно использовать только после технической проверки. Рабочая кнопка, шорткод или AJAX-запрос ещё не означают, что плагин безопасен, совместим и готов к поддержке.
Безопасный порядок такой: backup, staging, проверка PHP-синтаксиса, debug.log, структура файлов, nonce, права, sanitization, escaping, SQL, AJAX, REST API, CSS/JS, роли пользователей, WooCommerce-сценарии, отключение и uninstall. После такой проверки понятно, можно ли плагин ставить на рабочий сайт или его нужно дорабатывать.
Рекомендуем услугу: проверка AI-сгенерированного WordPress-плагина
Об авторе