استفاده از توابع مفید wp-parsidate برای توسعه دهندگان وردپرس

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

  1. تغییر زبان مدیریت سایت به زبان پارسی
  2. تغییر زبان سایت به زبان پارسی
  3. تغییر تاریخ میلادی به خورشیدی ( جلالی )
  4. تغییر اعداد لاتین به اعداد پارسی در :
    1. در عنوان صفحه
    2. در عنوان نوشته ها
    3. در محتوای نوشته ها
    4. در خلاصه نوشته ها
    5. در محتوای دیدگاه ها
    6. در نمایش تعداد دیدگاه ها
    7. در دسته بندی ها
    8. در نمایش تاریخ ها
  5. تصحیح حروف عربی به حروف پارسی
  6. تبدیل تاریخ در پیوندهای یکتا
  7. استفاده از فونت زیبای «Droid Arabic Naskh» برای بخش مدیریت و ویرایشگر متن
  8. تصحیح قیمت ها در افزونه ووکامرس
  9. تصحیح قیمت ها و جایگزین کردن “ریال” با Rial در افزونه Easy Digital Downloads

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

پارسی دیت برای تغییر زمان از چه قلاب هایی بهره میگیرد ؟!

افزونه پارسی دیت به کمک ۵ فیلتر ( add_filter ) و یک اکشن ( add_action ) قادر هستش که زمان رو در توابع استاندارد وردپرسی تغییر بده، برای روشن شدن موضوع بهتره مثالی بزنم، به طور مثال اگه شما پوسته ای داشته باشید و در حلقه ای از تابع the_date استفاده کنید، پارسی دیت به کمک قلاب the_date خروجی نمایش این تابع رو تغییر خواهد داد، اگر خروجی تابع در حالتی که افزونه پارسی دیت نصب نیست به این صورت ( August 10, 2016 ) باشه، پس از نصب پارسی دیت به این شکل ( مرداد ۲۰, ۱۳۹۵ ) تغییر پیدا خواهد کرد، به این ترتیب پارسی دیت قادر هستش تا نمایش تاریخ در هر پوسته یا افزونه ای که از تابع the_date استفاده می کند رو به تاریخ خورشیدی برگردونه.

فیلتر های زیر تحت تاثیر افزونه پارسی دیت هستن البته در شرایطی که گزینه های مربوطه در بخش تنظیمات اونها فعال باشن، همچنین توابع مربوط به این قلاب ها، همنام با قلاب مربوطه هستن، برای نمونه قلاب the_date مربوط به تابعی با همین نام هستش.

  1. the_date
  2. the_time
  3. get_comment_time
  4. get_comment_date
  5. get_post_modified_time
  6. date_i18n
    • برای قلاب کردن به این فیلتر افزونه پارسی دیت اشتباهی از add_action استفاده کرده که امیدوارم در نسخه های بعدی این افزونه اصلاح بشه

اگه پوسته یا افزونه شما از قلاب ها ( یا توابعی با همین نام ) در بالا استفاده می کنه، می تونید مطمئن باشید که خروجی اون تابع با استفاده از افزونه پارسی دیت از میلادی به خورشیدی تغییر خواهد کرد.

نکته برای تیم وردپرس پارسی : همینطور که در توضیح بالا اشاره شد افزونه پارسی دیت از ۶ قلاب برای تبدیل زمان میلادی به خورشیدی استفاده می کنه، اما سوالی که پیش میاد اینه که آیا واقعا پارسی دیت به این ۶ قلاب نیاز داره یا نه ؟! شاید بشه کاری کرد که پارسی دیت تنها با یک قلاب همون خروجی رو بگیره !!!

بیاید نگاهی بندازیم به هسته چندتا از توابعی که در بالا فهرست شد، برای نمونه از تابع the_date شروع می کنیم، این تابع در هسته خودش از تابع get_the_date برای گرفتن زمان استفاده می کنه، حالا بیاید نگاهی به هسته تابع get_the_date بندازیم، این تابع هم خودش از تابع mysql2date برای تبدیل زمان با فرمت mysql به زمان بومی بهره میگیره و حالا اگه نگاهی به هسته تابع mysql2date بندازیم می بینیم که خود این تابع با استفاده از تابع date_i18n زمان رو بومی سازی می کنه.

