دادن دسترسی 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

پیش از هر تغییری در دیتابیس، آماده‌سازی ضروری است:

  1. Backup کامل دیتابیس: با mysqldump یا ابزار phpMyAdmin.
  2. دسترسی به phpMyAdmin: از طریق پنل هاست یا cPanel.
  3. اطلاعات کاربر هدف: نام کاربری و ID.
  4. ثبت وضعیت فعلی: اسکرین‌شات یا Export از wp_usermeta.
  5. زمان مناسب: در ساعات کم‌ترافیک.
# بکاپ از 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

  1. انتخاب دیتابیس وردپرس.
  2. کلیک روی wp_usermeta.
  3. جستجوی رکورد با user_id = 5 و meta_key = "wp_capabilities".
  4. کلیک روی Edit.
  5. تغییر meta_value به a:1:{s:13:"administrator";b:1;}.
  6. کلیک 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. تجربه‌ی خودتان را در دیدگاه‌ها بنویسید.