افزونه پارسی دیت

چگونه با افزونه پارسی دیت ، استارت آپ های وردپرس فارسی را توسعه دهیم ؟

اگر در حال برنامه نویسی یک استارت اپ فارسی با وردپرس باشید ، یکی از نیاز های شما مسلما بحث کار با تاریخ شمسی در وردپرس هست.در بین افزونه های موجود در زمینه فارسی سازی وردپرس دو افزونه wp-jalali (افزونه جلالی) و افزونه پارسی دیت (wp-parsidate) محبوبیت زیادی نزد کاربران دارد.

در پروژه ای که برای پرتال یکی از دانشگاه های کشور مبتنی بر هسته وردپرس ایجاد کردم با کمی تحقیق افزونه ی پارسی دیت را برای این کار انتخاب کردم . در این مقاله شما را با توابع و آموزش کار با تاریخ شمسی توسط افزونه wp-parsidate در وردپرس آشنا خواهم کرد.

سرفصل های محتوا

    چه انتظاری باید از یک افزونه فارسی ساز وردپرس داشت ؟

    بطور کلی دو انتظار میتوان از یک افزونه فارسی ساز وردپرس داشت :

    1. ابتدا فارسی سازی تمامی توابع محلی یا Native در وردپرس ، توسط فیلتر ها و اکشن هایی که وردپرس در اختیار توسعه دهندگان قرار داده.به عنوان مثال زمانی که شما افزونه را نصب می کنید تابع get_the_time به طور کامل تاریخ را بصورت شمسی برایمان نشان می دهد.این نیاز اصولا برای وبمستران وردپرس بیشتر مطرح هست.
    2. قاعدتا زمانی که شما یک پروژه ای بزرگ را با وردپرس استارت می زنید، حتما جدول هایی جدا از جدول های پیش فرض وردپرس در بانک اطلاعاتی دارید.
      سوال اینجاست با چه ابزاری میتوان تاریخ هایی که در جداول شخصی خودمان ایجاد کردیم فارسی شود ؟ این همان نیاز دوم هست یعنی افزونه باید مستنداتی را در اختیار توسعه دهنده وردپرس قرار دهد تا بتوان وردپرس فارسی را توسعه داد.

    چرا می بایست افزونه پارسی دیت را بر افزونه جلالی ترجیح دهیم ؟

    با بررسی افزونه جلالی و پارسی دیت نهایت به دلایل زیر استفاده از افزونه wp-parsidate را ترجیج دادم.

    1- بروز رسانی یک افزونه یکی از مهم ترین دلایل پیشرفت آن تلقی می شوید.
    نمی دانید وقتی برنامه نویس باشید و وارد مخزن گیت هاب یک پروژه شوید ، آخرین بروز رسانی آن را یک سال پیش ببینید این حس به شما تلقی می شود که این پروژه احتمالا متوقف شده و شخص آن را با گزینه ی بهتری جایگزین کرده.
    افزونه پارسی دیت بروز رسانی های منظمی در گیت هاب دارد و این یعنی خودش را با پیشرفت وردپرس هماهنگ کرده و نیاز های کاربران را ارتقا داده اما افزونه جلالی در یک نیاز ثابت مانده.

    مخزن گیت هاب پارسی دیت

    2-ساختار برنامه نویس افزونه پارسی دیت کاملا تجربی است و از هیچ فریم ورک معتبر در زمینه ی استارتر های افزونه وردپرس مانند wppb استفاده نشده.این کار تسلط کامل برنامه نویس را بر وردپرس نشان می دهد.البته این را هم مد نظر قرار دهید، زمانی که محصول یا افزونه ای تولید می شود به طور حتم اگر قرار است شخصی در همان موضوع افزونه ای تولید کند نکات ضعف آن را پوشش خواهد داد.

    3-من در یک پروژه با فریم ورک لاراول از افزونه پارسی دیت استفاده کردم.بله درست شنیدید یکی از اصلی ترین قابلیت های افزونه parsidate مستندات آن است که به توسعه دهندگان امکان گسترش پروژه های وب فارسی از جمله وردپرس را میدهد.یک کلاس با نام bn_parsidate در این افزونه وجود دارد که این وظیفه را برعهده دارد.

    آموزش نصب افزونه پارسی دیت

    برای نصب افزونه فارسی ساز وردپرس کافیست در صفحه افزونه ها مدیریت وردپرس ، عبارت wp-parsidate را جستجو و افزونه را نصب و فعال کنید.بعد از نصب  ، یک منو با نام تنظیمات پارسی در مدیریت ایجاد می شود.
    روی آن کلیک کنید و گزینه تاریخ خورشیدی را فعال و تنظیمات را ذخیره کنید با این عملکرد تمامی تابع های اصلی وردپرس که با تاریخ سرو کار دارند از فیلتر افزونه پارسی دیت عبور کرده و در نتیجه شمسی خواهند شد.

    صفحه تنظیمات افزونه پارسی دیت

    تبدیل تاریخ میلادی به شمسی در وردپرس

    فرض کنید میخواهیم تاریخ ثبت نام کاربر در وردپرس را به شمسی نمایش دهیم.در جدول wp_users فیلد user_registered تاریخ ثبت نام کاربر را با به میلادی با فرمت datetime یعنی تاریخ به همراه ساعت ثبت نام ، قرار داده است.ابتدا این مقدار را دریافت میکنیم سپس توسط تابع parsidate آن را به شمسی نمایس می دهیم :

    $user_id = 1;
    $user_data = get_userdata($user_id);
    $user_date_register = $user_data->user_registered;
    echo parsidate("Y-m-d", $register_date, "per");

    در خط دوم توسط تابع get_userdata اطلاعات پایه کاربر با شناسه 1 را از دیتابیس دریافت و در خط سوم تاریخ ثبت نام فرد را به میلادی در متغیر قرار دادیم ، و در نهایت توسط تابع parsidate آن را به شمسی تبدیل کردیم.خروجی این تابع مثلا 10-02-1398 می باشد.

    همانطوری که مشاهده میکنید تابع parsidate دارای سه پارامتر اصلی می باشد :

    1. پارامتر اول نوع نمایش خروجی تاریخ هست که بر اساس پارامتر های پیش فرض تعریف شده در تابع date زبان برنامه نویسی php هست.اگر لیست کامل این حروف و خروجی هر کدام را میخواهید لیست کامل آن در نسخه  PDF این مقاله  وجود دارد.
    2. پارامتر دوم باید تاریخ میلادی را به تابع بدهیم.که در مثال بالا متغیر تاریخ ثبت نام فرد به تابع داده شده است.دقت کنید در این تابع دیگر نیازی به strtotime کردن تاریخ نیست و این مبدل در خوده هسته ی این تابع وجود دارد.
    3. پارامتر سوم مشخص میکنیم اعدادی که قرار است به عنوان خروجی نمایش داده شود به صورت فارسی یا per باشد و یا به صورت انگلیسی یا eng.

    ایجاد شورت کد نمایش تاریخ امروز در وردپرس

    در مثال زیر یک شورت کد به نام nowdate ایجاد می کنیم.این شورت کد تاریخ امروز را در هر کجای سایت که shortcode را قرار دهید نمایش می دهد :

    function wp_nowdate() {
    	return parsidate("l j F Y", 'now', "per");
    }
    add_shortcode( 'nowdate ', 'wp_nowdate' );

    اگر در ویرایشگر وردپرس شورت کد [nowdate] را منتشر کنیم خروجی آن تاریخ همان روز به ما می باشد مثلا “دوشنبه 10 مرداد 1398”.دقت کنید که در این مثال ما بجای تاریخ میلادی تنها عبارت now را نوشتیم.

    شمسی کردن تاریخ های میلادی برای کوئری های دلخواه

    اگر یک جدول دلخواه در پروژه وردپرس خود ایجاد کرده اید میتوانید از کلاس wpdb ابتدا مقدار را دریافت کنید و سپس آن را توسط تابع parsidate به شمسی تبدیل کنید.
    فرض کنید در یک پروژه دانشگاهی لیست تمامی دانشجویان  را در یک جدول به نام person قرار دادیم و یک فیلد به نام date وجود دارد که تاریخ ارائه پایان نامه آن دانشجو می باشد. برای نمایش تاریخ آن به شمسی از کد زیر استفاده میکنیم :

    global $wpdb;
    $result = $wpdb->get_row( "SELECT * FROM `".$wpdb->prefix."person` WHERE `code` = 498" );
    $person_date = $result->date;
    echo parsidate("Y-m-d", $person_date, "per");

    در مثال بالا ابتدا به یک درخواست از جدول wp_person ، اطلاعات دانشجو با کد 498 را دریافت کردیم . سپس فیلد date آن را برای شمسی سازی به تاریخ parsidate واگذار کردیم.

    توجه : اگر میخواهید روی خروجی تابع parsidate عملیاتی انجام دهید نبایستی خروجی آن را بصورت فارسی یا “per” منتشر کنید.چون کاراکتر های خروجی در این حالت بصورت رشته برای php معرفی می شود ن عدد.
    فرض کنید میخواهید سال تولد یکی از اعضا رو برگردانید و به آن 4 سال اضافه کنید و نمایش دهید .در این حالت باید حتما خروجی “eng” باشد تا php بتواند عملیات ریاضی را انجام دهد :

    $date = "2018-02-10";
    echo parsidate("Y", $date, "eng") + 4;

    در مثال بالا من خروجی تاریخ سال شمسی را به صورت eng در آوردم تا بتوانم به آن 4 عدد اضافه کنم.

    اگر کاربر افزونه پارسی دیت را نصب نکرده باشد چه می شود ؟

    ما افزونه ای  می سازیم و در آن از تابع parsidate استفاده میکنیم .اما زمانی که کاربری میخواهد آن افزونه را در وردپرس خود نصب کند ، افزونه ی پارسی دیت را نصب نکرده باشد و یا به هر دلیلی از افزونه جلالی در حال استفاده کردن باشد.
    اتفاقی که می افتد با خطای php در وردپرس مواجه می شود مبنی بر این که تابع parsidate یافت نشد.این یعنی افزونه ما بدرستی کار نخواهد کرد.
    برای رفع این مشکل دو راه حل پیشنهاد میدهم :

    1- میتوانید از کتابخانه TGM Plugin Activation استفاده کنید. که برای این مورد من زیاد پیشنهاد نمیکنم.
    حتما تا بحال قالبی را نصب کرده اید که بعد از نصب آن ، به طور اتوماتیک افزونه هایی مثل Contact Fotm 7 نصب شود. کتابخانه TGM دقیقا همین کار را برایتان انجام میدهد.شما میتوانید توسط ضمیمه کردن این کتابخانه به افزونه خودتان ، به وردپرس دستور بدهید بعد از نصب افزونه شما حتما افزونه wp-parsidate یا هر افزونه ای که بخواهید را نصب کند.

    2-راه حل بهتر این است که کلاس پایه افزونه parsidate که با نام bn_parsidate و در مسیر زیر در پوشه افزونه قرار دارد را ضمیمه پروژه خود کنیم.همان طور که گفتم این کلاس bn_parsidate را میتوانید حتی در پروژه های غیر وردپرس هم استفاده کنید.

    wp-parsidate/includes/parsidate.php

    خوب من ابتدا این فایل را داخل پروژه خود قرار میدهم اما قبلش باید چک کنم که کاربر این افزونه را نصب کرده هست یا خیر تا در عملکرد php اختلال ایجاد نشود. برای این کار میتوانید از دو کد زیر استفاده کنید :

    /* Check Exist function is_active_plugin */
    if ( ! function_exists( 'is_plugin_active' ) ) {
    	include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
    }
    
    /*Check Wp-parsidate Plugin is Active*/
    if ( is_plugin_active( 'wp-parsidate/wp-parsidate.php' ) ===false) {
      include_once( 'parsidate.php' );
    }

    در وردپرس اگر میخواهید چک کنید که یک افزونه نصب هست یا خیر می توانید از تابع is_active_plugin استفاده کنید . در بخش اول ابتدا ما چک کردیم در صورتی که این تابع فراخوانی نشده باشد ، از هسته ی وردپرس آن را فراخوانی کند در بخش بعدی چک میکنیم ،  اگر افزونه wp-parsidate نصب نشده است فایل کلاس bn_parsidate را ضمیمه صفحه بکند.

    روش دیگری هم وجود دارد که من همیشه از آن استفاده میکنم و آن هم چک کردن موجودیت کلاس هست در مقابل افزونه.چون در برخی پروژه ها دیدم که عینا برنامه نویسان برای شخصی سازی نام پوشه wp-parsidate را تغییر میدهند و در این حالت ما نمیتوانیم چه پارامتری به تابع is_active_plugin دهیم که بفهمیم افزونه نصب هست یا خیر.
    مورد بعدی اینکه اگر بخواهید در یک فریم ورک مثل codeigniter از کلاس استفاده کنید دیگر تابع is_active_plugin در آن معنی ندارد و می بایست کلاس را چک کنید.کد دوم به صورت زیر هست :

    if (class_exists('bn_parsidate') ===false) {
    	include_once( 'parsidate.php' );
     }

    اگر یک افزونه دوزبانه فارسی و انگلیسی نوشتیم چه کنیم ؟

    این مشکل را من زیاد داشتم اکثر افزونه هایی که تولید میکنم برای هر دو زبان انگلیسی و فارسی هست.خوب مشکلی که ما داریم این است که افراد غیر ایرانی نیازی به افزونه parsidate ندارند و به تاریخ میلادی نیاز دارند. از طرفی ما در افزونه خود از تابع شمسی استفاده کردیم.راه حل چیه ؟
    برای جلوگیری از این کار میتوانیم ابتدا چک کنیم که وردپرس کاربر در چه زبانی هست بعد از آن مطابق با فارسی یا انگلیسی بودن آن نوع تاریخ را نمایش دهیم :

    /*Check Farsi Locale WordPress*/
    function wp_is_fa() {
    	if ( get_locale() == 'fa_IR' ) { return true; } else { return false; }
    }
    
    $date = "2019-05-10";
    if (wp_is_fa() ) {
    	$date = parsidate("Y-m-d", $date, "eng");
    }
    
    echo $date;

    در مثال بالا ابتدا یک تابع ساده نوشتم تا چک کند در حال حاضر وردپرس کاربر فارسی هست یا خیر.سپس در هر کجای برنامه نویسی افزونه چک میکنم که اگر وردپرس کاربر فارسی بود برای ما به شمسی نمایش دهد.
    البته اگر بخواهیم استاندارد تر کدنویسی کنیم میتوانیم از Filter در وردپرس استفاده کنیم مانند :

    $date = "2019-05-10";
    $date = apply_filters( 'wp_show_datetime_my_plugin', $date );
    echo $date;
    
    /* Adding filter */
    if ( get_locale() == 'fa_IR' ) { 
    	add_filter( 'wp_show_datetime_my_plugin', function($date){
    		$date = parsidate("Y-m-d", $date, "eng");
    		return $date;
    	});
    }

    آموزش استفاده از افزونه پارسی دیت در یک پروژه غیر از وردپرس

    همانند روش بالا میتوانید فایل کلاس bn_parsidate  را در پروژه ی خودتان قرار دهید و آن را ضمیمه کنید . سپس کلاس parsidate را به شکل زیر فراخوانی کرده و از آن استفاده کنید :

    $parsdate_class = bn_parsidate::getInstance();
    $nowdate = $parsdate_class->persian_date("Y-m-d","2018-10-05","eng");

    تبدیل تاریخ شمسی به میلادی در وردپرس

    اگر تمامی تاریخ هایی که در بانک اطلاعاتی هست میلادی باشد.یکی از نیاز های ما همواره این است ، که تاریخ شمسی از کاربر دریافت کنیم مانند صفحات گزارش و آن را برای جستجو در بانک اطلاعاتی به تاریخ میلادی تبدیل کنیم.
    فرض کنید میخواهیم لیست تمامی کاربرانی که از تاریخ 10-02-1389 تا تاریخ 05-10-1396 ثبت نام کرده اند را در وردپرس لیست کنیم.برای این کار ابتدا توسط تابع gregdate تاریخ شمسی را به میلادی تبدیل کرده ، سپس پرس و جو در بانک اطلاعاتی را انجام می دهیم :

    $after = gregdate("Y-m-d", "1389-02-10");
    $before = gregdate("Y-m-d", "1396-10-05");
    
    global $wpdb;
    $result = $wpdb->get_results( "SELECT * FROM `".$wpdb->users."` WHERE (user_registered BETWEEN '".$after." 00:00:00' AND '".$before." 10:15:55')" );
    foreach ($result as $user) {
    	echo $user->display_name;
    	echo "<br>";
    }

    در مثال بالا ابتدا دو تاریخ را تبدیل به میلادی کردیم. سپس از آنها در رشته ی SQL برای ایجاد یک درخواست توسط کلاس wpdb استفاده کردیم.

    نمایش آرشیو مطالب در وردپرس با کلاس wp_Query و افزونه پارسی دیت

    یکی از روش های نمایش آرشیو محتوا در وردپرس استفاده از کلاس قدرتمند WP_Query می باشد.در مثال زیر ما تمامی پست هایی که از تاریخ 10-02-1389 تا تاریخ 05-10-1396 متشر شد را در سایت میتوانیم نمایش دهیم :

    /* After Date */
    $after = gregdate("Y-m-d", "1389-02-10");
    $array_after = explode("-", $after);
    
    /* Before Date */
    $before = gregdate("Y-m-d", "1396-10-05");
    $array_before = explode("-", $before);
    
    /* Set Query */
    $args = array(
    	'date_query' => array(
    		array(
    			'after'     => array(
    				'year'  => $array_after[0],
    				'month' => $array_after[1],
    				'day'   => $array_after[2],
    			),
    			'before'    => array(
    				'year'  => $array_before[0],
    				'month' => $array_before[1],
    				'day'   => $array_before[2],
    			),
    			'inclusive' => true,
    		),
    	),
    	'posts_per_page' => -1,
    );
    $query = new WP_Query( $args );
    while ($query->have_posts()):
    $query->the_post();
    
    echo get_the_title();
    echo "<br>";
    
    endwhile;
    wp_reset_postdata();

    اگر دقت کنید کلاس wp_Query مقادیر سال ، ماه و روز را به صورت جداگانه از ما میخواهد . به همین دلیل من مقدار خروجی تابع میلادی رو با استفاده از تابع explode جداسازی کردم و هر کدام از ماه و سال و روز رو براحتی برگرداندم.

    فارسی سازی اعداد در وردپرس

    برای فارسی سازی اعداد در وردپرس میتوانید از تابع per_number براحتی استفاده کنیم :

    $number = 1486;
    echo per_number($number);

    تبدیل اعداد فارسی به انگلیسی

    گاهی هم اتفاق می افتد که میخواهید اعداد فارسی را به انگلیسی تبدیل کنید یعنی دقیقا برعکس حالت بالا که میتوانید از تابع eng_number به شکل زیر استفاده کنید :

    echo eng_number(۱۴۸۶);


    مطلب رو به اشتراک بگذارید