حالا اگه همین روش رو برای توابع دیگه مانند the_time, get_comment_time, get_comment_date و غیره بکار بگیریم ، می بینیم که در هسته تمام توابع از تابع date_i18n استفاده شده، بنابراین ما تنها با یک قلاب می تونیم تمام توابع رو از میلادی به خورشیدی تغییر بدیم. اما برای اینکه مطمئن بشیم، من هسته افزونه پارسی دیت رو در آدرس /wp-parsidate/includes/fixes-dates.php دستکاری می کنم و به جز قلاب date_i18n تمام قلاب های دیگرو غیر فعال می کنم.

global $wpp_settings;

if ( $wpp_settings['persian_date'] != 'disable' ) {
    // add_filter( 'the_time', 'wpp_fix_post_time', 10, 2 );
    // add_filter( 'the_date', 'wpp_fix_post_date', 10, 2 );
    // add_filter( 'get_comment_time', 'wpp_fix_comment_time', 10, 2 );
    // add_filter( 'get_comment_date', 'wpp_fix_comment_date', 10, 2 );
    // add_filter( 'get_post_modified_time', 'wpp_fix_post_date', 10, 2 );

    add_action( 'date_i18n', 'wpp_fix_i18n', 10, 3 );
}

و حالا پوسته خودم رو بررسی می کنم و می بینم بدون این قلاب ها و فقط به کمک قلاب date_i18n تاریخ میلادی در پست ها و دیدگاه های من به تاریخ خورشیدی تبدیل می شه، و این معنیش اینه که ما نیازی به بقیه قلاب ها نداریم. 🙂

افزونه wp-parsidate برای توسعه دهنده گان

اگر چه امکاناتی که این افزونه در اختیار ما قرار میده به تنهایی برای یک وبلاگ ساده کفایت می کنه، اما گاهی شما به عنوان یک توسعه دهنده تصمیم دارید با استفاده از قلاب ها تغییراتی در افزونه هاتون بدید و یا اینکه تصمیم دارید شرت کدها یا تمپلت هایی بسازید، برای نمونه شاید پوسته ای دارید که برای نمایش تاریخ میلادی از توابع استاندارد وردپرس مانند the_date, the_time, ... استفاده نمی کنه بنابراین به نظر میرسه راهی وجود نداره تا افزونه پارسی دیت به اون بخش قلاب بشه و تاریخ میلادی رو به خورشیدی تبدیل کنه، به این ترتیب ما چاره ای نداریم به جز دستکاری پوسته ( البته به روش استاندارد ).

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

تبدیل تاریخ میلادی به شمسی توسط تابع parsidate

این تابع زمان میلادی به زمان شمسی ( جلالی ) رو برگردان می کنه و ۳ آرگومان ورودی داره که به این ترتیب هستش:

  1. $input
    • فرمت ورودی زمان که برای نمونه شبیه به این 'Y-m-d' یا هر فرمت دیگه ای که در تابع استاندارد date پشتیبانی شود.
  2. $datetime
    • زمان ورودی به میلادی که می تونه به صورت timestamp یا بصورت رشته ای و با هر فرمت دیگه ای که توسط تابع strtotime پشتیبانی شود.
  3. $lang
    • مقدار این آرگومان اگه برابر با ‘per’ باشه، تابع parsidate اعداد لاتین رو به اعداد پارسی برگردان می کند.

بهتره مثالی بزنم، برای نمونه من فرض رو بر این میگیرم که شما تصمیم دارید زمان ثبت نام یک کاربر رو در پروفایل خودش به صورت تاریخ شمسی ( خورشیدی ) نمایش بدید. برای اینکار ابتدا با استفاده از تابع get_user_by() و تنها با داشتن ایمیل کاربر می تونیم به کلاس WP_User دسترسی پیدا کنیم. خروجی این کلاس یک آبجکت از نقش ها، توانایی ها و اطلاعات مربوط به هر کاربر خواهد بود و ما برای این مثال تنها به پروپرتی data از این کلاس نیاز داریم که شامل تمام اطلاعات مورد نیار ما از جدول wp_user موجود در دیتابیس هستش.

پس از اون با استفاده از پروپرتی user_registered که دارای تاریخ ثبت نام کاربر در دیتابیس هستش و به کمک تابع parsidate() می تونیم براحتی زمان میلادی رو به شمسی تبدیل کنیم، من در کدهای زیر به شما نشون میدم که چطور اینکارو انجام بدید :

