تابع wp_get_theme یکی از توابع کلیدی وردپرس برای دریافت اطلاعات کامل قالب فعال یا یک قالب مشخص است. این تابع یک شیء WP_Theme برمی‌گرداند که شامل نام، نسخه، نویسنده، مسیر و سایر اطلاعات قالب است. این اطلاعات در شرط‌گذاری بر اساس قالب، افزونه‌های چندقالبی و ابزارهای توسعه نقش کلیدی دارد. اشتباهات رایجی مانند نبود بررسی وجود قالب، نبود شرط مناسب و نبود تست می‌تواند به خطا یا رفتار غیرمنتظره منجر شود. در ادامه، ساختار داخلی، پارامترها، متدهای کلیدی و کاربردهای عملی این تابع بررسی می‌شود.

چرا شناخت قالب فعال اهمیت دارد؟

در پروژه‌های حرفه‌ای وردپرس، گاهی لازم است رفتار کد بر اساس قالب فعال تغییر کند. برای نمونه، یک افزونه ممکن است برای هر قالب، تنظیمات متفاوتی داشته باشد یا نیاز به override یک فایل خاص داشته باشد. همچنین ابزارهای توسعه، اسکریپت‌های استقرار و پنل‌های مدیریتی معمولاً نیاز دارند اطلاعات قالب فعال را در اختیار داشته باشند. تابع wp_get_theme() ابزار استاندارد وردپرس برای دریافت این اطلاعات است. این تابع نه‌تنها نام قالب را برمی‌گرداند، بلکه اطلاعاتی مانند نسخه، نویسنده، آدرس، تصویر شاخص و پشتیبانی‌های قالب را نیز در اختیار قرار می‌دهد.

تابع wp_get_theme چیست؟

تابع wp_get_theme() یک تابع هسته وردپرس است که در فایل wp-includes/theme.php تعریف شده است. این تابع یک شیء از کلاس WP_Theme برمی‌گرداند که اطلاعات قالب مشخص‌شده را در خود دارد. نکته مهم این است که این تابع تنها اطلاعات را نمی‌خواند، بلکه آنها را اعتبارسنجی و نرمال‌سازی می‌کند. همچنین نتایج را در حافظه کش می‌کند تا فراخوانی‌های مکرر، هزینه اضافی نداشته باشد. اگر پارامتر ورودی داده نشود، اطلاعات قالب فعال (Stylesheet) برگردانده می‌شود. اگر نامک قالب داده شود، اطلاعات همان قالب برگردانده می‌شود.

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

امضای این تابع به‌شکل زیر است:
function wp_get_theme( $stylesheet = '' ) {
    if ( empty( $stylesheet ) ) {
        $stylesheet = get_stylesheet();
    }

    $theme = new WP_Theme( $stylesheet );
    return $theme;
}
پارامتر ورودی می‌تواند از چند نوع باشد: - خالی: اطلاعات قالب فعال برگردانده می‌شود - رشته: نامک قالب (Stylesheet) — مثلاً twentytwentyfour - رشته با مسیر: مسیر نسبی پوشه قالب نسبت به پوشه `themes` - آرایه: آرایه‌ای با دو مقدار `stylesheet` و `template` برای مشخص کردن صریح خروجی همیشه یک شیء WP_Theme است، حتی اگر قالب وجود نداشته باشد. برای بررسی وجود قالب، باید از متد exists() استفاده کنید که در ادامه بررسی می‌شود.

سازوکار داخلی تابع

تابع wp_get_theme() در واقع یک لایه نازک روی کلاس WP_Theme است. این کلاس در فایل wp-includes/class-wp-theme.php تعریف شده و مسئولیت خواندن و اعتبارسنجی فایل style.css قالب را بر عهده دارد. نکته مهم این است که کلاس WP_Theme اطلاعات را در حافظه کش می‌کند. این کش در طول یک درخواست HTTP باقی می‌ماند و در درخواست بعدی از نو ساخته می‌شود. این رفتار در پروژه‌های پربازدید بسیار مفید است. اگر قالب وجود نداشته باشد، شیء WP_Theme بازگردانده می‌شود اما متد exists() مقدار false برمی‌گرداند. به همین دلیل، همیشه باید وجود قالب را بررسی کنید.

متدهای کلیدی WP_Theme

شیء WP_Theme متدهای متعددی دارد که مهم‌ترین آنها عبارت‌اند از: - exists(): بررسی وجود قالب - get( 'Name' ): دریافت نام قالب - get( 'Version' ): دریافت نسخه قالب - get( 'Author' ): دریافت نام نویسنده - get( 'Template' ): دریافت نامک قالب والد (در Child Theme) - get( 'TextDomain' ): دریافت text domain برای ترجمه - get_stylesheet(): نامک قالب فعال - get_template(): نامک قالب والد - get_stylesheet_directory(): مسیر فیزیکی قالب فعال - get_template_directory(): مسیر فیزیکی قالب والد - is_child_theme(): بررسی اینکه آیا قالب فعال Child Theme است - parent(): دریافت شیء WP_Theme قالب والد (در Child Theme) این متدها امکان دسترسی دقیق به اطلاعات قالب را فراهم می‌کنند و در پروژه‌های بزرگ بسیار کاربردی هستند.

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

