تابع get_option یکی از پایه‌ای‌ترین توابع وردپرس برای خواندن تنظیمات ذخیره‌شده در جدول wp_options است. این تابع در خواندن تنظیمات افزونه، گزینه‌های قالب و پیکربندی سایت نقشی محوری دارد و پایه ساختار داده‌ای هر پروژه وردپرسی محسوب می‌شود. تشخیص درست میان مقدار پیش‌فرض و مقدار ذخیره‌شده، یکی از پرتکرارترین اشتباهات توسعه‌دهندگان است که به رفتار غیرمنتظره منجر می‌شود. اشتباهات رایجی مانند نبود default مناسب، نبود بررسی نوع داده، نبود escape و نبود تست می‌تواند امنیت و پایداری افزونه را تضعیف کند. تسلط بر این تابع برای افزونه‌نویسی حرفه‌ای ضروری است و در پروژه‌های سفارشی کاربرد گسترده دارد.

چرا خواندن درست تنظیمات اهمیت دارد؟

هر افزونه وردپرس برای انجام وظیفه خود نیازمند پیکربندی است: کلید API، آدرس سرویس خارجی، تنظیمات ظاهری، گزینه‌های فعال یا غیرفعال. این پیکربندی در جدول wp_options ذخیره می‌شود و تابع get_option نقطه ورود اصلی برای خواندن آن است. اگر تنظیمات به‌درستی خوانده نشوند، افزونه رفتار غیرمنتظره نشان می‌دهد. برای نمونه، اگر مقدار پیش‌فرض اشتباه باشد، افزونه ممکن است در نبود پیکربندی، سرویس اشتباهی را فراخوانی کند یا خطای PHP تولید کند. به همین دلیل، درک دقیق این تابع یکی از پیش‌نیازهای جدی برای هر توسعه‌دهنده افزونه محسوب می‌شود.

تابع get_option چیست؟

تابع get_option() یک تابع هسته وردپرس است که در فایل wp-includes/option.php تعریف شده است. این تابع مقدار یک گزینه مشخص را از جدول wp_options یا از حافظه کش (Object Cache) بازمی‌گرداند. اگر گزینه در پایگاه داده وجود داشته باشد، مقدار آن سریالایز شده بازگردانده می‌شود. اگر وجود نداشته باشد، مقدار پیش‌فرضی که در پارامتر دوم پاس داده شده برگردانده می‌شود. اگر هیچ مقدار پیش‌فرضی پاس داده نشود، مقدار false برگردانده می‌شود. نکته مهم این است که این تابع بخشی از WP Options API است که شامل سه تابع اصلی است: خواندن، ذخیره و حذف. توابع ذخیره و حذف در راهنمای update_option و راهنمای delete_option به تفصیل بررسی شده‌اند.

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

امضای این تابع به‌شکل زیر است:
function get_option( $option, $default = false ) {
    global $wpdb;

    if ( ! isset( $option ) ) {
        return false;
    }

    $option = trim( $option );
    if ( empty( $option ) ) {
        return false;
    }

    if ( ! wp_installing() ) {
        $alloptions = wp_load_alloptions();

        if ( isset( $alloptions[ $option ] ) ) {
            $value = $alloptions[ $option ];
        } else {
            $row = $wpdb->get_row( $wpdb->prepare(
                "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1",
                $option
            ) );

            if ( is_object( $row ) ) {
                $value = $row->option_value;
            }
        }
    }

    if ( ! isset( $value ) ) {
        return $default;
    }

    return apply_filters( "option_{$option}", maybe_unserialize( $value ), $option );
}
پارامتر اول (option) نام گزینه است که باید رشته‌ای یکتا باشد. برای جلوگیری از تداخل، استفاده از prefix اختصاصی توصیه می‌شود. پارامتر دوم (default) مقدار پیش‌فرضی است که در صورت نبود گزینه بازگردانده می‌شود. مقدار پیش‌فرض این پارامتر false است. خروجی می‌تواند هر نوع داده سریالایزپذیری باشد: رشته، عدد، آرایه، شیء یا مقدار پیش‌فرض.

سازوکار داخلی و Autoload

تابع get_option ابتدا بررسی می‌کند که آیا گزینه در فهرست Autoload قرار دارد. گزینه‌های Autoload در هر بار بارگذاری صفحه، به‌صورت یکجا از پایگاه داده خوانده و در حافظه کش می‌شوند. اگر گزینه در این فهرست باشد، نیازی به کوئری جداگانه نیست. اگر گزینه در فهرست Autoload نباشد، وردپرس یک کوئری جداگانه به جدول wp_options ارسال می‌کند. این کوئری از نظر کارایی، هزینه محسوسی دارد. پس از خواندن مقدار، تابع maybe_unserialize فراخوانی می‌شود تا اگر مقدار سریالایز شده بود، آن را به ساختار اصلی تبدیل کند. سپس فیلتر option_{$option} اعمال می‌شود و مقدار نهایی بازگردانده می‌شود.

