در بسیاری موارد ممکن است که مدیر سایت بخواهد مطالب خاصی را به نحوی که نظر مخاطب را جلب کند در معرض دید قرار دهد. به عنوان مثال در مورد اطلاعیه ها یا معرفی محصولات ویژه و نظایر آن و متاسفانه با ساختار وردپرس که مطالب را با توالی زمانی نمایش می دهد این مهم امکان پذیر نیست. برای انجام چنین خواسته ای می توان از افزونه های خاص این کاربرد استفاده کرد که البته سریع ترین راهکار ممکن است. اما متاسفانه این راهکار سریع معمولا بهترین گزینه ی ممکن نیست و مهم ترین اشکال استفاده از افزونه های آماده هم این است که تقریبا خواسته ی کاربر را برآورده می کنند ولی دقیقا همه ی نیازهای او را به نحو احسن پوشش نمی دهند. راه حل پیشنهادی این مقاله اضافه کردن کدهای خاص به فایل functions.php پوسته ی وردپرس است که هدف مورد نظر را برآورده می کند و به علاوه به دلیل شفاف و در درسترس بودن کد برنامه به راحتی مختلف قابل سفارشی سازی می باشد تا دقیقا مطابق نیاز مدیر سایت باشد.
در ادامه مرحله ی اول کار به صورت قدم به قدم تشریح شده و کد مربوط به هر قسمت کاملا توضیح داده می شود. همچنین توابع وردپرس که در هر قسمت مورد استفاده قرار گرفته است معرفی خواهند شد.
هدف این بخش اضافه کردن قسمتی به صفحه ی ویرایش نوشته ها در وردپرس است. به این ترتیب نگارنده می تواند در زمان نگارش نوشته یا بعدا در حین ویرایش مطلب را به عنوان مطلب برگزیده انتخاب کند.
تابع add_meta_box
اولین تابعی که بناست از آن استفاده کنیم تابع add_meta_box است که در ادمه به توضیح آن خواهیم پرداخت. این تابع باید به همراه اکشن add_meta_boxes فراخوانی شود. البته برای همخوانی با نسخه های قدیمی وردپرس از اکشن admin_init هم می توان استفاده کرد.
کار این تابع ایجاد یک کادر ویژه در قسمت ویرایش نوشته هاست و پارامترهای آن به ترتیب عبارتند از:
id: یک رشته است و در واقع نام منحصر به فرد کادری است که قرار است ایجاد کنیم. نکته ی مهم در مورد این پارامتر این است که باید سعی کنیم به گونه ای آن را انتخاب کنیم تا با نام سایر کادرهای تداخل نداشته باشد.
title: عنوان کادر است و در قسمت ویرایش نوشته نمایش داده می شود.
callback: نام تابعی است که باید تعریف شود تا موارد داخل این کادر را نمایش دهد. اگر این تابع یک تابع خالی باشد کادر نمایش داده شده هم یک کادر خالی خواهد بود.
post type: مشخص می کند که کادر مورد نظر در قسمت ویرایش کدام مطالب باید ظاهر شود و گزینه های قابل قبول برای آن به قرار زیر هستند.
- 'post': نمایش در قسمت ویرایش نوشته ها
- 'page': نمایش در قسمت ویرایش برگه ها
- 'link': نمایش در قسمت ویرایش پیوندها
- 'custom_post_type: نمایش در قسمت ویرایش مطالب سفارشی
استفاده از مورد آخر در حالتی است که قبلا در سیستم نوع یا انواع سفارشی مطالب تعریف شده باشند.
context: محل نمایش کادر را تعیین می کند و گزینه های آن عبارتند از 'normal'، 'advanced' و 'side'.
priority: اولویت نمایش کادر را نسبت به سایر کادرهای موجود در صفحه انتخاب می کند و گزینه های آن به صورت زیرند:
- high
- core
- default
- low
callback_args: پارامترهایی هستند که در صورت لزوم برای تابع callback ارسال می کنیم تا در نمایش موارد داخل کادر مورد استفاده قرار گیرد. این گزینه می تواند به صورت آرایه نیز باشد.
مثال زیر نحوه ی استفاده از این تابع را نشان می دهد.
در مثال بالا با استفاده از تابع add_meta_box یک کادر جدید در محیط ویرایش «نوشته ها» ایجاد می کنیم. عنوان این کادر 'Featured Posts' بوده و در قمست بالای نوار کناری صفحه نمایش داده می شود. تابع callback مورد استفاده تابع show_featured_post_meta_box است که در ادامه در مورد آن نیز بحث خواهد شد.
خط ۵ تا ۷ کد به استفاده از تابع add_meta_box اختصلص یافته است. لازم است توجه شود که این تابع درون تابع add_featured_post_meta_box فراخوانی شده است که به نوبه ی خود به همراه اکشن add_meta_boxes اجرا خواهد شد.
قسمتی که ما در صفحه ی ویرایش نوشته ها ایجاد کرده ایم بناست مقدار meta به خصوصی را خوانده و آن را نمایش دهد. همچنین در صورتی که کاربر این مقدار را تغییر دهد کد ما باید قادر به ذخیره کردن آن در پایگاه داده ی وردپرس باشد. قسمت اول این منظور با استفاده از تابع get_post_meta محقق خواهد شد و قسمت دوم نیز در ادامه ی همین قسمت بررسی خواهد شد.
تابع get_post_meta
تابع get_post_meta دارای سه پارامتر ورودی است که عبارتند از:
- post_id: که ID پستی که قصد داریم مقدار meta به خصوصی از آن را بخوانیم.
- key: متغیر رشته ای است که نام meta مورد نظر ما را به تابع می دهد.
- 'single': مشخص می کند که آیا meta خاصی مد نظر ماست یا می خواهیم همه ی metaهای مربوط به یک پست را در یک آرایه داشته باشیم.
اگر برای فراخوانی تابع تنها از پارامتر id استفاده کنیم تابع کلیه ی metaهای مربوط به پست مورد نظر را در قالب یک آرایه ی در اختیارمان خواهد گذاشت. اگر پارامتر key را هم مشخص کنیم و مقدار آرگومان single را نیز برابر true قرار دهیم آنگاه تابع مقدار metaای که مد نظر ماست را به تنهایی بر خواهد گرداند.
تابع wp_create_nonce
این تابع برای ایجاد nonce در وردپرس استفاده می شود. برای مطالعه ی بیشتر در مورد nonce می توانید به خط خطی امنیت وردپرس با nonce مراجعه کنید. هدف از استفاده از این تابع در این جا ایجاد یک nonce است که بناست امنیت برنامه را در هنگام ذخیره سازی اطلاعات تامین کند.
در ادامه کاربرد دو تابعی که اخیرا معرفی شدند را خواهیم دید.
ID, 'is_featured', true);
echo '';
$featured_post_nonce = wp_create_nonce('featured_post_nonce');
echo '';
echo ' is featured?';
echo '';
}
?>
در کد بالا بین خطوط ۱۳ تا ۲۵ تابعی را تعریف می کنیم که بناست محتوای کادری را که با تابع add_meta_box ایجاد کردیم نمایش دهیم. در واقع این تابع همان تابع callback مورد اشاره در فراخوانی تابع add_meta_box در خطوط ۵ تا ۷ کد است.
تعریف متغیر post به عنوان متغیر عمومی در خط ۱۵ الزامی است و به وسیله ی آن به شیء post وردپرس دسترسی خواهیم یافت و هدف از این کار خواندن مقدار ID مربوطه است که در ذخیره و بازیابی meta مورد نظر ما استفاده خواهد شد.
در خط ۱۶ با استفاده از تابع get_post_meta بررسی می کنیم که آیا مقدار is_featured برای پست جاری وجود دارد یا نه و نتیجه را در متغیر meta ذخیره می کنیم تا بعدا از آن استفاده کنیم. خط ۱۸ کد هم شامل تابع wp_create_nonce است که یک nonce با کلید 'featured_post_nonce' ایجاد کرده و در یک متغیر رشته ای ذخیره می کند. و اما در مورد خطوط ۱۷ و ۲۴ لازم است اشاره شود که این خظوط نقش حیاتی در کد ایفا نمی کنند و فقط برای ایجاد یک div با جهت نگارش چپ به راست استفاده می شوند که هدف استفاده ی آن نمایش درست محتویات انگلیسی کادر است. خط ۱۹ و ۲۰ یک فیلد مخفی می سازند که حاوی مقدار nonce ایجاد شده در خط ۱۸ می باشد و خطوط ۲۱تا ۲۳ هم یک چک باکس ایجاد می کنند که هم مقدار metaی is_featured را نمایش می دهد و هم در صورت نیاز به کاربر اجازه ی تغییر آن را می دهد. عبارت داخل پرانتز هم یک عبارت شرطی است که در صورت true بودن مقدار متغیر meta چک باکس ما را به صورت تیک خورده در خواهد آورد.
بدیهی است موارد فوق تنها به عنوان مثال بوده و در صورت لزوم برنامه نویس می تواند هر عنصر دیگری را (عمدتا عناصر فرم نظیر textboxها یا لیست های کشویی) درون کادر خود داشته باشد. تنها قسمتی که باید حتما در کادر ما استفاده شود همان فیلد مخفی nonce است که به لحاظ امنیتی کاربرد آن ضروری است.
حالا کدی داریم که یک کادر مطابق تصویر روبرو در بالای نوار کناری محیط ویرایش پست ها برایمان ایجاد کرده است. برای نکمیل کار لازم است کدی بنویسیم که اطلاعات این کادر را در هنگام به روز رسانی ذخیره کند. مراحل ذخیره سازی نیاز به استفاده از چند تابع وردپرس دارد که در ادامه به ترتیب معرفی خواهند شد.
تابع wp_verify_nonce
همانگونه که از نام تابع نیز مشخص است این تابع برای بررسی و تصدیق nonce ارسالی به کار می رود.
این تابع دارای دو پارامتر ورودی است. nonce در واقع پارامتری است که توسط سیستم دریافت شده و باید صحت آن بررسی شود و action رشته ای است که نام nonce مرجعی را که بناست nonce دریافتی با آن مقایسه شود برای تابع مشخص می کند.
تابع current_user_can
این تابع برای بررسی صلاحیت های کاربر جاری مورد استفاده قرار می گیرد.
این تابع تنها دارای یک آرگومان است که در واقع همان عملیات مورد بررسی است. اگر کاربر جاری اجازه انجام عملیات مورد نظر را داشته باشد مقدار خروجی true منطقی و در غیر اینصورت false منطقی خواهد بود.
تابع update_post_meta
از این تابع برای ایجاد و یا به روزرسانی یک مقدار meta استفاده می شود.
تابع فوق با چهار پارامتر فراخوانی می شود که عبارتند از:
- post_id: این آرگومان ID نوشته ای را که بناست مقدار meta مربوط به آن ثبت یا به روزرسانی شود را تعیین می کند.
- meta_key: رشته ای است که نام meta مورد نطر را تعیین می کند.
- meta_value: مقداری است که قرار است به meta مورد نظر ما تخصیص داده شود.
- old_value: مقدار قبلی meta مورد نظر را برای تابع مشخص می کند. معمولا از این گزینه در مواقعی که چند meta هم نام با مقادیر مختلف داریم و قصد داریم تنها یکی از آن ها را تغییر دهیم استفاده می کنیم.
تابع delete_post_meta
همانگونه که از نام این تابع هم پیداست از آن برای پاک کردن مقادیر meta استفاده می شود و دارای ۳آرگومان است که به شرح زیر می باشند.
- post_id: این آرگومان ID نوشته ای را که بناست مقدار meta مربوط به آن پاک شود را تعیین می کند.
- meta_key: رشته ای است که نام meta مورد نطر را تعیین می کند.
- meta_value: مقدار meta مورد نظر را برای تابع مشخص می کند. معمولا از این گزینه در مواقعی که چند meta هم نام با مقادیر مختلف داریم و قصد داریم تنها یکی از آن ها پاک شود استفاده می کنیم.
حالا با استفاده از توابعی که در بالا معرفی شدند تابعی ایجاد می کنیم که محتویات فرم ما را در هنگام ذخیره شدن پست ذخیره کند.
خطوط ۳۱ تا ۳۶ کد بالا Nonce ارسال شده را کنترل می کنند و در صورت صحت آن اجازه ی ادامه ی عملیات داده می شود. خطوط ۳۸ تا ۴۲ نیز جهت تشخیص عملیات ذخیره سازی خودکار به کار می روند. طبیعی است که در زمان عملیات ذخیره سازی خودکار نیازی به ذخیره کردن meta نداریم و بهتر است در این موارد تابع از ادامه ی کار خود باز ایستد. کد بین خطوط ۴۴ و ۴۸ هم با استفاده از تابع current_user_can صلاحیت کاربر را برای ذخیره سازی پست جاری بررسی می کند و اگر کاربر این صلاحیت را نداشته باشد کار تابع اصلی را متوقف خواهد کرد.
خطوط ۵۰ تا ۶۰ تابع save_featured_meta_box مقدار meta مورد نظر را در صورت وجود از پایگاه داده ی وردپرس استخراج کرده و در متغیر old ذخیره می کند و همچنین مقدار متناظر با همین meta را که از طریق محیط ویرایش ارسال شده است را در new قرار داده و سپس مقادیر old و new را با هم مقایسه می نماید. در صورتی که مقدار new برابر true منطقی باشد و old با آن برابری نکند یعنی کاربر قصد دارد یک پست «عادی» را به صورت «برگزیده» در آورد و لازم است meta مورد نظر ایجاد شود. همچنین اگر مقداری به new تخصیص داده نشده یاشد ولی مقدار old موجود و برابر true منطقی باشد یعنی کاربر قصد دارد یک پست «برگزیده» را به حالت «عادی» برگرداند و در نتیجه مقدار meta باید از پایگاه داده پاک شود.
خط ۶۲ تابع save_featured_meta_box را به اکشن save_post اضافه می کند تا تابع ما در هنگام ذخیره سازی پست اجرا شود و بدون نوشتن این خط کد ما اجرا نخواهد شد.
حالا باید کادری مشابه در قسمت «ویرایش سریع» هم درست کنیم. و در نهایت هم باید کد مربوط به نمایش مطالب برگزیده در وب سایت را بنویسیم. این موارد به ترتیب در قسمت های بعدی همین مطلب آورده خواهند شد.
سلام دستت شما درد نکنه
فکر کنم کدتون تو قسمت
// Callback function to show fields in meta box
ایراد داره من این کد رو قرار دادم باکس درست شد اما چک باکس درست نشد.
لطفا راهنمایی کنید
آقا این نمایش گر کد هاتون مشکل داره
اگه دقت کنید خط ۱۰و۱۲ اومده تو کد ها بعدش شما میگید خط ۶۰در صورتی که ۳۰خط بیشتر نیست
بله دوست من در هر دو مورد حق با شماست. یه مقدار اشکال فنی وجود داره که حل میشه. ممنون که اطلاع دادید.
خواهش می کنم
وظیفه است.
این مطلب خیلی به من کمک کرد