سال ۱۳۹۷ بود که اولین پروژه‌ی مدیریت کاربران را برای یک آموزشگاه آنلاین تحویل دادم. سایت باید سه سطح دسترسی داشت: مدیر، مدرس، و دانشجو. مدیر می‌توانست همه کار کند، مدرس فقط دوره‌های خودش را مدیریت کند، و دانشجو فقط محتوای خریداری‌شده را ببیند. من به‌جای استفاده از توابع استاندارد وردپرس، یک سیستم سفارشی با جدول اختصاصی ساختم. سه ماه بعد، کارفرما خواست که دانشجوها بتوانند در بخش نظرات هم مشارکت کنند. آن‌جا بود که فهمیدم سیستم سفارشی من، با تمام اکوسیستم وردپرس - از نظرات تا ووکامرس - بیگانه است. بازنویسی کامل، دو هفته وقت گرفت. از آن روز، یاد گرفتم که توابع کاربری وردپرس، نه یک گزینه، بلکه تنها مسیر درست هستند. در این مقاله، تجربه‌ام از کار با این توابع را با شما به اشتراک می‌گذارم.

اگر تازه با وردپرس آشنا شده‌اید، وردپرس چیست و چگونه شروع کنیم نقطه شروع خوبی است. همچنین برای درک کلی توابع، نحوه استفاده از توابع وردپرس در پروژه‌ها را پیشنهاد می‌کنم. این مقاله، مکمل توابع وردپرس برای داده‌های کاربر است و روی جنبه‌های عملیاتی و مدیریتی تمرکز دارد.

چرا مدیریت کاربران با توابع وردپرس مهم است؟

وردپرس از ابتدا با سیستم کاربری طراحی شده. جداول wp_users و wp_usermeta بخشی از هسته هستند و تمام اکوسیستم - از نظرات تا ووکامرس - با همین ساختار کار می‌کند. اگر شما سیستم سفارشی بسازید، در واقع یک جزیره جداگانه ساخته‌اید که هیچ افزونه‌ای نمی‌تواند با آن حرف بزند. سه دلیل بنیادین برای استفاده از توابع استاندارد:

  • یکپارچگی با اکوسیستم: ووکامرس، افزونه‌های عضویت، سیستم‌های تیکت - همه با WP_User کار می‌کنند. اگر شما از توابع استاندارد استفاده کنید، این افزونه‌ها به‌طور خودکار با کاربران شما کار می‌کنند.
  • امنیت آماده: توابعی مثل current_user_can و wp_verify_nonce نسل‌ها آزمون‌وخطا را در خود خلاصه کرده‌اند. راهنمای این لایه در PHP امن در وردپرس و نانس وردپرس آمده است.
  • سازگاری با آپدیت‌ها: تیم وردپرس مسئولیت سازگاری توابع رسمی را در آپدیت‌های بعدی می‌پذیرد. کد سفارشی شما، با هر تغییر ساختار دیتابیس، شکننده می‌شود.
مدیریت کاربران، فقط ذخیره‌کردن فیلدها نیست؛ تصمیم‌گیری دربارهٔ مالکیت داده، دسترسی و امنیت است.

دریافت اطلاعات کاربر

پایه‌ای‌ترین توابع در کار با کاربران، دریافت شناسه و شیء کاربر است:

get_current_user_id();              // شناسهٔ کاربر جاری یا 0
wp_get_current_user();               // شیء WP_User کاربر جاری
get_userdata( $user_id );            // شیء کامل کاربر
get_user_by( "email", $email );      // با ایمیل
get_user_by( "login", $username );   // با نام کاربری
get_user_by( "id", $user_id );
get_users( array( "role" => "editor" ) );
get_user_count();                    // تعداد کل کاربران

نکته‌ها: یک — بررسی مقدار برگشتی: get_user_by در صورت نبود کاربر، false برمی‌گرداند. همیشه بررسی کنید:

$user = get_user_by( "email", $email );
if ( false === $user ) {
    // کاربری با این ایمیل وجود ندارد
    return;
}
echo esc_html( $user->display_name );