نقش default در پایداری

انتخاب مقدار پیش‌فرض مناسب، یکی از اصول توسعه حرفه‌ای است. اگر گزینه‌ای وجود نداشته باشد و مقدار پیش‌فرض پاس داده نشود، تابع مقدار false برمی‌گرداند که ممکن است در کد شما به خطای منطقی منجر شود. نمونه اشتباه:
// اشتباه — اگر گزینه وجود نداشته باشد، false برمی‌گردد
$api_key = get_option( 'myplugin_api_key' );
$response = wp_remote_get( 'https://api.example.com/?key=' . $api_key );
نمونه صحیح:
// صحیح — مقدار پیش‌فرض مشخص است
$api_key = get_option( 'myplugin_api_key', '' );
if ( empty( $api_key ) ) {
    return new WP_Error( 'missing_api_key', 'کلید API تنظیم نشده است' );
}
نکته مهم: انتخاب مقدار پیش‌فرض باید بر پایه نوع داده انتظاری انجام شود. برای رشته، رشته خالی. برای آرایه، آرایه خالی. برای عدد، صفر.

نوع داده و سریالایز

وردپرس مقادیر گزینه‌ها را با maybe_serialize سریالایز می‌کند. این یعنی می‌توانید آرایه یا شیء را به‌عنوان مقدار ذخیره کنید و در خواندن، همان ساختار را دریافت کنید. نمونه ذخیره آرایه:
$settings = array(
    'enabled'   => true,
    'threshold' => 100,
    'channels'  => array( 'email', 'sms' ),
);
update_option( 'myplugin_settings', $settings );

// در خواندن
$settings = get_option( 'myplugin_settings', array() );
$threshold = isset( $settings['threshold'] ) ? absint( $settings['threshold'] ) : 100;
نکته مهم: هنگام خواندن آرایه، همیشه وجود کلید را با isset بررسی کنید. حتی اگر مقدار پیش‌فرض آرایه باشد، ممکن است ساختار آرایه ناقص باشد.

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

خواندن تنظیمات افزونه با مقادیر پیش‌فرض:
function myplugin_get_settings() {
    $defaults = array(
        'enabled'       => true,
        'api_key'       => '',
        'cache_duration' => 3600,
        'debug_mode'    => false,
    );

    $settings = get_option( 'myplugin_settings', array() );

    if ( ! is_array( $settings ) ) {
        return $defaults;
    }

    return wp_parse_args( $settings, $defaults );
}
تابع wp_parse_args مقادیر موجود را با پیش‌فرض‌ها ترکیب می‌کند و امکان استفاده ایمن از آرایه را فراهم می‌سازد. این الگو در افزونه‌های حرفه‌ای بسیار رایج است. خواندن گزینه‌ای که ممکن است مقدار false داشته باشد:
function myplugin_get_flag( $name, $default = false ) {
    $value = get_option( 'myplugin_flag_' . sanitize_key( $name ), null );

    if ( null === $value ) {
        return $default;
    }

    return (bool) $value;
}
نکته مهم: در این الگو، مقدار پیش‌فرض null انتخاب شده تا از مقدار false واقعی قابل تفکیک باشد. این رویکرد از تله مقدار false جلوگیری می‌کند. خواندن پیکربندی چندمحیطی:
function myplugin_get_environment() {
    $env = get_option( 'myplugin_environment', 'production' );

    if ( ! in_array( $env, array( 'development', 'staging', 'production' ), true ) ) {
        return 'production';
    }

    return $env;
}

Performance و Autoload

گزینه‌های Autoload در هر بار بارگذاری صفحه، به‌صورت یکجا خوانده می‌شوند. اگر تعداد این گزینه‌ها بسیار زیاد باشد، حجم حافظه مصرفی و زمان بارگذاری افزایش می‌یابد. به همین دلیل، افزونه‌های حرفه‌ای تنها گزینه‌های ضروری را با Autoload true ذخیره می‌کنند. تشخیص گزینه‌های Autoload پرمصرف:
function myplugin_list_autoloaded_options() {
    global $wpdb;

    $rows = $wpdb->get_results(
        "SELECT option_name, LENGTH(option_value) AS size
         FROM {$wpdb->options}
         WHERE autoload = 'yes'
         ORDER BY size DESC
         LIMIT 20",
        ARRAY_A
    );

    return is_array( $rows ) ? $rows : array();
}
نکته مهم: اگر گزینه‌ای بزرگ و کم‌استفاده دارید، با update_option و پارامتر Autoload false آن را به خارج از فهرست Autoload منتقل کنید. این کار حجم حافظه مصرفی را کاهش می‌دهد.

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

