تابع register_rest_route ابزار اصلی وردپرس برای ساخت endpoint‌های سفارشی در REST API است. این تابع امکان تعریف مسیر، متد، پارامترهای ورودی، اعتبارسنجی و کنترل دسترسی را فراهم می‌کند. طراحی درست این تابع با انتخاب namespace مناسب، permission_callback امن، sanitize و validate آرگومان‌ها، پایه پیاده‌سازی REST API حرفه‌ای محسوب می‌شود. اشتباهات رایجی مانند نبود permission_callback، نبود sanitize، نبود validate و نبود تست می‌تواند به افشای داده، تغییر ناخواسته و حفره‌های امنیتی منجر شود. تسلط بر این تابع برای REST API ضروری است و در اتصال اپلیکیشن کاربرد جدی دارد.

چرا endpoint سفارشی یک نیاز جدی است؟

وردپرس یک REST API جامع دارد که برای دسترسی به پست‌ها، کاربران، دسته‌بندی‌ها و سایر منابع آماده است. اما افزونه‌های حرفه‌ای معمولاً نیاز به endpoint‌های سفارشی دارند: دریافت آمار فروش، ذخیره تنظیمات، ارسال نوتیفیکیشن یا اتصال به اپلیکیشن موبایل. تابع register_rest_route ابزار اصلی برای ساخت این endpoint‌هاست. با این تابع، می‌توانید مسیرهای سفارشی با متد، پارامتر و کنترل دسترسی تعریف کنید.

تابع register_rest_route چیست؟

تابع register_rest_route() یک تابع هسته وردپرس است که در فایل wp-includes/rest-api.php تعریف شده است. این تابع یک مسیر جدید در REST API ثبت می‌کند. نکته مهم این است که این تابع باید در هوک rest_api_init فراخوانی شود. اگر در هوک دیگری فراخوانی شود، endpoint به‌درستی ثبت نمی‌شود. این تابع برای هر مسیر، پارامتر permission_callback می‌پذیرد که به‌عنوان محافظ اصلی امنیتی عمل می‌کند. اگر این پارامتر تعریف نشود، وردپرس خطای _doing_it_wrong می‌دهد.

امضای تابع و پارامترها

امضای این تابع به‌شکل زیر است:
function register_rest_route( $route_namespace, $route, $args = array(), $override = false ) {
    // ...
}
پارامتر اول (route_namespace) فضای نامی است که مسیرها را گروه‌بندی می‌کند. نمونه رایج: myplugin/v1. پارامتر دوم (route) مسیر است که با اسلش شروع می‌شود. نمونه: /settings یا /items/(?P<id>d+). پارامتر سوم (args) آرایه‌ای از تنظیمات است. پارامتر چهارم (override) در صورت true، مسیر موجود را بازنویسی می‌کند. خروجی یک بولی است: true در صورت ثبت موفق.

هوک rest_api_init و زمان ثبت

این تابع باید در هوک rest_api_init فراخوانی شود:
add_action( 'rest_api_init', 'myplugin_register_routes' );
function myplugin_register_routes() {
    register_rest_route(
        'myplugin/v1',
        '/items',
        array(
            'methods'             => 'GET',
            'callback'            => 'myplugin_get_items',
            'permission_callback' => '__return_true',
        )
    );
}
نکته مهم: اگر endpoint باید در ویرایشگر بلوک یا در احراز هویت با nonce کار کند، ثبت در rest_api_init الزامی است.

namespace و مسیردهی

فضای نامی، مسیرهای شما را از مسیرهای سایر افزونه‌ها و هسته وردپرس جدا می‌کند. الگوی استاندارد: {plugin-slug}/v{version}. نمونه‌های صحیح: - myplugin/v1 - woocommerce/v3 - wp/v2 نمونه مسیرها: - /items: فهرست آیتم‌ها - /items/(?P<id>d+): یک آیتم خاص - /items/(?P<id>d+)/meta: متادیتای یک آیتم نکته مهم: از پارامترهای regex با (?P<name>pattern) استفاده کنید تا وردپرس بتواند آنها را استخراج کند.

آرگومان‌های args و اعتبارسنجی