دو — wp_get_current_user: اگر به چند فیلد نیاز دارید، یک بار صدا بزنید و در متغیر ذخیره کنید؛ نه چند بار پشت‌سرهم. سه — get_currentuserinfo: این تابع از وردپرس ۴.۵ منسوخ شده و در PHP 8 هشدار می‌دهد. راهنمای تکمیلی در توابع داده‌های کاربر و خطای Deprecated در PHP.

نام، ایمیل و نمایش

وردپرس چند فیلد نام دارد که در سناریوهای مختلف به‌کار می‌روند:

$user->user_login;      // نام کاربری (قابل تغییر نیست)
$user->display_name;    // نام نمایشی (پیشنهاد پیش‌فرض)
$user->first_name;      // نام
$user->last_name;       // نام خانوادگی
$user->user_email;      // ایمیل
$user->user_url;        // وبسایت
$user->description;     // توضیحات / بیوگرافی
$user->user_registered; // تاریخ ثبت‌نام

توابع میان‌بر برای کاربر جاری یا نویسنده:

get_the_author();                   // نام نمایشی نویسنده (در حلقه)
get_the_author_meta( "description" ); // یکی از فیلدها
get_the_author_meta( "ID" );         // شناسهٔ نویسنده
get_the_author_meta( "user_email" );
get_the_author_meta( "first_name" );
get_the_author_meta( "user_registered" );

نکته: برای کاربر جاری، از wp_get_current_user() استفاده کنید و فیلد را مستقیم بخوانید؛ برای نویسندهٔ نوشته در حلقه، از توابع get_the_author_* استفاده کنید. یک هشدار امنیتی: نمایش ایمیل کاربر در فرانت‌اند، خطر spam و افشای اطلاعات دارد. اگر ایمیل را نمایش می‌دهید، حتماً با یک فرم تماس یا لینک محافظت‌شده جایگزین کنید. راهنمای امنیت در امنیت وردپرس برای مبتدیان.

بررسی وضعیت ورود

برای اعمال منطق شرطی در قالب یا افزونه، وضعیت ورود کاربر را بررسی کنید:

is_user_logged_in();             // آیا لاگین کرده؟
get_current_user_id();           // شناسه یا 0

// مثال کاربردی
if ( is_user_logged_in() ) {
    echo "سلام، " . esc_html( wp_get_current_user()->display_name );
} else {
    printf(
        "<a href="%s">ورود</a>",
        esc_url( wp_login_url( get_permalink() ) )
    );
}

نکته: wp_login_url( $redirect ) می‌تواند کاربر را بعد از ورود به همان صفحه برگرداند. راهنمای تکمیلی در توابع بررسی وضعیت ورود و افزونه‌های امنیت ورود.

نقش و دسترسی (Capabilities)

نقش و دسترسی کاربر، پایهٔ کنترل رفتار سایت است:

// بررسی دسترسی
current_user_can( "edit_posts" );
current_user_can( "manage_options" );
current_user_can( "edit_post", $post_id );
current_user_can( "edit_user", $user_id );

// دریافت نقش‌ها
$user->roles;                                    // آرایهٔ نقش‌ها
in_array( "editor", $user->roles, true );
$user->has_cap( "edit_posts" );

// ساخت کاربر با نقش
user_can( $user_id, "manage_options" );

نکته‌ها: یک — current_user_can در فرم‌ها: پیش از هر عملیات حساس، این تابع الزامی است. دو — بررسی نقش با in_array: دقیق‌تر است که با has_cap بررسی کنید، نه نام نقش؛ چون نقش‌ها در پروژه‌های مختلف ممکن است سفارشی شوند. سه — user_can: برای بررسی دسترسی کاربر مشخصی که لزوماً کاربر جاری نیست. راهنمای کامل در توابع نقش و دسترسی، افزونه‌های مدیریت کاربران، و PHP امن در وردپرس.

متادیتای کاربر

متادیتای کاربر، لایهٔ دادهٔ اضافی روی حساب کاربری است:

get_user_meta( $user_id, "_phone", true );       // خواندن یک کلید
get_user_meta( $user_id );                        // همهٔ متاها (آرایه)
update_user_meta( $user_id, "_phone", $value );   // به‌روزرسانی
add_user_meta( $user_id, "_phone", $value );      // افزودن
delete_user_meta( $user_id, "_phone" );           // حذف