اشتباه اول، نبود مقدار پیش‌فرض است. اگر گزینه‌ای وجود نداشته باشد و مقدار پیش‌فرض پاس نشود، مقدار false برگردانده می‌شود که ممکن است در کد شما به خطا منجر شود. اشتباه دوم، نبود بررسی نوع داده است. اگر گزینه انتظار آرایه داشته باشد و مقدار برگردانده‌شده رشته باشد، خطای Fatal Error رخ می‌دهد. اشتباه سوم، نبود escape در خروجی است. اگر مقدار گزینه در HTML چاپ می‌شود، باید با توابع escape عبور کند. راهنمای این توابع در صفحه esc_html آمده است. اشتباه چهارم، ذخیره داده حساس در گزینه‌ها است. اگر گزینه‌ها Autoload باشند، در هر بار بارگذاری صفحه خوانده می‌شوند و ممکن است در خطاهای سرور ظاهر شوند. اشتباه پنجم، استفاده از نام‌های غیریکتا است. اگر دو افزونه از نام یکسان استفاده کنند، داده‌ها تداخل پیدا می‌کنند. اشتباه ششم، نبود توجه به کش است. تابع get_option از Object Cache استفاده می‌کند. اگر مقدار گزینه تغییر کند، اما کش پاک نشود، ممکن است مقدار قدیمی برگردانده شود. اشتباه هفتم، نبود تست است. باید سناریوهای وجود، نبود، نوع داده اشتباه و مقدار پیش‌فرض را بررسی کنید.

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

در نگاه مهندسی، تابع get_option() یک نقطه معماری در لایه Data Access است که بر چند جنبه از سیستم اثر می‌گذارد. لایه اول لایه Storage Abstraction است. این تابع لایه‌ای از انتزاع روی جدول wp_options ایجاد می‌کند و امکان خواندن یکپارچه را فراهم می‌سازد. لایه دوم لایه Autoload Management است. گزینه‌های Autoload در هر بار بارگذاری صفحه خوانده می‌شوند و بار مستقیمی روی حافظه و پایگاه داده دارند. انتخاب درست Autoload یکی از اصول بهینه‌سازی است. لایه سوم لایه Serialization است. وردپرس داده را با maybe_serialize ذخیره و با maybe_unserialize بازمی‌گرداند. اگر داده غیرسریالایزپذیر ذخیره شود، ممکن است در خواندن خطا رخ دهد. لایه چهارم لایه Caching است. تابع get_option از Object Cache استفاده می‌کند و در سایت‌های پربازدید، بازخوانی مکرر از پایگاه داده را کاهش می‌دهد. لایه پنجم لایه Filterability است. فیلتر option_{$option} امکان تغییر مقدار در زمان خواندن را فراهم می‌کند و در سناریوهای چندمحیطی بسیار مفید است. لایه ششم لایه Security است. داده ذخیره‌شده در گزینه‌ها باید sanitize شود. داده حساس نباید در گزینه‌های Autoload ذخیره شود. لایه هفتم لایه Multisite است. در شبکه‌های Multisite، گزینه‌ها در هر سایت مستقل ذخیره می‌شوند. توابع مخصوص شبکه مانند get_site_option برای گزینه‌های سطح شبکه استفاده می‌شوند. لایه هشتم لایه Testing است. تست‌های واحد باید همه سناریوها را پوشش دهند. مفاهیم پایه‌ای Key-Value Store در Key-value database در ویکی‌پدیا توضیح داده شده است. برای مطالعه بیشتر روی توابع مرتبط، می‌توانید به راهنمای update_option، راهنمای delete_option، راهنمای get_transient، راهنمای set_transient، راهنمای delete_transient، راهنمای current_user_can و راهنمای wp_send_json_success مراجعه کنید.

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

تفاوت get_option و get_transient چیست؟ اولی بدون انقضا و دومی با انقضای خودکار ذخیره می‌شود. اگر گزینه وجود نداشته باشد، چه مقداری برمی‌گردد؟ مقدار پیش‌فرض پاس داده‌شده یا false. آیا می‌توان آرایه ذخیره کرد؟ بله، وردپرس آرایه را سریالایز می‌کند. آیا گزینه‌ها در Multisite بین سایت‌ها مشترک هستند؟ خیر، هر سایت مستقل است. آیا این تابع از کش استفاده می‌کند؟ بله، در صورت فعال بودن Object Cache.

ادامه مسیر

تابع get_option() ابزار پایه وردپرس برای خواندن تنظیمات است. استفاده درست از آن یعنی انتخاب مقدار پیش‌فرض مناسب، بررسی نوع داده، escape در خروجی و توجه به Autoload. اشتباه‌های کوچک در این تابع اغلب به رفتار غیرمنتظره یا کاهش سرعت منجر می‌شوند. اگر این تابع را در پروژه‌ای واقعی به کار برده‌اید و رفتار غیرمنتظره‌ای دیده‌اید — به‌خصوص در ترکیب با Object Cache یا در Multisite — تجربه‌تان می‌تواند راهگشای دیگران باشد. کدام بخش بیشترین زمان را از شما گرفت؟ دیدگاه خود را بنویسید.