آرایه args شامل تنظیمات زیر است: - methods: متد HTTP (GET، POST، PUT، DELETE) - callback: تابع پردازش درخواست - permission_callback: تابع بررسی دسترسی (اجباری) - args: تعریف پارامترهای ورودی با validate و sanitize نمونه تعریف پارامترها:
'args' => array(
    'id' => array(
        'required'          => true,
        'validate_callback' => function( $param ) {
            return is_numeric( $param ) && $param > 0;
        },
        'sanitize_callback' => 'absint',
    ),
    'title' => array(
        'required'          => true,
        'type'              => 'string',
        'sanitize_callback' => 'sanitize_text_field',
    ),
),
نکته مهم: هر پارامتر باید هم validate_callback (برای بررسی معتبر بودن) و هم sanitize_callback (برای پاک‌سازی) داشته باشد. راهنمای این توابع در صفحه esc_html آمده است.

permission_callback و کنترل دسترسی

پارامتر permission_callback حیاتی‌ترین بخش امنیتی یک endpoint است. این تابع بررسی می‌کند که آیا کاربر جاری مجاز به دسترسی به این endpoint است. الگوهای رایج: **دسترسی عمومی** (با احتیاط):
'permission_callback' => '__return_true',
**فقط کاربران وارد‌شده**:
'permission_callback' => function() {
    return is_user_logged_in();
},
**دسترسی مدیریتی**:
'permission_callback' => function() {
    return current_user_can( 'manage_options' );
},
**دسترسی با بررسی اضافی**:
'permission_callback' => function( $request ) {
    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_forbidden', 'ابتدا وارد شوید', array( 'status' => 401 ) );
    }

    if ( ! current_user_can( 'edit_posts' ) ) {
        return new WP_Error( 'rest_forbidden', 'دسترسی غیرمجاز', array( 'status' => 403 ) );
    }

    return true;
},
نکته مهم: همیشه کد وضعیت HTTP مناسب را در پاسخ برگردانید. راهنمای current_user_can در صفحه current_user_can و is_user_logged_in در صفحه is_user_logged_in آمده است.

کاربردهای عملی در افزونه

ساخت endpoint برای دریافت تنظیمات:
add_action( 'rest_api_init', 'myplugin_register_settings_route' );
function myplugin_register_settings_route() {
    register_rest_route(
        'myplugin/v1',
        '/settings',
        array(
            array(
                'methods'             => 'GET',
                'callback'            => 'myplugin_get_settings_route',
                'permission_callback' => function() {
                    return current_user_can( 'manage_options' );
                },
            ),
            array(
                'methods'             => 'POST',
                'callback'            => 'myplugin_update_settings_route',
                'permission_callback' => function() {
                    return current_user_can( 'manage_options' );
                },
                'args' => array(
                    'enabled' => array(
                        'required'          => true,
                        'type'              => 'boolean',
                        'sanitize_callback' => 'rest_sanitize_boolean',
                    ),
                    'threshold' => array(
                        'required'          => false,
                        'type'              => 'integer',
                        'validate_callback' => function( $param ) {
                            return is_numeric( $param ) && $param >= 0 && $param <= 100;
                        },
                        'sanitize_callback' => 'absint',
                    ),
                ),
            ),
        )
    );
}

function myplugin_get_settings_route() {
    return rest_ensure_response( array(
        'enabled'   => (bool) get_option( 'myplugin_enabled', true ),
        'threshold' => (int) get_option( 'myplugin_threshold', 50 ),
    ) );
}

function myplugin_update_settings_route( WP_REST_Request $request ) {
    update_option( 'myplugin_enabled', (bool) $request->get_param( 'enabled' ) );
    update_option( 'myplugin_threshold', (int) $request->get_param( 'threshold' ) );

    return rest_ensure_response( array( 'updated' => true ) );
}
راهنمای توابع استفاده‌شده در این بخش: wp_get_theme، get_option، update_option و current_user_can.

نکات امنیتی و اشتباهات رایج

