ایجاد کاستوم پیج تمپلیت از طریق افزونه هنگام فعال کردن آن
در ادامه بحث پیرامون تابع register_activation_hook به این مبحث می رسیم که چطور می توانیم با استفاده از افزونه، یک کاستوم پیج تمپلیت ایجاد نماییم.
کاستوم پیج تمپلیت (custom page template) یک برگه مشابه page یا پست تایپ خاص می باشد با این تفاوت که معمولا برای ایجاد صفحه ای با استایل و محتوای خاص به کار می رود.
فرض کنید شما می خواهید یک صفحه تماس با ما با پست تایپ page بسازید. طبعا با خود صفحه page.php اگر این کار را انجام دهید، دیزاین این صفحه مشابه صفحات دیگر با این پست تایپ می شود.
برای این کار یک cpt (مخخف کاستوم پیج تمپلیت) ساخته و طراحی جدیدی را برای آن در نظر می گیریم.
هدف ما در اینجا ساخت cpt از طریق افزونه است. اگر با ساختن آن از طریق تم آشنایی ندارید می توانید این مطلب را مطالعه نمایید.
ساختن cpt از طریق تم بسیار راحت است اما در افزونه اوضاع متفاوت است و یکی از چالش های اساسی توسعه دهندگان نیز می باشد.
در بعضی افزونه ها نیاز جدی به قالبی متفاوت با برگه های سایت داریم. گاهی اوقات می خواهیم قالب برگه ما هدر یا فوتر نداشته باشد، گاهی اوقات نیاز داریم برگه سفید باشد و فقط حاوی اطلاعات جدید ما باشد. در این مواقع مجبور به استفاده از cpt خواهیم بود و گریزی از آن نیست. اما در عین حال ما در حال توسعه یک افزونه هستیم و فرض بر اینست که هیچ دسترسی به تم نداریم پس باید با یک روش از طریق افزونه به آن دست یابیم …
برای انجام این کار روش هایی در نظر گرفته شده است که بعضی از آنها دشوار بوده و مناسب مطلب ما نمی باشد. ساده ترین راه برای این کار اینست که ابتدا با استفاده از تابع wp_insert_post یک برگه با title و slug و نام خاص ایجاد کنیم که همان cpt ما می باشد. از طرف دیگر یک برگه را در پوشه افزونه خودمان به وجود می آوریم و در نهایت آن را با اکشن template_include درون برگه ساخته شده اینکلود می نماییم.
مراحل کار به صورت دقیق:
1- ساخت برگه معمولی با عنوان post_title$ و نامک post_name$ با استفاده از تابع wp_insert_post
if( get_page_by_title($post_title) == null || get_page_by_title($post_title)->post_status == 'trash' ){ wp_insert_post( array( 'post_title' => $post_title, 'post_name' => $post_name, 'post_content' => $post_content, 'post_status' => $post_status, 'post_type' => $post_type )); }
2- برای اینکه نام فایل cpt را در قالب مشخص کنیم، خیلی راحت از متاپست wp_page_template_ استفاده می کنیم و آنرا برای برگه جدید ایجاد شده قرار می دهیم.
update_post_meta( $post_id, '_wp_page_template', $cpt_file_name );
کافیست به جای پارامتر آخر، نام فایل cpt در قالب را قرار دهیم.
پس اگر برگه ما با تابع wp_insert_post ساخته شد و آی دی را برگرداند، متای بالا رو برای آن ایجاد می کنیم تا نام فایل ست شود. اگر ساختن cpt از طریق قالب را بدانید، این متاپست همان مقداری است که در ابتدای cpt به متغیر template name داده می شود و برای ایجاد آن ضروری نیز هست.
if( get_page_by_title($post_title) == null || get_page_by_title($post_title)->post_status == 'trash' ){ $post_id = wp_insert_post( array( 'post_title' => $post_title, 'post_name' => $post_name, 'post_content' => $post_content, 'post_status' => $post_status, 'post_type' => $post_type )); if( $post_id ){ update_post_meta( $post_id, '_wp_page_template', $cpt_file_name ); } }
دقت شود که دستورات ساخت برگه باید در تابع register_activation_hook و با روش های گفته شده در مطالب قبل قرار داده شود.
3- اکنون یک برگه با نام دلخواه و در مکانی دلخواه در افزونه ایجاد می کنیم. این برگه همان چیزی است که قرار است تمام دستورات ما در cpt را در بر بگیرد. بهتر است این برگه ها در فولدر خاصی ایجاد شوند تا دسترسی به آن ها راحت تر باشد. فرض کنید در پوشه cpt و در روت افزونه ایجاد نماییم. نام فایل هم فرضا plugin_custom_page.php باشد.
4- و در آخرین مرحله باید این برگه ایجاد شده در افزونه را در cpt قالب اینکلود نماییم تا وقتی کاربر cpt را درخواست داد اطلاعات برگه ما در افزونه درون cpt برای او به نمایش درآید. چنانچه گفتیم این کار با استفاده از اکشن template_include انجام می شود.
در فایل روت افزونه داریم:
add_action( 'template_include', 'cpt_include_function' ); function cpt_include_function(){ if( is_page_template( $cpt_file_name ) ){ $template = dirname( __FILE__ ) . '/cpt/plugin_custom_page.php'; } return $template; }
بدین صورت اگر cpt ایجاد شده ما درخواست شود، با موفقیت لود شده و برگه ایجاد شده در افزونه با دستورات خاص ما در آن اینکلود می شود.
موفق باشید.