اگر در حال برنامه نویسی یک استارت اپ فارسی با وردپرس باشید ، یکی از نیاز های شما مسلما بحث کار با تاریخ شمسی در وردپرس هست.در بین افزونه های موجود در زمینه فارسی سازی وردپرس دو افزونه wp-jalali (افزونه جلالی) و افزونه پارسی دیت (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 هست.
  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- اصلی ترین و استاندارد ترین روش آن است که بجای اینکه مستقیما از توابع یک افزونه داخل افزونه ی خود استفاده کنیم. بیاییم از توابع داخلی وردپرس استفاده کنیم.به عنوان مثال تابع date_i18n وظیفه ی نمایش تاریخ در فرمت دلخواه در وردپرس را بر عهده دارد.زمانی که افزونه پارسی دیت را نصب میکنید این افزونه بطور خودکار تمامی رشته هایی که توسط تابع date_i18n خروجی داده می شود را شمسی می کند.
یعنی با این کار اگر کاربر افزونه فارسی ساز نداشت تاریخ میلادی برگشت میکند و اگر داشت تاریخ شمسی برگشت می کند.حال دوباره برمیگردیم به مثال اولی که داشتیم و آن را بدین شکل مینویسیم :

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

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

3-راه حل دیگر این است که کلاس پایه افزونه 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);

بزارین تمرین کنیم ببینیم همه چیز رو یاد گرفتید یا ن. الان کد بالا استاندارد نیست چرا ؟
خوب مشخصه کاربر اگه افزونه پارسی دیت رو نصب نکرده باشه با خطا داخل صفحه مواجه میشه . برای فارسی سازی اعداد باید از توابع داخلی خوده وردپرس استفاده کنیم که توسط افزونه پارسی دیت فیلتر میشن یعنی تابع number_format_i18n.پس با این حساب باید بنویسیم :

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

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

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

echo eng_number(۱۴۸۶);