اشتباه اول، نبود permission_callback است. وردپرس برای این مورد خطا می‌دهد اما در برخی نسخه‌های قدیمی، ممکن است نادیده گرفته شود. اشتباه دوم، نبود sanitize در args است. اگر پارامترهای ورودی پاک‌سازی نشوند، حفره XSS یا SQL Injection ایجاد می‌شود. اشتباه سوم، نبود validate در args است. اگر اعتبارسنجی انجام نشود، داده نامعتبر وارد سیستم می‌شود. اشتباه چهارم، استفاده از __return_true برای endpoint‌های حساس است. این الگو تنها برای endpoint‌های عمومی مانند فهرست پست‌های منتشرشده مناسب است. اشتباه پنجم، نبود بررسی WP_Error در callback است. باید خطاها به‌درستی برگردانده شوند. اشتباه ششم، نبود بررسی nonce در endpoint‌های تغییر داده است. برای احراز هویت، از X-WP-Nonce یا Application Passwords استفاده کنید. اشتباه هفتم، افشای اطلاعات حساس در پاسخ است. هر داده‌ای که در پاسخ REST API ارسال می‌شود، در ابزارهای توسعه‌دهنده قابل مشاهده است. اشتباه هشتم، نبود تست است. باید در سناریوهای کاربر مهمان، کاربر وارد‌شده، کاربر غیرمجاز و داده نامعتبر تست کنید.

تحلیل فنی پیشرفته

در نگاه مهندسی، تابع register_rest_route() یک نقطه معماری در لایه REST API است که بر چند لایه سیستم اثر می‌گذارد. لایه اول لایه Routing است. وردپرس مسیرها را در فایل rest-api.php و در آرایه $wp_rest_server->endpoints ثبت می‌کند. لایه دوم لایه Authorization است. پارامتر permission_callback به‌عنوان یک نقطه تصمیم امنیتی عمل می‌کند و امکان پیاده‌سازی هر الگوی دسترسی را فراهم می‌کند. لایه سوم لایه Input Validation است. پارامترهای validate و sanitize امکان اعتبارسنجی دقیق را فراهم می‌کنند. لایه چهارم لایه Schema است. با تعریف schema، امکان تولید خودکار مستندات OpenAPI فراهم می‌شود. لایه پنجم لایه Performance است. تعداد زیاد endpoint‌ها می‌تواند زمان bootstrap REST API را افزایش دهد. لایه ششم لایه Caching است. endpoint‌های GET می‌توانند با هدرهای Cache-Control مدیریت شوند. لایه هفتم لایه Multisite است. در شبکه‌های Multisite، endpoint‌ها در هر سایت مستقل کار می‌کنند. لایه هشتم لایه Testing است. تست‌های End-to-End باید همه سناریوها را پوشش دهند. مفاهیم پایه‌ای REST API در REST در ویکی‌پدیا توضیح داده شده است. برای مطالعه بیشتر روی توابع مرتبط، می‌توانید به راهنمای register_rest_field، راهنمای wp_verify_nonce، راهنمای current_user_can، راهنمای is_user_logged_in، راهنمای wp_send_json_success، راهنمای wp_send_json_error، راهنمای هوک wp_ajax و راهنمای هوک wp_ajax_nopriv مراجعه کنید.

پرسش‌های پرتکرار

در کدام هوک باید register_rest_route فراخوانی شود؟ در هوک rest_api_init. چطور از endpoint خود محافظت کنیم؟ با تعریف permission_callback مناسب. آیا می‌توان چند متد را در یک endpoint ثبت کرد؟ بله، با آرایه‌ای از تنظیمات. چطور داده را اعتبارسنجی کنیم؟ با validate_callback در args. چطور nonce را برای REST API بررسی کنیم؟ از هدر X-WP-Nonce یا Application Passwords استفاده کنید.

ادامه مسیر

تابع register_rest_route() ابزار اصلی وردپرس برای ساخت endpoint‌های سفارشی است. استفاده درست از آن یعنی تعریف permission_callback امن، اعتبارسنجی دقیق args، sanitize ورودی‌ها و تست در سناریوهای مختلف. اشتباه‌های کوچک در این تابع اغلب به افشای داده یا حفره‌های امنیتی منجر می‌شوند. اگر این تابع را در پروژه‌ای واقعی به کار برده‌اید و رفتار غیرمنتظره‌ای دیده‌اید — به‌خصوص در اتصال اپلیکیشن موبایل یا در Multisite — تجربه‌تان می‌تواند راهگشای دیگران باشد. کدام بخش بیشترین زمان را از شما گرفت؟ دیدگاه خود را بنویسید.