ساختن برگه با محتوای خاص در وردپرس هنگام فعال کردن افزونه
در ادامه مبحث آشنایی با تابع register_activation_hook قصد داریم یکی از مطالب مهم دیگر در افزونه نویسی وردپرس را بررسی نماییم.
اگر افزونه ما با برگه های وردپرس، آدرس های مخصوص و شورتکد های آن کار کند (مانند برگه های سبد خرید و تصفیه حساب افزونه ووکامرس) باید تدبیری سنجیده شود تا این برگه ها و شورتکدهای درون آن، هنگام فعال شدن افزونه به صورت خودکار در وردپرس ایجاد شوند.
وگرنه جالب نیست که به کاربر بگوییم بعد از نصب افزونه و فعال کردن آن، باید این برگه ها با این نامها و این آدرس ها و این شورتکد ها را ایجاد کنید.
اگر دقت کرده باشید بعد از نصب ووکامرس و فعال سازی آن، و طی کانفیگ مرحله ای آن، یک بخش با عنوان ساختن برگه های ضروری وجود دارد که اگر شما آن مرحله را رد شده و نادیده بگیرید مجبور خواهید بود تک تک برگه ها با مشخصات لازمش را به صورت دستی ایجاد نمایید.
البته در تنظیمات ووکامرس به غیر از آن هم یک بخشی وجود دارد که می تواند برای ما آن برگه ها را به صورت اتوماتیک ایجاد نماید.
در وردپرس چنین امکانی فراهم شده است و با استفاده از متدهای خاص می توانیم اقدام به پیاده سازی آن نماییم.
در این مطلب فرض بر این است که افزونه ما با دو برگه با مشخصات زیر کار می کند و می خواهیم بعد از فعال سازی افزونه به صورت اتوماتیک در وردپرس ایجاد شوند.
+ برگه اول: با عنوان “سبد خرید افزونه”، نامک “nt_cart” و شورتکد “[nt_cart]”
+ برگه دوم: با عنوان “تصفیه حساب افزونه”، نامک “nt_checkout” و شورتکد “[nt_checkout]”
روش ساختن برگه هنگام فعال کردن افزونه
اصلی ترین تابع در وردپرس برای ساختن برگه ها با ویژگی های متفاوت، تابع wp_insert_post می باشد. این تابع پارامترهای متفاوتی درون خود می گیرد و زمانی که فراخوانی شود یک برگه در وردپرس ایجاد می کند و از قسمت برگه ها قابل مشاهده و ویرایش خواهد بود.
دقت شود که وجود کلمه post در انتهای آن ربطی به پست تایپ post ندارد و همه ی پست تایپ ها را می تواند شامل شود.
ضمنا این تابع علاوه بر اضافه کردن نوشته جدید، می تواند با داشتن آی دی یک نوشته، آن را به روزرسانی نیز بنماید.
ما در اینجا به مهم ترین پارامترهای این تابع می پردازیم وگرنه بحث پیرامون همه ی پارامترها باعث طولانی شدن این مطلب و خسته شدن شما خواننده گرامی می شود. لذا برای جزئیات بیشتر به کدکس وردپرس مراجعه نمایید.
wp_insert_post( array $postarr, bool $wp_error = false );
مطابق سینتکس این تابع، دو پارامتر اصلی برای آن در نظر گرفته شده است که پارامتر اول یک آرایه با مقادیر متعدد و پارامتر دوم یک مقدار منطقی است که مشخص می کند آیا در صورت ایجاد خطا و شکست در عملیات، ارور ایجاد شود یا خیر؟ که مقدار پیشفرض آن false یا خیر می باشد.
دقت شود که مقدار دوم اپشنال است و نیاز به وارد کردن آن نیست.
پارامتر اول یک آرایه است که با استفاده از مقادیر آن می توانیم برگه دلخواه خودمان را بعد از فعال سازی افزونه ایجاد نماییم. برای انجام این کار مهم ترین پارامترها عبارتند از :
- post_title
- post_name
- post_status
- post_content
- post_type
این مقادیر را در دستور زیر و در تابع خودش مشاهده نمایید:
wp_insert_post( array( 'post_title' => $post_title, 'post_name' => $post_name, 'post_content' => $post_content, 'post_status' => $post_status, 'post_type' => $post_type ));
در توضیح این چهار مقدار باید گفت که مقدار post_title مشخص کننده عنوان برگه ما، مقدار post_name مشخص کننده نامک برگه ما ( که اگر ست نشود همان مقدار post_title را می گیرد)، مقدار post_content مشخص کننده محتوای پست ما ( که مثلا شورتکد باید در این مقدار قرار گیرد )، مقدار post_type مشخص کننده وضعیت نوشته ما می باشد که باید مقدار publish را داشته باشد و در نهایت مقدار post_type مشخص کننده پست تایپ مورد نظر می باشد که در اینجا پست تایپ page مدنظر است.
اکنون می خواهیم آن دو برگه با مشخصات گفته شده در ابتدای مطلب را با این تابع بازنویسی کنیم:
wp_insert_post( array( 'post_title' => 'سبد خرید افزونه', 'post_name' => 'nt_cart', 'post_content' => '[nt_cart]', 'post_status' => 'publish' 'post_type' => 'page' )); wp_insert_post( array( 'post_title' => 'تصفیه حساب افزونه', 'post_name' => 'nt_checkout', 'post_content' => '[nt_checkout]', 'post_status' => 'publish' 'post_type' => 'page' ));
با یک بار اجرا کردن این دستور، برگه های ما ایجاد خواهد شد. دقت کنید اگر این برگه ها از قبل موجود باشد باز هم ایجاد خواهد شد.
پس اگر قرار باشد هنگام فعال کردن افزونه این برگه ها ایجاد شود، ممکن است کاربر به دلیل خاصی بیاید افزونه را غیرفعال نماید، و دوباره فعال کند. در اینصورت افزونه برگه های موجود را دوباره ایجاد می کند.
لذا یا باید با غیرفعال شدن افزونه برگه های موجود را حذف نماییم و یا اینکه قبل از ایجاد شدن این برگه ها تست کنیم اگر این برگه ها موجود هستند دیگر لازم نیست ایجاد شوند!
در اینجا ما می توانیم هم عنوان برگه ها را چک کنیم و هم نامک آن ها را. یعنی چک کنیم اگر برگه ای با فلان عنوان وجود دارد، برگه ما با آن عنوان ایجاد نشود و اگر برگه ای با فلان نامک وجود دارد، برگه ما با آن نامک ایجاد نشود.
در وردپرس دو تابع get_page_by_title و get_page_by_path برای این کار قابل استفاده است.
در تابع اول عنوان برگه را به آن می دهیم و چک می کند آیا برگه ای با آن عنوان وجود دارد یا خیر. اگر موجود نبود مقدار null و اگر بود شی WP_POST را بر می گرداند که حاوی مجموعه ای از اطلاعات در مورد آن برگهاست در تابع دوم نامک برگه را به آن می دهیم و چک می کند آیا برگه ای با آن عنوان وجود دارد یا خیر که مقدار برگشتی آن مشابه تابع اول است.
دستورات قبل را با تابع get_page_by_title به صورت زیر بازنویسی می کنیم:
if ( get_page_by_title('سبد خرید افزونه') == null || get_page_by_title('سبد خرید افزونه')->post_status == 'trash' ){ wp_insert_post( array( 'post_title' => 'سبد خرید افزونه', 'post_name' => 'nt_cart', 'post_content' => '[nt_cart]', 'post_status' => 'publish', 'post_type' => 'page' )); } if ( get_page_by_title('تصفیه حساب افزونه') == null || get_page_by_title('تصفیه حساب افزونه')->post_status == 'trash' ){ wp_insert_post( array( 'post_title' => 'تصفیه حساب افزونه', 'post_name' => 'nt_checkout', 'post_content' => '[nt_checkout]', 'post_status' => 'publish', 'post_type' => 'page' )); }
با شروطی که ما گذاشتیم تعیین کردیم که نه برگه وجود داشته باشد و نه در زباله دان باشد.
تابع دیگر که می توانیم استفاده نماییم تابع get_page_by_path است. به راحتی می توانیم نامک برگه خودمان را به آن بدهیم تا چک کنیم که برگه ای با این نامک وجود دارد یا خیر. دستورات فوق را با این تابع بازنویسی می کنیم:
if ( get_page_by_path('nt_cart') == null || get_page_by_path('nt_cart')->post_status == 'trash' ){ wp_insert_post( array( 'post_title' => 'سبد خرید افزونه', 'post_name' => 'nt_cart', 'post_content' => '[nt_cart]', 'post_status' => 'publish', 'post_type' => 'page' )); } if ( get_page_by_path('nt_checkout') == null || get_page_by_path('nt_checkout')->post_status == 'trash' ){ wp_insert_post( array( 'post_title' => 'تصفیه حساب افزونه', 'post_name' => 'nt_checkout', 'post_content' => '[nt_checkout]', 'post_status' => 'publish', 'post_type' => 'page' )); }
در نهایت کافیست یکی از این دستورات را در اکشن register_activation_hook قرار دهیم تا برگه های مورد نظر ما در هنگام فعال شدن افزونه به صورت خودکار به وجود آید.
class activation{ public static function activate(){ if ( get_page_by_path('nt_cart') == null || get_page_by_path('nt_cart')->post_status == 'trash' ){ wp_insert_post( array( 'post_title' => 'سبد خرید افزونه', 'post_name' => 'nt_cart', 'post_content' => '[nt_cart]', 'post_status' => 'publish', 'post_type' => 'page' )); } if ( get_page_by_path('nt_checkout') == null || get_page_by_path('nt_checkout')->post_status == 'trash' ){ wp_insert_post( array( 'post_title' => 'تصفیه حساب افزونه', 'post_name' => 'nt_checkout', 'post_content' => '[nt_checkout]', 'post_status' => 'publish', 'post_type' => 'page' )); } } public function __construct(){ $this->init_hook(); } private function init_hook(){ register_activation_hook( __FILE__ , array( $this, 'activate' ) ); } } new activation();
دقت شود که ما کد بالا را در فایل اصلی پلاگین قرار داده ایم لذا پارامتر اول آن __FILE__ خواهد بود.
خیلی ممنون بسیار کاربردی بود