یکی از رایج‌ترین کاربردها، دریافت نسخه قالب برای بارگذاری فایل‌های CSS و JS با Cache Busting است:
$theme = wp_get_theme();
$version = $theme->get( 'Version' );

wp_enqueue_style(
    'mytheme-style',
    get_stylesheet_uri(),
    array(),
    $version
);
نکته مهم: استفاده از نسخه قالب به‌عنوان مقدار Version در wp_enqueue_style باعث می‌شود مرورگر پس از به‌روزرسانی قالب، نسخه جدید را بارگذاری کند و کش قدیمی نماند. کاربرد دیگر، نمایش اطلاعات قالب در پنل مدیریت یا صفحه درباره قالب است:
$theme = wp_get_theme();
echo esc_html( $theme->get( 'Name' ) ) . ' ' . esc_html( $theme->get( 'Version' ) );
کاربرد سوم، بررسی وجود یک قالب خاص پیش از فعال‌سازی:
$theme = wp_get_theme( 'twentytwentyfour' );
if ( $theme->exists() ) {
    // قالب وجود دارد
}

شرط‌گذاری بر اساس قالب فعال

در پروژه‌های چندقالبی، ممکن است بخواهید کد را بر اساس قالب فعال شرطی کنید. این کار با wp_get_theme() به‌راحتی امکان‌پذیر است:
$theme = wp_get_theme();
$theme_name = $theme->get( 'Name' );

if ( 'Twenty Twenty-Four' === $theme_name ) {
    // کد فقط برای این قالب اجرا می‌شود
}
نکته مهم: مقایسه بر اساس نام نمایشی قالب (Name) ممکن است شکننده باشد، چرا که نام می‌تواند در نسخه‌های بعدی تغییر کند. برای پایداری بیشتر، از get_stylesheet() استفاده کنید که نامک قالب را برمی‌گرداند و پایدارتر است.
if ( 'twentytwentyfour' === get_stylesheet() ) {
    // کد فقط برای این قالب اجرا می‌شود
}
الگوی حرفه‌ای‌تر، استفاده از متد is_child_theme() برای تفکیک Parent و Child است:
$theme = wp_get_theme();
if ( $theme->is_child_theme() ) {
    $parent = $theme->parent();
    // دسترسی به اطلاعات قالب والد
}

کار با Child Theme و Parent Theme

تابع wp_get_theme() ابزار اصلی برای تفکیک Child Theme و Parent Theme است. سه متد کلیدی در این زمینه: - is_child_theme(): بررسی اینکه آیا قالب فعال Child Theme است - parent(): دریافت شیء WP_Theme قالب والد - get( 'Template' ): دریافت نامک قالب والد الگوی کامل:
$theme = wp_get_theme();

if ( $theme->is_child_theme() ) {
    $parent = $theme->parent();
    $parent_name = $parent->get( 'Name' );
    $parent_version = $parent->get( 'Version' );
    // استفاده از اطلاعات والد
}
این الگو در افزونه‌هایی که می‌خواهند بر اساس Parent Theme رفتار کنند، بسیار کاربردی است.

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

اشتباه اول، نبود بررسی exists() است. اگر قالب وجود نداشته باشد، شیء WP_Theme بازگردانده می‌شود اما متدهای آن ممکن است مقادیر خالی یا پیش‌فرض برگردانند. همیشه وجود قالب را بررسی کنید. اشتباه دوم، نبود شرط مناسب است. اگر کد خود را بر اساس نام قالب شرطی می‌کنید، باید همیشه نامک پایدار (Stylesheet) را معیار قرار دهید، نه نام نمایشی. اشتباه سوم، نبود escape در خروجی است. اگر اطلاعات قالب را در HTML چاپ می‌کنید، باید از esc_html() استفاده کنید. راهنمای این تابع در صفحه esc_html آمده است. اشتباه چهارم، وابستگی زیاد به نسخه قالب است. اگر کد شما به یک نسخه خاص از قالب وابسته باشد، پس از به‌روزرسانی قالب ممکن است کار نکند. اشتباه پنجم، نبود تست در حالت Parent Theme و Child Theme است. باید هم بدون Child Theme و هم با Child Theme فعال، رفتار کد را بررسی کنید. اشتباه ششم، نبود کش در فراخوانی‌های مکرر است. اگر در یک حلقه، wp_get_theme() را چند بار فراخوانی می‌کنید، بهتر است نتیجه را یک بار در متغیر ذخیره کنید.

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