// برای کاربر جاری
get_user_meta( get_current_user_id(), "_points", true );

نکته: همیشه پارامتر سوم get_user_meta را true بگذارید تا مقدار تکی برگردد. اگر آرایه‌ای ذخیره کرده‌اید، خواندن با true همان آرایه را برمی‌گرداند. الگوی نمایش امن:

$phone = get_user_meta( $user_id, "_phone", true );
if ( ! empty( $phone ) ) {
    printf( "<p>تلفن: %s</p>", esc_html( $phone ) );
}

راهنمای کامل در کار با User Meta، توابع متادیتا، و توابع داده‌های کاربر.

آواتار

آواتار، تصویر شناخته‌شدهٔ کاربر در سراسر سایت است:

get_avatar( $user_id, 48 );
get_avatar_url( $user_id, array( "size" => 96 ) );
get_avatar_data( $user_id );

// در حلقه
get_avatar( get_the_author_meta( "ID" ), 48 );

// کاربر جاری
get_avatar( get_current_user_id(), 96 );

نکته‌ها: یک — پارامتر دوم (اندازه): به پیکسل. دو — خروجی HTML: get_avatar خروجی HTML کامل <img> است، بنابراین باید با echo چاپ شود، نه با esc_html. سه — alt و کلاس: می‌توانید در پارامتر چهارم، تنظیمات دلخواه بدهید:

echo get_avatar(
    $user_id,
    96,
    "",
    get_the_author(),
    array( "class" => "user-avatar rounded-full" )
);

اگر سایتی به Gravatar دسترسی ندارد (محدودیت شبکه‌ای)، ممکن است آواتارها بارگذاری نشوند. راه‌حل: تنظیم یک تصویر پیش‌فرض یا استفاده از افزونهٔ آواتار محلی. راهنمای تکمیلی در توابع داده‌های کاربر.

لیست کاربران و کوئری

برای فهرست و کوئری کاربران، از WP_User_Query یا get_users استفاده کنید:

// ساده
get_users( array( "role" => "editor" ) );
get_users( array( "number" => 20, "paged" => 1 ) );

// با متادیتا
$args = array(
    "meta_key"     => "_membership_level",
    "meta_value"   => "gold",
    "meta_compare" => "=",
    "number"       => 50,
    "orderby"      => "registered",
    "order"        => "DESC",
);
$users = get_users( $args );

// کوئری پیچیده
$args = array(
    "meta_query" => array(
        "relation" => "AND",
        array(
            "key"     => "_membership_level",
            "value"   => "gold",
        ),
        array(
            "key"     => "_last_login",
            "value"   => strtotime( "-30 days" ),
            "compare" => ">",
            "type"    => "NUMERIC",
        ),
    ),
    "number" => 50,
);
$users = get_users( $args );

foreach ( $users as $user ) {
    printf(
        "<li>%s (%s)</li>",
        esc_html( $user->display_name ),
        esc_html( $user->user_email )
    );
}

نکته‌های بهینه‌سازی: یک — number صریح بگذارید. بدون آن، همهٔ کاربران بارگذاری می‌شوند. دو — fields را محدود کنید. اگر فقط نام و ایمیل لازم است، از fields => array( "ID", "display_name", "user_email" ) استفاده کنید. سه — count_total را در موارد لازم. اگر فقط لیست می‌خواهید، count_total => false بگذارید. راهنمای کامل در توابع داده‌های کاربر، توابع کوئری سفارشی، و بهینه‌سازی کوئری‌ها.

افزودن، ویرایش و حذف کاربر

سه عمل پایهٔ مدیریت کاربران:

// افزودن
$user_id = wp_insert_user( array(
    "user_login"   => "newuser",
    "user_email"   => "user@example.com",
    "user_pass"    => wp_generate_password( 24 ),
    "display_name" => "نام نمایشی",
    "role"         => "subscriber",
) );

if ( is_wp_error( $user_id ) ) {
    error_log( $user_id->get_error_message() );
}

// به‌روزرسانی
wp_update_user( array(
    "ID"           => $user_id,
    "display_name" => "نام جدید",
) );

// حذف
require_once ABSPATH . "wp-admin/includes/user.php";
wp_delete_user( $user_id, $reassign_id = null );

