سایتی را فرض کنید که مدتها خودتان فایلهای قالب را درست کردهاید: یک خط در header.php، تغییر کوچکی در footer.php، چند قاعدهی CSS. بعد پیام میآید که قالب نسخهی جدید دارد. روی «بهروزرسانی» میزنید و همهی تغییراتتان یکجا پاک میشود. وردپرس بهروزرسانی قالب را با جایگزینی کامل پوشهی آن انجام میدهد.
راهحل استاندارد این مشکل قالب فرزند است. در این مقاله میبینیم قالب فرزند دقیقاً چیست، کی لازم است و چطور در چند دقیقه ساخته میشود.
قالب فرزند چطور کار میکند؟#
قالب فرزند پوشهای کوچک است که به یک قالب دیگر، یعنی والد، اشاره میکند. وردپرس هر فایلی را اول در قالب فرزند جستوجو میکند و اگر پیدا نکرد، از والد میخواند. نتیجه:
- فایلی که در فرزند بگذارید جای فایل همنام در والد را میگیرد.
- فایلی که نگذارید از والد میآید.
- والد را میشود با خیال راحت بهروزرسانی کرد؛ پوشهی فرزند دستنخورده میماند.
کی به قالب فرزند نیاز دارید؟#
| کار | قالب فرزند لازم است؟ |
|---|---|
| تغییر رنگ و لوگو از تنظیمات قالب | خیر |
| چند خط CSS اضافه | معمولاً خیر؛ بخش CSS اضافه کافی است |
| ویرایش فایلهای PHP قالب | بله |
| افزودن تابع به functions.php | بله، یا بهتر: افزونه |
| تغییر ساختار صفحهی خاص | بله |
یک نکتهی مهم: هر کدی که به ظاهر سایت مربوط نیست، مثل ثبت نوع نوشتهی اختصاصی یا کد ردیابی، جایش در قالب نیست. اگر قالب را عوض کنید همهی آنها از کار میافتند. چنین کدی را در افزونه بگذارید؛ نگاه کنید به ساخت افزونهی وردپرس از صفر.
ساخت قالب فرزند، قدمبهقدم#
فرض کنید قالب والد پوشهای به نام my-parent دارد. نام پوشهی والد را دقیق، با همان حروف، از wp-content/themes ببینید.
- در
wp-content/themesپوشهی جدیدی بسازید، مثلاًmy-parent-child. - داخلش فایل
style.cssرا با سربرگ زیر بسازید. - فایل
functions.phpرا برای بارگذاری استایل بسازید. - از نمایش ← پوستهها قالب فرزند را فعال کنید.
فایل style.css#
/*
Theme Name: My Parent Child
Template: my-parent
Version: 1.0.0
Description: قالب فرزند برای سفارشیسازی
Text Domain: my-parent-child
*/
/* از اینجا به بعد CSS اختصاصی شما */مهمترین خط Template است. مقدار آن باید دقیقاً نام پوشهی قالب والد باشد، نه نام نمایشیاش. اگر اشتباه بنویسید، وردپرس میگوید قالب والد پیدا نشد.
فایل functions.php#
در قالبهای کلاسیک، استایل والد خودکار بارگذاری نمیشود و باید آن را صدا بزنید. روش درست، wp_enqueue_style است، نه @import در CSS که کند است و دیگر توصیه نمیشود:
<?php
add_action( 'wp_enqueue_scripts', 'mpc_enqueue_styles' );
function mpc_enqueue_styles() {
$parent_version = wp_get_theme( get_template() )->get( 'Version' );
$child_version = wp_get_theme()->get( 'Version' );
wp_enqueue_style(
'my-parent-style',
get_template_directory_uri() . '/style.css',
array(),
$parent_version
);
wp_enqueue_style(
'my-parent-child-style',
get_stylesheet_uri(),
array( 'my-parent-style' ),
$child_version
);
}دو تابع را به یاد بسپارید: get_template_directory_uri() همیشه به والد اشاره میکند و get_stylesheet_directory_uri() به قالب فعال، یعنی فرزند. گرفتن نسخه بهعنوان پارامتر آخر باعث میشود با تغییر نسخه، کش مرورگر هم تازه شود.
اگر قالب والد استایل خود را با روشی غیراستاندارد یا از فایل دیگری میافزاید، کد بالا ممکن است لازم نباشد یا کافی نباشد. مستندات همان قالب را ببینید.
فایلهای والد را چطور بازنویسی کنیم؟#
فایلی از والد را که میخواهید تغییر دهید، با همان نام و همان مسیر درون قالب فرزند کپی کنید و آنجا ویرایش کنید. مثلاً footer.php یا template-parts/content.php. از این لحظه وردپرس نسخهی فرزند را میخواند.
در functions.php برخلاف بقیهی فایلها، فایل فرزند جای والد را نمیگیرد. هر دو بارگذاری میشوند، ابتدا فرزند و بعد والد. پس کد فرزند را فقط اضافه کنید و کل فایل والد را کپی نکنید؛ در غیر این صورت تابعها تکراری میشوند و سایت خطای مرگبار میدهد.
اگر والد تابعی دارد که با if ( ! function_exists(...) ) تعریف شده، این یعنی نویسندهی قالب اجازهی بازنویسی آن را در فرزند داده است. اگر آنطور نیست، بهجای کپیکردن بهتر است از قلابها (اکشن و فیلتر) که قالب فراهم کرده استفاده کنید.
قالب فرزند در قالبهای بلوکی#
در قالبهای بلوکی هم فرزند وجود دارد و سادهتر است: فقط style.css با همان سربرگ لازم است و در بیشتر موارد برای بارگذاری استایل والد به functions.php نیاز نیست. تنظیمات رنگ و تایپوگرافی را با فایل theme.json فرزند بازنویسی میکنید. اگر روی قالب بلوکی کار میکنید، قالبهای بلوکی و ویرایشگر کامل سایت را هم بخوانید. تغییراتی که از ویرایشگر سایت ذخیره میکنید هم جدا در پایگاهداده میماند و با بهروزرسانی قالب از بین نمیرود.
اشتباههای رایج#
- نام اشتباه در Template: باید نام پوشهی والد باشد.
- نبودن استایل والد: ظاهر سایت بدون طراحی دیده میشود.
- کپیکردن کل functions.php: خطای تعریف دوبارهی تابع.
- ویرایش مستقیم والد «فقط یک بار»: با اولین بهروزرسانی از بین میرود.
- انتظار از فرزند برای والدِ بد: اگر قالب والد کند یا ناامن است، فرزند چیزی را درست نمیکند؛ انتخاب قالب وردپرس را ببینید.
نکتهی نگهداری#
قالب فرزند هم نیاز به نگهداری دارد. بعد از هر بهروزرسانی مهم والد، فایلهایی را که بازنویسی کردهاید با نسخهی جدید والد مقایسه کنید؛ ممکن است والد ساختار آن فایل را عوض کرده باشد. به همین دلیل بازنویسی را به حداقل برسانید: هرچه کمتر فایل کپی کنید، نگهداری سادهتر است.
خلاصه#
- ویرایش مستقیم قالب فعلی با بهروزرسانی از بین میرود؛ قالب فرزند راه امن است.
- قالب فرزند حداقل
style.cssبا خطTemplateدرست دارد. - استایل والد را در قالبهای کلاسیک با
wp_enqueue_styleبارگذاری کنید، نه@import. - فایلهای والد را با کپی همنام در فرزند بازنویسی کنید؛
functions.phpاستثناست. - کد غیرمرتبط با ظاهر را در افزونه بگذارید.
- بازنویسیها را کم نگه دارید و بعد از بهروزرسانی والد مقایسه کنید.