در نگاه مهندسی، تابع wp_get_theme() یک نقطه معماری در لایه قالب است که بر چند جنبه از سیستم اثر می‌گذارد. لایه اول لایه Metadata است. کلاس WP_Theme اطلاعات را از فایل style.css می‌خواند و آنها را نرمال‌سازی می‌کند. این اطلاعات شامل نام، نسخه، نویسنده، آدرس، توضیحات، تگ‌ها و پشتیبانی‌هاست. لایه دوم لایه کشینگ است. نتیجه این تابع در wp_cache ذخیره می‌شود. این کش به‌صورت خودکار در طول یک درخواست باقی می‌ماند و در درخواست‌های بعدی مجدداً بارگیری می‌شود. برای باطل‌کردن این کش از wp_clean_themes_cache() استفاده کنید. لایه سوم لایه Override است. در Child Theme، کلاس WP_Theme امکان دسترسی به اطلاعات Parent را فراهم می‌کند. این امکان در الگوهای Override و در افزونه‌های سازگار با چند قالب بسیار کاربردی است. لایه چهارم لایه امنیت است. اطلاعات قالب ممکن است در URL یا خروجی HTML نمایان شود. این می‌تواند به افشای اطلاعات ساختار سرور منجر شود. در همه جا از escape استفاده کنید و در محیط‌های حساس، از فایل‌های header امن استفاده کنید. لایه پنجم لایه استقرار است. در محیط‌های Staging و Production، نسخه قالب ممکن است متفاوت باشد. اگر کد شما به نسخه خاصی وابسته است، ممکن است در محیط دیگر خطا رخ دهد. بنابراین استفاده از توابع پایدارتر مانند get_stylesheet() توصیه می‌شود. لایه ششم لایه Observability است. در پروژه‌های بزرگ، لاگ‌گیری از اطلاعات قالب فعال می‌تواند به عیب‌یابی کمک کند. ابزارهایی مانند Google Analytics اطلاعات مرورگر را نشان می‌دهند اما اطلاعات قالب را نه. بنابراین اگر افزونه شما با قالب‌های مختلف کار می‌کند، لاگ‌گیری از قالب فعال در محیط تولید می‌تواند به کشف الگوهای ناسازگاری کمک کند. لایه هفتم لایه Multisite است. در شبکه‌های Multisite، هر سایت می‌تواند قالب متفاوتی داشته باشد. تابع wp_get_theme() همیشه اطلاعات قالب سایت جاری را برمی‌گرداند و این رفتار در پروژه‌های شبکه‌ای باید در نظر گرفته شود. لایه هشتم لایه تست است. تست‌های End-to-End باید در قالب‌های مختلف اجرا شوند تا مطمئن شوید رفتار کد در همه حالت‌ها یکسان است. مفاهیم پایه‌ای قالب وردپرس در WordPress در ویکی‌پدیا توضیح داده شده است. در معماری Headless WordPress، این تابع معمولاً در سمت بک‌اند اجرا می‌شود و در فرانت‌اند کاربردی ندارد. با این حال، در APIهایی که اطلاعات قالب را برمی‌گردانند، شناخت این تابع ضروری است. برای مطالعه بیشتر درباره REST API، می‌توانید به راهنمای register_rest_route مراجعه کنید.

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

تفاوت wp_get_theme و get_template_directory چیست؟ wp_get_theme یک شیء کامل با اطلاعات قالب برمی‌گرداند، در حالی که get_template_directory تنها مسیر فیزیکی را برمی‌گرداند. آیا wp_get_theme در Multisite کار می‌کند؟ بله، اما همیشه اطلاعات قالب سایت جاری را برمی‌گرداند. آیا می‌توان اطلاعات قالب غیرفعال را دریافت کرد؟ بله، با پاس دادن نامک قالب به پارامتر. چطور بفهمیم قالب فعال Child Theme است؟ با متد is_child_theme(). چطور به اطلاعات قالب والد در Child Theme دسترسی پیدا کنیم؟ با متد parent() که شیء WP_Theme والد را برمی‌گرداند.

نتیجه و مسیر ادامه

تابع wp_get_theme() یک ابزار قدرتمند برای دریافت اطلاعات قالب فعال یا مشخص در وردپرس است. استفاده درست از آن یعنی درک دقیق متدهای کلیدی، بررسی وجود قالب، escape در خروجی و تست در Parent و Child Theme. این تابع در پروژه‌های چندقالبی، افزونه‌های سازگار و ابزارهای توسعه نقش محوری دارد. اگر این تابع را در پروژه‌ای واقعی به کار برده‌اید و رفتار غیرمنتظره‌ای دیده‌اید — به‌خصوص در ترکیب با Parent Theme‌های پیچیده یا در محیط‌های Multisite — تجربه‌تان می‌تواند راهگشای دیگران باشد. کدام بخش بیشترین زمان را از شما گرفت؟ دیدگاه خود را بنویسید.