############ Persian to Georgerian ################

 $user = get_user_by( 'email', [email protected]' );
    if( $user ){
        $user_data = $user->data;
        $user_registered = $user_data->user_registered; // 2016-07-19 14:06:44

        print_r( parsidate("Y-m-d H:s:d", $user_registered  , 'eng') ); // 1395-04-29 14:44:29
        echo "<br  />";

        print_r( parsidate("Y-m-d H:s:d", $user_registered  ) ); // ۱۳۹۵-۰۴-۲۹ ۱۴:۴۴:۲۹
        echo "<br  />";

    }

برای اینکه ما از یک تابع خارجی برای پوستمون استفاده می کنیم و ممکن کاربر ما افزونه پارسی دیت رو نصب و فعال نکرده باشه بنابراین برای احتیاط باید با استفاده از تابع پی اچ پی function_exists اطمینان پیدا کنیم که تابع مورد نظرمون موجود هستش، اما طبق توضیحاتی که پیشتر گفتم زمانی که افزونه پارسی دیت فعال هستش به صورت خودکار قلاب date_i18n رو تحت تاثیر قرار میده که این قلاب در هسته تابعی با همین نام هستش و همینطور در هسته تابع mysql2date هم ایفای نقش می کنه، بنابراین می تونیم بجای استفاده از تابع parsidate از تابع mysql2date استفاده کنیم و همینطور نیازی به استفاده از تابع function_exists هم نیستش، نمونه رو در کد زیر می تونید ببینید و توجه داشته باشید که من فرمت نمایش تاریخ رو تغییر دادم :

if( function_exists('parsidate') ){
           print_r( parsidate("F j, Y", $user_registered  ) ); // تیر ۲۹, ۱۳۹۵
           echo "<br  />";
 }
 // OR
 print_r( mysql2date("F j, Y", $user_registered  ) ); // تیر ۲۹, ۱۳۹۵
 echo "<br  />";

تبدیل تاریخ شمسی به میلادی توسط تابع gregdate

این تابع زمان شمسی به زمان میلادی رو برگردان می کنه و ۲ آرگومان ورودی داره که به این ترتیب هستش:

  1. $input
    • فرمت ورودی زمان که برای نمونه شبیه به این 'Y-m-d' یا هر فرمت دیگه ای که در تابع استاندارد date پشتیبانی شود.
  2. $datetime
    • زمان ورودی به شمسی اما با حروف لاتین که در ۳ بخش روز، ماه و سال پشتیبانی خواهد شد، مانند : "1395-05-21" یا "1395/05/21"

کارایی این تابع بر خلاف ذهنیتی که ممکن شما از اون داشته باشید می تونه بارها بیشتر از تابع parsidate باشه، خصوصا در ایجاد شرت کدها، بطور مثال تصور کنید که کاربری با استفاده از یک شرت کد تصمیم داره تنها نوشته های امروز یا دیروز رو در برگه ای از سایتش نمایش بده، ورودی اطلاعات می تونه با یک datepicker پارسی و توسط کاربر به صورت شمسی وارد بشه تا کاربر راحتتر زمان رو انتخاب کنه، اما نتیجه باید بر اساس میلادی از دیتابیس استخراج بشه، بنابراین ابتدا زمان شمسی و با حروف لاتین از کاربر گرفته میشه و با استفاده از تابع gregdate به زمان میلادی تبدیل و سپس نتیجه با استفاده از کوئری از دیتابیس دریافت میشه.

کدها همیشه بهتر از واژه ها حرف برای گفتن دارن، بنابراین این مثال می تونه به درک بهتر مطلب کمک کنه، من تصمیم دارم با استفاده از کلاس WP_Query و با پارامتر date_query اینکارو برای شما انجام بدم، اما فرض رو بر این میگیرم که شما شرت کد رو ساختید و زمان رو ( به شمسی ) از کاربر دریافت کردید ( البته به لاتین ) ، زمان دریافتی شما می تونه شبیه به این "1395-05-20" یا این "1395/05/20" باشه به این ترتیب ما نیاز به دو تابع پی اچ پی داریم تا زمان دریافتی رو تکه تکه و سپس در متغیرهای مربوطه مقداردهی کنه، من از explode برای تبدیل رشته به آرایه و از list برای تبدیل آرایه به متغیرها استفاده می کنم و نتیجه کار می تونه این شکلی باشه :

############ Georgerian to Persian ################

    $input_date = "1395-05-20";
    if( function_exists('gregdate') ) {
        $input_date = gregdate( "Y-m-d", $input_date ); // 2016-08-10
    }
    list( $year, $month, $day ) = explode( "-", $input_date ); // $year = 2016; $month = 08 ; $day = 10

    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'date_query' => array(
                array(
                    'year'   => $year,
                    'month' => $month,
                    'day'     => $day,
                )
            ),
    );
    $query = new WP_Query( $args );

    if( $query->have_posts() ): while( $query->have_posts() ): $query->the_post();
        ?>
        <h3><?php the_title(); ?></h3>
        <?php
    endwhile; wp_reset_postdata();
    endif;

