دادن دسترسی Administrator با phpMyAdmin چطور انجام میشود؟
تحلیل مهندسی ارتقای کاربر وردپرس به Administrator از طریق phpMyAdmin از منظر Capability، Serialization و Cache Invalidation؛ راهنمای گامبهگام.
دادن دسترسی Administrator با phpMyAdmin یکی از عملیات پرکاربرد در مدیریت وردپرس است که در سناریوهای مختلف به کار میآید: ارتقای کاربر موجود به ادمین، بازیابی دسترسی پس از حذف نقش، ایجاد دسترسی اضطراری بدون دسترسی به پنل، یا انتقال مالکیت سایت. phpMyAdmin بهعنوان یکی از محبوبترین ابزارهای مدیریت MySQL، امکان اجرای مستقیم کوئری روی جداول وردپرس را فراهم میکند. اما این عملیات، برخلاف تصور رایج، تنها با یک UPDATE ساده انجام نمیشود. وردپرس برای ذخیرهی Capability، از Serialized Array استفاده میکند که ساختار آن باید دقیق باشد و در صورت اشتباه، کاربر دسترسی نخواهد داشت. همچنین، Cache ممکن است اطلاعات قدیمی را نگه دارد و تغییرات اعمال نشود. در این راهنما، فرآیند مهندسی دادن دسترسی Administrator با phpMyAdmin، از ساختار داده تا اعتبارسنجی، بررسی میشود.
در یکی از پروژههای بازیابی، کاربری که باید به ادمین ارتقا مییافت، پس از UPDATE روی wp_usermeta، همچنان دسترسی ادمین نداشت. بررسی نشان داد که رکورد wp_capabilities در واقع بهصورت Serialized Array ذخیره نشده بود و بهصورت String ساده درج شده بود. این تجربه نشان میدهد که ساختار دقیق Serialization، کلید موفقیت است.
ساختار Capability در وردپرس
در وردپرس، دسترسی کاربران از طریق Capability تعریف میشود. هر Role، مجموعهای از Capabilityها است:
| Role | User Level | Capability کلیدی |
|---|---|---|
| Subscriber | 0 | read |
| Contributor | 1 | edit_posts |
| Author | 2 | publish_posts |
| Editor | 7 | edit_others_posts |
| Administrator | 10 | manage_options |
Serialization Array و ساختار
وردپرس Capabilityها را بهصورت PHP Serialized Array در wp_usermeta ذخیره میکند:
a:1:{s:13:"administrator";b:1;}
ساختار دقیق:
a:1: Array با یک عنصر.{...}: محتوای Array.s:13: String با طول ۱۳ کاراکتر."administrator": نام Role.b:1: Boolean true.
نمونههای دیگر
// Editor
a:1:{s:6:"editor";b:1;}
// Author
a:1:{s:6:"author";b:1;}
// چند Role
a:2:{s:6:"editor";b:1;s:10:"subscriber";b:1;}
// Custom Role
a:1:{s:15:"custom_role_name";b:1;}
هشدار مهم
اگر مقدار Capability بهصورت String ساده (مثلاً administrator) درج شود، وردپرس آن را نادیده میگیرد و کاربر دسترسی ادمین نخواهد داشت.
آمادهسازی و Backup
پیش از هر تغییری در دیتابیس، آمادهسازی ضروری است:
- Backup کامل دیتابیس: با mysqldump یا ابزار phpMyAdmin.
- دسترسی به phpMyAdmin: از طریق پنل هاست یا cPanel.
- اطلاعات کاربر هدف: نام کاربری و ID.
- ثبت وضعیت فعلی: اسکرینشات یا Export از
wp_usermeta. - زمان مناسب: در ساعات کمترافیک.
# بکاپ از CLI
mysqldump -u user -p database wp_users wp_usermeta > users-backup.sql
# یا از phpMyAdmin
# Export → Custom → wp_users + wp_usermeta
دسترسی به phpMyAdmin
روشهای دسترسی:
- cPanel: بخش Databases → phpMyAdmin.
- Plesk: بخش Databases → phpMyAdmin.
- DirectAdmin: بخش MySQL Management.
- SSH Tunnel: برای دسترسی امن.
- آدرس مستقیم: معمولاً
/phpmyadmin.
# دسترسی امن با SSH Tunnel
ssh -L 8080:localhost:80 user@server
# سپس در مرورگر: http://localhost:8080/phpmyadmin
یافتن کاربر هدف
پیش از تغییر، باید ID کاربر را پیدا کنید:
-- یافتن کاربر با نام کاربری
SELECT ID, user_login, user_email
FROM wp_users
WHERE user_login = "target_user";
-- یافتن تمام کاربران
SELECT ID, user_login, user_email, display_name
FROM wp_users
ORDER BY ID;
-- یافتن ادمینها
SELECT u.ID, u.user_login, u.user_email, um.meta_value
FROM wp_users u
JOIN wp_usermeta um ON um.user_id = u.ID
WHERE um.meta_key = "wp_capabilities"
AND um.meta_value LIKE "%administrator%";
بهروزرسانی Capability
روش ۱: UPDATE رکورد موجود
UPDATE wp_usermeta
SET meta_value = 'a:1:{s:13:"administrator";b:1;}'
WHERE user_id = 5
AND meta_key = "wp_capabilities";
روش ۲: INSERT در صورت نبود رکورد
INSERT INTO wp_usermeta (user_id, meta_key, meta_value)
SELECT 5, "wp_capabilities", 'a:1:{s:13:"administrator";b:1;}'
WHERE NOT EXISTS (
SELECT 1 FROM wp_usermeta
WHERE user_id = 5 AND meta_key = "wp_capabilities"
);
روش ۳: ترکیبی (Upsert)
SET @user_id = 5;
SET @cap = 'a:1:{s:13:"administrator";b:1;}';
UPDATE wp_usermeta
SET meta_value = @cap
WHERE user_id = @user_id AND meta_key = "wp_capabilities";
INSERT INTO wp_usermeta (user_id, meta_key, meta_value)
SELECT @user_id, "wp_capabilities", @cap
WHERE ROW_COUNT() = 0;
روش ۴: از طریق phpMyAdmin GUI
- انتخاب دیتابیس وردپرس.
- کلیک روی
wp_usermeta. - جستجوی رکورد با
user_id = 5وmeta_key = "wp_capabilities". - کلیک روی Edit.
- تغییر
meta_valueبهa:1:{s:13:"administrator";b:1;}. - کلیک Go.
تنظیم wp_user_level
وردپرس از دو مکانیزم موازی استفاده میکند: Capability (جدید) و User Level (قدیمی). برای سازگاری کامل، هر دو باید تنظیم شوند:
UPDATE wp_usermeta
SET meta_value = "10"
WHERE user_id = 5 AND meta_key = "wp_user_level";
-- در صورت نبود رکورد
INSERT INTO wp_usermeta (user_id, meta_key, meta_value)
SELECT 5, "wp_user_level", "10"
WHERE NOT EXISTS (
SELECT 1 FROM wp_usermeta
WHERE user_id = 5 AND meta_key = "wp_user_level"
);
| Role | User Level |
|---|---|
| Subscriber | 0 |
| Contributor | 1 |
| Author | 2 |
| Editor | 7 |
| Administrator | 10 |
Cache Invalidation
Cache ممکن است اطلاعات قدیمی نقش کاربر را نگه دارد:
-- پاکسازی Cache در دیتابیس (در صورت نبود Redis)
DELETE FROM wp_options
WHERE option_name LIKE "_transient_%"
OR option_name LIKE "_site_transient_%";
# پاکسازی Redis
redis-cli FLUSHALL
# پاکسازی Memcached
echo "flush_all" | nc localhost 11211
# پاکسازی Cache وردپرس (در صورت دسترسی)
wp cache flush
اعتبارسنجی
-- بررسی Capability
SELECT um.user_id, u.user_login, um.meta_key, um.meta_value
FROM wp_usermeta um
JOIN wp_users u ON u.ID = um.user_id
WHERE u.ID = 5
AND um.meta_key IN ("wp_capabilities", "wp_user_level");
-- بررسی نهایی
SELECT u.ID, u.user_login, u.user_email, um.meta_value AS capabilities
FROM wp_users u
JOIN wp_usermeta um ON um.user_id = u.ID
WHERE um.meta_key = "wp_capabilities"
AND um.meta_value LIKE "%administrator%";
سپس با ورود به پنل، دسترسی کاربر بررسی شود.
بازگرداندن به نقش قبلی
-- بازگرداندن به Editor
UPDATE wp_usermeta
SET meta_value = 'a:1:{s:6:"editor";b:1;}'
WHERE user_id = 5 AND meta_key = "wp_capabilities";
UPDATE wp_usermeta
SET meta_value = "7"
WHERE user_id = 5 AND meta_key = "wp_user_level";
پرسشهای پرتکرار
چرا پس از UPDATE، کاربر دسترسی ادمین ندارد؟
معمولاً بهدلیل Cache، Serialization نادرست، یا نبود wp_user_level.
آیا Serialization باید دقیقاً مطابق فرمت باشد؟
بله، هر کاراکتری مهم است. تعداد کاراکترهای Role در s:13 باید دقیق باشد.
چگونه تعداد کاراکترهای Role را بشماریم؟
مثلاً administrator ۱۳ کاراکتر است. editor ۶ کاراکتر. subscriber ۱۰ کاراکتر.
آیا نیاز به تغییر wp_user_level است؟
برای سازگاری با کدهای قدیمی، بله.
چگونه Cache را پاک کنیم؟
با Redis FLUSHALL، Memcached flush_all، یا WP-CLI cache flush.
آیا پس از تغییر، نیاز به Restart MySQL است؟
خیر، تنها Cache باید پاک شود.
آیا phpMyAdmin امن است؟
با HTTPS، IP Whitelist و پسورد قوی، بله.
چگونه تغییرات را بازگردانیم؟
با اجرای UPDATE معکوس یا بازیابی از Backup.
اشتباهات رایج
| اشتباه | علت | راهحل |
|---|---|---|
| Serialization نادرست | شمارش اشتباه کاراکتر | استفاده از فرمت دقیق |
| فراموشی wp_user_level | ناآشنایی | تنظیم هر دو |
| عدم پاکسازی Cache | فرض نبود Cache | Redis/Memcached Flush |
| عدم Backup | شتاب | Backup کامل |
| ویرایش رکورد اشتباه | عدم بررسی user_id | بررسی دقیق |
| عدم اعتبارسنجی | فرض موفقیت | ورود و تست |
| اجرای کوئری در دیتابیس اشتباه | چند سایت روی یک MySQL | بررسی Database Name |
| عدم حذف دسترسی پس از تست | فراموشی | بازگرداندن به نقش قبلی |
ملاحظات پیشرفته
در سطح معماری، مدیریت Role نیازمند استراتژی جامع است:
۱. Custom Role: تعریف Role با Capability سفارشی.
۲. Capability Mapping: نگاشت دقیق Capabilityها.
۳. Role Manager Plugin: برای مدیریت GUI.
۴. Audit Log: ثبت تمام تغییرات نقش.
۵. Backup Strategy: بکاپ پیش از تغییرات.
۶. MFA: فعالسازی برای ادمینها.
۷. IP Whitelisting: محدودسازی ورود ادمین.
۸. Principle of Least Privilege: اعطای حداقل دسترسی لازم.
برای مطالعهی بیشتر، پستهای ایجاد کاربر ادمین وردپرس با MySQL، ایجاد حساب مدیر وردپرس با MySQL بدون پنل، ایجاد مدیر جدید بدون ورود به پیشخوان وردپرس، مدیریت کاربران و نقشها در وردپرس، کنترل نقشها و دسترسیهای وردپرس با افزونه، چگونه کاربر جدید به وردپرس اضافه کنیم، آموزش مدیریت دیتابیس وردپرس و انتخاب افزونه مدیریت کاربران وردپرس مناسب مراجع کاملی هستند.
نتیجه
دادن دسترسی Administrator با phpMyAdmin یک عملیات مهندسی چندمرحلهای است که نیازمند درک دقیق Serialization، Capability و Cache است. هر اشتباه کوچک در فرمت Serialized Array یا فراموشی Cache Invalidation، میتواند منجر به شکست عملیات شود. Backup، اعتبارسنجی و پاکسازی پس از عملیات، بخشی جداییناپذیر از فرآیند است.
💡 اگر تجربهای در ارتقای کاربر به ادمین با phpMyAdmin داشتهاید، برای ما جالب است بدانیم کدام چالش بیشترین زمان را از شما گرفت: Serialization، Cache یا User Level. تجربهی خودتان را در دیدگاهها بنویسید.