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

کاربر جاری و شناسه

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

get_current_user_id();              // شناسهٔ کاربر جاری یا 0
get_current_user();                  // منسوخ، استفاده نکنید
wp_get_current_user();               // شیء WP_User کاربر جاری
wp_get_current_user()->ID;           // شناسه
wp_get_current_user()->user_login;   // نام کاربری
wp_get_current_user()->roles;        // آرایهٔ نقش‌ها

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

// الگوی درست
$user = wp_get_current_user();
if ( $user->ID ) {
    $name = $user->display_name;
    $email = $user->user_email;
}

دریافت کاربر

برای دریافت اطلاعات کاربر مشخصی، توابع مختلفی وجود دارد:

get_userdata( $user_id );              // شیء کامل کاربر
get_user_by( 'email', $email );         // با ایمیل
get_user_by( 'login', $username );      // با نام کاربری
get_user_by( 'id', $user_id );
get_user_by( 'slug', $user_nicename );
get_users( array( 'role' => 'editor' ) );
get_user_count();                        // تعداد کل کاربران

نکته: همیشه مقدار برگشتی را بررسی کنید:

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

یکی از اشتباهات پرتکرار: فرض وجود کاربر و دسترسی مستقیم به $user->display_name، بدون بررسی مقدار false. در سایت‌های چندساله که کاربران حذف می‌شوند، این اشتباه به خطای Fatal منتهی می‌شود. راهنمای کامل در توابع دادهٔ کاربر.

دریافت دادهٔ کاربر، مثل خواندن از یک پروندهٔ اداری است؛ قبل از باز کردن، مطمئن شوید پرونده وجود دارد.

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

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

$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 ) می‌تواند کاربر را بعد از ورود به همان صفحه برگرداند. راهنمای تکمیلی در توابع بررسی وضعیت ورود و افزونه‌های امنیت ورود.

نقش و دسترسی

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

// بررسی دسترسی
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 امن در وردپرس. یک نکته در بازبینی امنیتی: هر فرمی که current_user_can ندارد، در بازبینی رد می‌شود. حتی اگر فرم فقط به ادمین نمایش داده می‌شود، خط دفاعی دوم را حذف نکنید.

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

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

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 بگذارید. راهنمای کامل در توابع کاربران، توابع کوئری سفارشی، و بهینه‌سازی کوئری‌ها. در سایت‌های با کاربران زیاد (بیش از ۵۰۰۰ کاربر)، کوئری روی wp_usermeta می‌تواند سنگین شود؛ در این حالت، کش نتایج با Transients ضروری است. الگو در ترنزینت‌ها در وردپرس.

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

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

// افزودن
$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 خروجی و امنیت

دادهٔ کاربر، حساس‌ترین لایهٔ داده در وردپرس است. سه قاعدهٔ الزامی: یک — 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 امن در وردپرس، پاک‌سازی داده‌ها، اعتبارسنجی داده‌ها، نانس وردپرس، و امنیت پروژهٔ وردپرس. یک آسیب‌پذیری شایع که در پرونده‌های امنیتی بررسی‌شده دیده‌ام: کارت نویسنده‌ای که فیلد description را بدون wp_kses_post چاپ می‌کرد؛ با این حال، چون کاربران اجازهٔ ثبت HTML در بیو نداشتند، آسیب‌پذیری فعال نبود. اگر روزی نقش کاربری تغییر کند، همان کد به بستر XSS تبدیل می‌شود. همیشه escape را رعایت کنید تا کد شما در برابر تغییرات سیاسی محیط مقاوم باشد.

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

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