تابع get_template_directory_uri چطور کار میکند؟
تابع get_template_directory_uri برای دریافت URL پوشه قالب اصلی وردپرس؛ بررسی پارامترها، تفاوت با get_stylesheet_directory_uri و اشتباهات رایج.
چرا URL قالب اهمیت دارد؟
برای بارگذاری CSS، JavaScript، تصاویر و فونتهای قالب، باید آدرس URL عمومی فایلها مشخص باشد. برخلاف مسیر فیزیکی که برای include فایلهای PHP استفاده میشود، URL برای فایلهایی به کار میرود که از سمت مرورگر درخواست میشوند. اگر URL بهدرستی ساخته نشود، مرورگر فایل را پیدا نمیکند و خطای ۴۰۴ رخ میدهد. این خطا گاهی بهصورت ظاهری بدون پیام است و تنها با نبود استایل یا نبود اسکریپت آشکار میشود. تابعget_template_directory_uri() ابزار استاندارد برای دریافت این URL است.
تابع get_template_directory_uri چیست؟
تابعget_template_directory_uri() یک تابع هسته وردپرس است که در فایل wp-includes/theme.php تعریف شده است. این تابع URL پوشه قالب اصلی (Parent Theme) را برمیگرداند.
مقدار بازگشتی یک رشته است که به URL پوشه قالب اصلی اشاره میکند، بدون اسلش انتهایی. برای نمونه:
https://example.com/wp-content/themes/twentytwentyfour
نکته کلیدی این است که این تابع همیشه URL قالب اصلی را برمیگرداند، حتی اگر قالب فعال یک Child Theme باشد. برای دریافت URL قالب فعال، از get_stylesheet_directory_uri() استفاده کنید.
امضای تابع و پارامترها
امضای این تابع بهشکل زیر است:function get_template_directory_uri() {
$template = str_replace( '%2F', '/', rawurlencode( get_template() ) );
$theme_root = get_theme_root_uri( $template );
$template_dir = "$theme_root/$template";
return apply_filters( 'template_directory_uri', $template_dir, $template, $theme_root );
}
این تابع هیچ پارامتر ورودی نمیگیرد و تنها یک رشته برمیگرداند. یک فیلتر به نام template_directory_uri دارد که امکان تغییر URL را فراهم میکند.
نکته مهم این است که URL بازگشتی هیچ اسلش انتهایی ندارد. بنابراین هنگام ساخت URL فایل، باید از trailingslashit() یا ترکیب با اسلش استفاده کنید.
سازوکار داخلی تابع
تابعget_template_directory_uri() از سه تابع دیگر استفاده میکند:
- get_template() که نامک قالب اصلی را برمیگرداند
- get_theme_root_uri() که URL پوشه `themes` را برمیگرداند
- فیلتر template_directory_uri که امکان تغییر نهایی را فراهم میکند
نکته مهم این است که این تابع از rawurlencode استفاده میکند تا کاراکترهای خاص را برای URL امن کند. این رفتار در پروژههایی که نام قالب شامل کاراکترهای خاص است، اهمیت دارد.
تفاوت با get_stylesheet_directory_uri
این دو تابع پرتکرارترین اشتباه توسعهدهندگان Child Theme را میسازند: -get_template_directory_uri(): URL قالب اصلی (Parent Theme)
- get_stylesheet_directory_uri(): URL قالب فعال (که ممکن است Child Theme باشد)
در سایت بدون Child Theme، این دو تابع مقدار یکسانی برمیگردانند. اما وقتی Child Theme فعال است، تفاوت آشکار میشود.
قاعده ساده:
- برای لینک کردن فایلهای عمومی که همیشه در Parent Theme هستند، از get_template_directory_uri() استفاده کنید.
- برای لینک کردن فایلهایی که ممکن است در Child Theme سفارشی شوند، از get_stylesheet_directory_uri() استفاده کنید.
راهنمای تابع دیگر در صفحه get_stylesheet_directory_uri آمده است.
کاربردهای عملی در قالب
یکی از رایجترین کاربردها، بارگذاری فایل CSS قالب اصلی است:wp_enqueue_style(
'mytheme-main',
get_template_directory_uri() . '/assets/css/main.css',
array(),
'1.0.0'
);
نکته مهم: توجه داشته باشید که در این الگو، اسلش پیش از نام فایل بهصورت دستی اضافه شده است، چرا که تابع خودش اسلش انتهایی نمیگذارد.
کاربرد دیگر، لینک کردن تصویر لوگو یا تصاویر ثابت قالب است:
$logo_url = get_template_directory_uri() . '/assets/images/logo.svg';
echo '
';
نکته مهم: در این الگو، از esc_url() برای URL و از esc_attr__() برای متن ALT استفاده شده است تا از حملات XSS جلوگیری شود.
کاربرد سوم، درج فایلهای فونت است:
$font_url = get_template_directory_uri() . '/assets/fonts/iransans.woff2';
نقش esc_url در خروجی
همیشه URLهای تولیدشده توسط توابع وردپرس را باesc_url() عبور دهید. این تابع کاراکترهای خطرناک را حذف میکند و از حملات XSS جلوگیری میکند.
اگر URL را مستقیماً در HTML چاپ کنید، مهاجم میتواند از طریق فیلترها یا دادههای ذخیرهشده، کاراکترهای مخرب تزریق کند. برای مطالعه بیشتر درباره توابع escape، میتوانید به راهنمای esc_html مراجعه کنید.
الگوی صحیح:
echo '';
رفتار در Child Theme
وقتی Child Theme فعال است،get_template_directory_uri() همیشه URL Parent Theme را برمیگرداند. این رفتار در برخی سناریوها مطلوب است و در برخی مشکلساز.
الگوی حرفهای برای بارگذاری فایلی که ممکن است در Child Theme سفارشی شود:
$child_url = get_stylesheet_directory_uri() . '/assets/css/custom.css';
$parent_url = get_template_directory_uri() . '/assets/css/custom.css';
if ( file_exists( get_stylesheet_directory() . '/assets/css/custom.css' ) ) {
wp_enqueue_style( 'mytheme-custom', $child_url );
} else {
wp_enqueue_style( 'mytheme-custom', $parent_url );
}
این الگو اول Child Theme را بررسی میکند و اگر فایل سفارشی وجود نداشت، از Parent Theme استفاده میکند.
برای مطالعه درباره تفاوت مسیرها به راهنمای get_template_directory و راهنمای get_stylesheet_directory مراجعه کنید.
نکات امنیتی و اشتباهات رایج
اشتباه اول، استفاده در Child Theme برای فایلهای سفارشی است. اگر فایل شما در Child Theme است، استفاده ازget_template_directory_uri() به خطای ۴۰۴ منجر میشود.
اشتباه دوم، نبود esc_url است. هر URL که در HTML چاپ میشود باید با esc_url عبور کند.
اشتباه سوم، نبود اسلش پیش از نام فایل است. اگر مسیر را بدون اسلش با نام فایل ترکیب کنید، URL نادرست ساخته میشود. همیشه یا اسلش اضافه کنید یا از trailingslashit() استفاده کنید.
اشتباه چهارم، استفاده از این تابع برای include فایلهای PHP است. برای include از get_template_directory() استفاده کنید که مسیر فیزیکی برمیگرداند.
اشتباه پنجم، نبود بررسی file_exists است. اگر فایلی که لینک میکنید وجود نداشته باشد، خطای ۴۰۴ رخ میدهد و ممکن است ظاهر سایت خراب شود.
اشتباه ششم، نبود تست در Parent و Child Theme است. باید در هر دو حالت رفتار کد را بررسی کنید.
تحلیل فنی پیشرفته
در نگاه مهندسی، تابعget_template_directory_uri() یک نقطه معماری در لایه قالب است که بر چند جنبه از سیستم اثر میگذارد. لایه اول لایه URL است. این تابع بر پایه get_theme_root_uri کار میکند و URL را با در نظر گرفتن HTTPS، پروکسی معکوس و هاستهای توزیعشده محاسبه میکند.
لایه دوم لایه کشینگ است. نتیجه این تابع در حافظه کش میشود. اگر در طول درخواست قالب تغییر کند، مقدار کش باید باطل شود.
لایه سوم لایه امنیت است. URLهای تولیدشده ممکن است در خروجی HTML چاپ شوند و اگر بهدرستی escape نشوند، میتوانند به حمله XSS منجر شوند. همیشه از esc_url استفاده کنید.
لایه چهارم لایه CDN است. در پروژههایی که از CDN استفاده میکنند، URLهای قالب معمولاً به دامنه CDN اشاره میکنند. این تغییر توسط فیلتر template_directory_uri یا فیلترهای دیگر انجام میشود.
لایه پنجم لایه استقرار است. در محیطهای Staging و Production، دامنهها متفاوت هستند. اگر کد شما به URL مطلق وابسته باشد، ممکن است در محیط جدید کار نکند. استفاده از توابع وردپرس بر مسیرهای مطلق ارجحیت دارد.
لایه ششم لایه تست است. تستهای End-to-End باید هم در Parent Theme و هم در Child Theme اجرا شوند و مطمئن شوند که همه فایلها بهدرستی بارگذاری میشوند.
لایه هفتم لایه Performance است. درج تعداد زیاد فایلهای CSS و JS بهصورت جداگانه میتواند زمان بارگذاری را افزایش دهد. بهتر است فایلها را ادغام کنید یا از HTTP/2 استفاده کنید.
مفاهیم پایهای URL در URL در ویکیپدیا توضیح داده شده است.
برای مطالعه بیشتر روی توابع مرتبط، میتوانید به راهنمای wp_get_theme، راهنمای add_theme_support، راهنمای get_header، راهنمای get_footer، راهنمای get_template_part و راهنمای body_class مراجعه کنید.
پرسشهای پرتکرار
تفاوت get_template_directory_uri و get_stylesheet_directory_uri چیست؟ اولی URL قالب اصلی و دومی URL قالب فعال را برمیگرداند. آیا URL بازگشتی اسلش انتهایی دارد؟ خیر، URL بدون اسلش انتهایی برگردانده میشود. آیا میتوان از این تابع برای include فایل PHP استفاده کرد؟ خیر، برای include باید ازget_template_directory استفاده کنید که مسیر فیزیکی برمیگرداند.
آیا این تابع در Child Theme کار میکند؟ بله، اما همیشه URL Parent Theme را برمیگرداند.
چطور فایلی را از Child Theme بارگذاری کنیم؟ با get_stylesheet_directory_uri.
نتیجه و مسیر ادامه
تابعget_template_directory_uri() یک ابزار پایهای برای دریافت URL قالب اصلی در وردپرس است. استفاده درست از آن یعنی درک دقیق تفاوت با get_stylesheet_directory_uri()، توجه به اسلش انتهایی، escape با esc_url و تست در Parent و Child Theme. اشتباههای کوچک در این تابع اغلب به خطای ۴۰۴ یا نمایش نادرست فایل منجر میشوند.
اگر این تابع را در پروژهای واقعی به کار بردهاید و رفتار غیرمنتظرهای دیدهاید — بهخصوص در ترکیب با Child Theme یا CDN — تجربهتان میتواند راهگشای دیگران باشد. کدام بخش بیشترین زمان را از شما گرفت؟ دیدگاه خود را بنویسید.