این کوئری عنوان نوشته هایی رو در خروجی نمایش میده که مربوط به تاریخ "1395-05-20" هستش، شما می تونید از پارامترهای دیگه استفاده کنید و تغریبا بدون محدودیت در هر بازه زمانی نوشته یا پست سفارشی خودتون رو از دیتابیس دریافت کنید. مثلا نوشته هایی مربوط به یک هفته یا یک ماه گذشته. 🙂

ایجاد یک آرشیو ( بایگانی ) با استفاده از تابع wp_get_parchives

اگه تصمیم دارید در وبلاگتون بخشی رو به عنوان بایگانی نوشته هاتون داشته باشید می تونید از این تابع مفید استفاده کنید، تابع wp_get_parchives در واقع با اقتباس از تابع وردپرسی wp_get_archives ایجاد شده و شما می تونید با استفاده از این تابع یک بایگانی به صورت سالانه، ماهانه و یا روزانه ایجاد کنید.

این تابع یک آرگومان به صورت رشته یا آرایه ای از پارامترهارو در ورودی خودش میگیره :

  1. $args
    • رشته ای از پارامترها مانند "type=yearly&show_post_count=true" و یا آرایه ای از پارامترها مانند array('type'=>'yearly', 'show_post_count' => true )
  2. پارامتر ها
    • type – نوع نمایش بایگانی بصورت سالانه، ماهانه و روزانه.
      • yearly – سالانه
      • monthly – ماهانه
      • daily – روزانه
    • show_post_count – در صورتی که مقدار این پارامتر برابر true باشه، تعداد پست ها بصورت عددی کنار بایگانی نمایش داده میشه.
    • format – فرمت یا قالبی برای نمایش لیست بایگانی
      • html – نمایش بایگانی با برچسبهای <li></li> و پشتیبانی از پارامتر های before و after
      • option – نمایش بایگانی بصورت فهرست بازشونده ( dropdown ) با برچسبهای <option></option>
      • link – نمایش با برچسب <link /> و مفید برای head
      • custom – نمایش بصورت سفارشی با پشتیبانی از پارامترهای before و after
    • before – مکانی برای درج متن یا برچسب قبل از لینک در فرمت های html و custom
    • after – مکانی برای درج متن یا برچسب بعد از لینک در فرمت های html و custom
    • order – متاسفانه این پارامتر در این تابع کارایی نداره و باید منتظر بروزرسانی های بعدی تیم وردپرس پارسی باشیم.
    • echo – متاسفانه این پارامتر در این تابع کارایی نداره و باید منتظر بروزرسانی های بعدی باشیم.
    • limit – به نظر میرسه تیم وردپرس پارسی یادشون رفته باشه این پارامتر رو هم در کوئری مربوطه قرار بدن، بنابراین فعلا کارایی نداره، باید منتظر بروزرسانی های بعدی باشیم.

همینطور که مشاهده کردید چندتا از پارامترهای این تابع مفید در حال حاضر غیر فعال هستن و همچنین یک پارامتر جاش اینجا خالیه که در تابع اصلی وردپرس یعنی wp_get_archives موجود هستش، اونم پارامتر post_type هست که کاربر به کمک اون می تونه دقیقا مشخص کنه که خروجی بایگانیش مربوط به چه نوع پستی باشه و تنها محدود به نوشته ها نباشه.

من یک نمونه از کارایی این تابع رو بهتون نشون میدم و بعدش خودتون می تونید بیشتر باهاش بازی کنید و به دلخواه خودتون آرشیو درست کنید، شما می تونید از این تابع در تمپلت هایی مثل archive.php در پوسته هاتون استفاده کنید و یا اگه تصمیم داریم افزونه بسازید می تونید از اون در شرت کدها استفاده کنید، در اینجا من تصمیم دارم با استفاده از این تابع یک بایگانی بصورت لیست غیرعددی و با فرمت custom ایجاد کنم :

############# Create Custom Archive by wp_get_parchives #################

echo "<ul id='khosroblog-archive' class='daily-archive'  >" ;
wp_get_parchives( array(
            "type"                  =>    "daily",
            "show_post_count" =>     true,
            "format"                =>    'custom',
            "before"                =>    "<li class='archive-item' >",
            "after"                =>    "</li>"
) );
echo  "</ul>";

و خروجی کد شبیه به این میشه :

و در پایان :

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

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

© 2017 هادی خسروجردی.