نکته‌ها: یک — wp_generate_password: برای رمزهای اولیه امن. دو — is_wp_error: همیشه پس از افزودن بررسی کنید؛ اگر ایمیل تکراری باشد، خطا برمی‌گردد. سه — reassign: پیش از حذف کاربر، تعیین کنید نوشته‌هایش به کدام کاربر منتقل شوند یا حذف. راهنمای تکمیلی در توابع ایجاد و حذف نوشته و افزونه‌های مدیریت کاربران.

مدیریت کاربر، فقط ذخیره‌کردن فیلدها نیست؛ تصمیم‌گیری دربارهٔ مالکیت داده و انتقال آن است.

الگوهای ترکیبی در قالب

نمایش اطلاعات نویسنده در کارت نویسنده، یکی از پرتکرارترین الگوها در قالب‌های حرفه‌ای است:

<?php
$author_id = get_the_author_meta( "ID" );
$author_name = get_the_author();
$author_bio = get_the_author_meta( "description" );
$author_url = get_author_posts_url( $author_id );
$author_avatar = get_avatar( $author_id, 96 );
?>

<div class="author-card">
    <div class="author-avatar">
        <?php echo $author_avatar; ?>
    </div>
    <div class="author-info">
        <h3 class="author-name">
            <a href="<?php echo esc_url( $author_url ); ?>">
                <?php echo esc_html( $author_name ); ?>
            </a>
        </h3>
        <?php if ( $author_bio ) : ?>
            <p class="author-bio">
                <?php echo esc_html( $author_bio ); ?>
            </p>
        <?php endif; ?>
    </div>
</div>

سه نکته در این الگو: یک — ذخیره در متغیر: اگر چند بار از یک فیلد استفاده می‌کنید، یک بار در متغیر ذخیره کنید. دو — escape خروجی: esc_html برای متن، esc_url برای لینک. سه — بررسی خالی بودن: بیو خالی را نمایش ندهید. راهنمای کامل قالب در ساختار فایل‌های قالب استاندارد و توسعه قالب از صفر.

امنیت در توابع کاربر

دادهٔ کاربر، حساس‌ترین لایهٔ داده در وردپرس است. سه قاعدهٔ الزامی: یک — escape در نمایش. هر فیلد کاربر در فرانت، با تابع مناسب:

echo esc_html( $user->display_name );
echo esc_url( $user->user_url );
echo esc_attr( $user->user_login );
echo wp_kses_post( $user->description );

دو — بررسی دسترسی در ویرایش. پیش از هر عملیات روی کاربر، current_user_can( "edit_user", $user_id ) را چک کنید. سه — نانس در فرم‌ها. فرم‌های پروفایل و ثبت‌نام سفارشی، باید نانس داشته باشند. راهنمای کامل در PHP امن در وردپرس، پاک‌سازی داده‌ها، اعتبارسنجی داده‌ها، نانس وردپرس، و امن‌سازی ورود ادمین.

اشتباهات رایج

جمع‌بندی

توابع کاربر وردپرس، ده گروه دارند: کاربر جاری، دریافت کاربر، نام و ایمیل، وضعیت ورود، نقش و دسترسی، متادیتا، آواتار، لیست کاربران، افزودن و ویرایش، و escape خروجی. تسلط بر این فهرست، در هر پروژه‌ای که با کاربران سروکار دارد — از سایت شخصی تا فروشگاه و پلتفرم آموزشی — سرعت کار و کیفیت کد را چند برابر می‌کند. اگر امروز یک کار در این مسیر انجام می‌دهید: یکی از فایل‌های قالب فعلی خود را باز کنید و ببینید کدام بخش‌ها با get_currentuserinfo یا دسترسی مستقیم به متغیرهای سراسری نوشته شده‌اند؛ همان بخش‌ها، فهرست اقدام شماست.

اگر تجربه‌ای از یک باگ در نمایش یا ویرایش دادهٔ کاربر دارید که با تابع درست حل شد، در دیدگاه‌ها بنویسید — همان گزارش‌های واقعی، این راهنما را برای توسعه‌دهندهٔ بعدی دقیق‌تر می‌کند. 👤