PDA

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



AmirHosein
February 5th, 2010, 22:29
در این پست اشاره‌ای خواهم داشت به این که چگونه میتوانیم برای وردپرس افزونه (Plugin) بنویسیم>:D<. نوشتن یک افزونه راه‌های زیادی دارد، من در این مطلب به ساده‌ترین راه برای شروع اشاره میکنم.
در پایان این نوشته افزونه‌ای خواهیم نوشت که بعد از انتشار پست آن را برای چند نفر ایمیل کند، به تیتر‌ها افکت سایه بدهد;;).
__________________________________________________ __
مقدمه
یکی از نقاط قدرت وردپرس افزونه‌های آن است که قابلیت‌ها و توانایی‌های آن را افزایش میدهد. وردپرس این امکان را به هر کاربری با کمی معلومات میدهد تا افزونه خود را بنویسد و بصورت شخصی استفاده کند یا با دیگران به اشتراک بگذارد.
برای نوشتن یک افزونه وردپرس کافیست اطلاعاتی مقدماتی در PHP, JavaScript و CSS داشته باشید.
__________________________________________________ __
چرا باید یک افزونه وردپرس بنویسیم؟
دلایل زیادی میتواند وجود داشته باشد که شروع به نوشتن یک افزونه وردپرس بکنید، ممکن است طراح قالب‌های وردپرس باشید و بخواهید کاری را که دائم انجام میدهید بصورت اتوماتیک در بیاورید، ممکن است بخواهید یک افزونه وردپرس را گشترس دهید یا آن را تغییر دهید، ممکن است بخواهید از این راه کسب درآمد کنید، یا شاید هم بخاطر محبوبیت، فرض کنید یک افزونه برای وردپرس مینویسید و آن را در بانک افزونه‌های وردپرس قرار میدهید و هزاران نفر از آن استفاده میکنند و در قسمت مدیریت افزونه‌های سایت خود لینک سایت شما را مشاهده خواهند کرد.
__________________________________________________ __
شروع
هر افزونه وردپرس باید حداقل دارای یک فایل PHP باشد، همچنین میتواند دارای فایل‌های دیگر شامل فایل‌های جاوا اسکریپت، فایل‌های استایل، عکس و… باشد، به همین دلیل بهتر است برای افزونه خود یک پوشه ایجاد کنیم.
برای شروع در مسیر wp-content/plugins یک پوشه همنام با افزونه خود ایجاد میکنیم، نام این پوشه نباید شامل فاصله (space) باشد، برای این آموزش من پوشه‌ی myPlugin را ایجاد میکنم.
درون این پوشه یک فایل PHP ایجاد میکنیم همنام با نامِ پوشه، اگر با درست کردن قالب‌های وردپرس آشنا باشید میدانید که برای اینکه وردپرس قالب شما را بشناسد باید در چند خط اول فایل style.css مشخصات قالب را وارد کنیم، در نوشتن افزونه نیز باید همین کار را انجام دهیم، بنابراین چند خط اول این فایل به مشخصات افزونه اختصاص دارد.
کد:

view source
print?
01.<?php
02./*
03.Plugin Name: Name Of The Plugin
04.Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
05.Description: A brief description of the Plugin.
06.Version: The Plugin's Version Number, e.g.: 1.0
07.Author: Name Of The Plugin Author
08.Author URI: http://URI_Of_The_Plugin_Author
09.*/
10.?>
این‌ها اطلاعاتیست که برای شناساندن افزونه خود به وردپرس نیازمندیم، همانطور که در کد آمده خط سوم نام افزونه رو مشخص میکند که در صفحه مدیریت افزونه‌ها نمایش داده میشود، خط چهارم آدرس افزونه را مشخص میکند، خطوط پنجم و ششم به ترتیب توضیحی از کاربرد افزونه و نسخه آن را مشخص میکنند و در خط هفتم نام سازنده افزونه مشخص میشود، در خط هشتم نیز آدرس سازنده مشخص میشود.
نکته بسیار مهمی که باید به آن توجه داشته باشید این است که Encoding این فایل باید ANSI باشد، اگر این فایل را بصورت UTF-8 یا فرمت‌های دیگر ذخیره کنید هنگام راه‌اندازی یا استفاده از افزونه با خطای :

Warning: Cannot modify header information
مواجه خواهید شد. برای تغییر Encoding فایل میتوانید در برنامه Notepad++ از منوی Format گزینه Encoding in ANSI را انتخاب کنید مانند تصویر زیر:

http://radikal2.com/radikal2/wp/wp-content/uploads/2009/10/encoding.jpg
یا از UTF-8 without BOM استفاده کنید.
حال که فایل که خود آماده و ذخیره کردیم میتوانید وارد صفحه مدیریت افزونه‌های وردپرس شویم، اگر تمام کارها را درست انجام داده باشیم افزونه‌ای که درست کردیم را در لیست افزونه خواهیم دید.

http://radikal2.com/radikal2/wp/wp-content/uploads/2009/10/plugin-page.jpg
__________________________________________________ __
استفاده از توابع Hook
hook‌ها یک سری توابع هستند که وردپرس در خود گنجانده است، نحوه کار آن‌ها به این صورت است که وردپرس قبل از اجرای هر یک از توابع خود یک بار توابع Hook که توسط افزونه‌ها نوشته شده‌اند چک میکند و کاری که hookها به آن اشاره دارند انجام میدهد و سپس نتیجه را نمایش میدهد.
برای مثال وردپرس قبل از اینکه عنوان هر مطلب را نمایش دهد، بررسی میکند که آیا تابع Hookای از جنس filter با مشخصه the_title وجود دارد یا نه اگر وجود داشت آن را اجرا میکند و سپس عنوان مطلب را چاپ میکند.
یا وقتی یک پست را مینویسید و بر روی دکمه انتشار کلیک میکنید وردپرس بررسی خواهد کرد که آیا باید قبل فرستادن اطلاعات به پایگاه داده کاری روی آن انجام دهد یا خیر، تمام این کار‌ها را میتوان با توابع Hook انجام داد.

یکی از این توابع تابع register_activation_hook (http://codex.wordpress.org/Function_Reference/register_activation_hook) میباشد، این تابع دو ورودی دریافت میکند، ورودی اول مسیری است که فایل PHP اصلی افزونه در آن قرار دارد، و ورودی دوم تابعی است که باید اجرا کند.
کار این تابع این است که تابعی که به عنوان ورودی دریافت میکند را هنگامی که افزونه فعال میشود اجرا کند، برای مثال به کد زیر توجه کنید:

view source
print?
1.register_activation_hook(__FILE__, 'myPlugin_activate');
2.
3.function myPlugin_activate() {
4. // do something...
5.}
در این تکه کد مشاهده میکنید که یک تابع به اسم myPlugin_activate معرفی شده است و به وسیله تابع register_activation_hook در زمان فعال‌سازیه افزونه فراخوانی شده است.
در تابع myPlugin_activate میتوان کارهایی از قبیل ساختن جداول لازم در پایگاه داده، معرفی متغییرهای لازم و دیگر کارهای لازم در هنگام اجرای افزونه را انجام دهیم.

تابع دیگر register_deactivation_hook (http://codex.wordpress.org/Function_Reference/register_deactivation_hook) میباشد که مانند تابع قبل دو ورودی میگیرد و تابع‌ای که به آن معرفی میشود را هنگام غیرفعال کردن افزونه اجرا میکند.

به جز تو تابع بالا توابع hook به دو دسته تقسیم میشوند:
Actions (http://codex.wordpress.org/Plugin_API#Actions): وقتی یک رویداد خاص اتفاق میفتد یا در زمان خاصی اجرا میشوند.
Filters (http://codex.wordpress.org/Plugin_API#Filters): برای انجام تغییراتی روی اطلاعات قبل ارسال به پایگاه داده یا نمایش استفاده میشوند.

گاهی میتواند یک کار را هم با استفاده از Actionها انجام داد هم Filterها.
__________________________________________________ __
Actions
برای استفاده از actionها کافیست یک تابع PHP که میخواهید اجرا شود بنویسید، سپس آن را در زمانی که میخواهید توسط تابع add_action اجرا کنید.

1.add_action ('plugins_loaded', 'plugin_start');
2.
3.function plugin_start() {
4. if ( is_admin() ) { } else {
5. wp_enqueue_script ("jquery");
6. require_once (dirname (__FILE__) . "/functions.php");
7. }
8.}
برای مثال در تکه کد بالا مشاهده میکنید که یک تابع با نام plugin_start نوشته شده است، سپس توسط تابع add_action در زمان plugins_loaded فراخوانی شده است، در این صورت تابع plugin_start در زمانی که افزونه‌ها بطور کامل بارگذاری شده‌اند اجرا میشود و کتابخانه جاوا اسکریپت jQuery موجود در هسته وردپرس و فایل functions.php موجود در پوشه افزونه را فراخوانی میکند.

یا برای مثال میتوانید تابعی به اسم email_friends بنویسید و آن را در زمان publish_post فراخوانی کنید، در این صورت زمانی که پست شما منتشر میشود تابع email_friends اجرا میشود و آن را برای تمام دوستان شما ارسال میکند.

میتوانید لیستی از hookهایی که میتوانید در آنها از تابع add_action استفاده کنید را در این صفحه (http://codex.wordpress.org/Plugin_API/Action_Reference) ببینید.
__________________________________________________ __
Filters
فیلترها نیز مانند actionها کار میکنند، فقط باید یک تابع بنویسید و آن را به زمانی که میخواهید اجرا شود به وسیله تابع add_filter اختصاص دهید.

1.add_filter('comment_text','filter_profanity');
2.
3.function filter_profanity($content) {
4. global $profanities;
5. $content=str_ireplace($profanities,'{censored}',$c ontent);
6. return $content;
7.}
برای مثال در کد بالا تابع filter_profanity نوشته شده و یک ورودی content میگیرد و با متغییر profanities از قبل تعریف شده مقایسه میکند و اگر کلمه‌ای متشابه داشته باشد آن را با {censored} جایگزین میکند، این تابع به comment_text اختصاص داده شده و به این ترتیب متن دیدگاه‌هارا بررسی میکند اگر در آن ناسزا بکار برده شده باشد آن را سانسور میکند.

میتوانید لیستی از hookهایی که میتوانید در آنها از تابع add_filter استفاده کنید را در این صفحه (http://codex.wordpress.org/Plugin_API/Filter_Reference) ببینید.
__________________________________________________ __
نمونه
در آخر افزونه myPlugin را این صورت کامل میکنیم:

01.<?php
02./*
03.Plugin Name: myPlugin
04.Plugin URI: http://www.radikal2.com/
05.Description: it is my first wordpress plugin
06.Version: 1.0
07.Author: Radikal2
08.Author URI: http://www.radikal2.com
09.*/
10.
11.add_action ('publish_post', 'myPlugin_email');
12.add_filter ('the_title', 'myPlugin_title');
13.
14.function myPlugin_email($post_ID) {
15. $mails = 'you-name@your-domain.com,you-name@your-domain.com,you-name@your-domain.com,';
16. mail($mails, "My Blog Updated!",
17. 'I just put something on my blog: http://blog.example.com');
18. return $post_ID;
19.}
20.
21.function myPlugin_title($t) {
22. $x = '<span style="text-shadow: 0px 0px 16px blue;">' .$t. '</span>';
23. return $x;
24.}
25.
26.?>
مشاهده میکنیم که در این کد از دو تابع add_action برای فراخوانی تابع myPlugin_email برای ارسال یک ایمیل برای تعدادی از دوستان بعد از انتشار پست و add_filter برای اضافه کردن افکت سایه به کمک یک کد CSS به تیتر مطالب استفاده شده است.
منابع: Writing a Plugin (http://codex.wordpress.org/Writing_a_Plugin) / Plugin API (http://codex.wordpress.org/Plugin_API)
خدایی نامردیه یه تشکر نزدنید کلی وقت کشید تا منتاژ کردمش:-s(:|

afrateam
February 5th, 2010, 22:56
ایول.. عالی بود


منبع: چگونه یک افزونه برای وردپرس بنویسیم / رادیکال دو (http://www.radikal2.com/1388/08/how-to-write-a-wordpress-plugin/)

hadiaj168
June 13th, 2011, 23:48
سلام
در ابتدا از دوست عزیز Am!r (http://www.webhostingtalk.ir/member/1048/) برای این مطلبشون بسیار سپاسگذارم، فکر میکنم این تنها مطلب درمورد نوشتن افزونه برای وردپرس به زبان فارسی بود که من پیدا کردم بازم ممنون...:-*
حالا با اجازتون میخوایم یه مقدار جلوتر بریم و افزونه ای رو به عنوان نمونه بسازیم که با دیتابیس کار کنه و به عنوان یک ابزارک ازش استفاده کنیم.
افزونه آمار چطوره؟
عالیه!(دموکراسی رو حال کردید!)
برای این کار اولین چیزی که نیاز داریم یه جدوله (https://codex.wordpress.org/Creating_Tables_with_Plugins).

فیلد های جدول:
id : یک ایندکس برای جدول.
year و month و day : سال ،ماه و روز بازدید.
url : آدرسی که بازدید کننده از طریق اون وارد سایت ما شده.
IP : ip بازدیدکننده.
time : زمان بازدید به صورت تایم استمپ (این به درد زمانی میخوره که بخایم آمار افراد آنلاین رو بدست بیاریم).
shows : تعداد بازدید های یک ip در یک روز.
browser : مرورگر و سیستم عامل بازدیدکننده.

ما جدول رو به صورت زیر ایجاد میکنیم:


register_activation_hook( __FILE__, 'myplugin_activate' );


function myplugin_activate(){
global $wpdb;

// what is prefix table in your WP database ?
$table_name = $wpdb->prefix . "hadistat";

// a simple SQL
$sql = "CREATE TABLE " . $table_name . " (
id int(11) NOT NULL AUTO_INCREMENT,
year int(4) NOT NULL,
month int(2) NOT NULL,
day int(2) NOT NULL,
url VARCHAR(55) DEFAULT '' NOT NULL,
ip VARCHAR(20) DEFAULT '' NOT NULL,
time int(11) NOT NULL,
shows int(5) DEFAULT 1 NOT NULL,
browser VARCHAR(20) DEFAULT '' NOT NULL,
UNIQUE KEY id (id)
);";


// we need it , follow us!
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

// this funiction is in upgrade.php , it's creat your table
dbDelta($sql);
}
register_activation_hook این تایع رو دوست عزیزمون در بالا توضیح دادند!
wpdb (https://codex.wordpress.org/Class_Reference/wpdb) کلاسی برای کار با دیتابیس در وردپرس.این کلاس رو باید به صورت یک متغیر گلوبال استفاده کنید.
$wpdb->prefix پیشوند جداولی که در دیتابیس شما ساخته شده است
خب خط بعدی که مشخصه یک کویری ساده برای ساخت جدول.
حالا برای ساختن جدولمون نیاز به تابع ()dbDelta داریم که در فایل upgrade.php موجوده ،پس اول فایل مورد نظر رو اینکلود میکنیم وبعد تابع رو بکار میبریم.البته تابع ()dbDelta یک سری قوانین خاص داره که می تونید اینجا (https://codex.wordpress.org/Creating_Tables_with_Plugins) ببینید.
خب این از اولین مرحله.

حالا جدول برای وارد کردن آمار بازدیدکننده ها آمادست:

add_action('shutdown', 'hadistat_page_load');

function hadistat_page_load(){
global $wpdb;

// time and date
$today = getdate();
$year = $today['year'];
$month = $today['mon'];
$day = $today['mday'];

// user information
$ip = @$_SERVER['REMOTE_ADDR'];
$now = time();
$url = @$_SERVER['HTTP_REFERER'];
$browser = @$_SERVER['HTTP_USER_AGENT'];

// exist IP today ?
$id = $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->prefix}hadistat where
ip='$ip' AND year=$year AND month=$month AND day=$day ;" ));بازدید صفحه یعنی یه رویداد خاص! پس باید از اکشن استفاده کنیم اما خودم هم نمیدونم دقیقا در چه زمانی بهتره،من گذاشتم روی shutdown (اینجا (https://codex.wordpress.org/Plugin_API/Action_Reference) میتونید لیستی از وقایع رو ببینید).
وقتی سایت مشاهده میشه ما یک سری از مشخصات فرد بازدید کننده و شرایط زمانی (و آب و هوایی!) رو ذخیره میکنیم. توابع getdate , $_SERVER['REMOTE_ADDR'] , time() , $_SERVER['HTTP_REFERER'] $_SERVER['HTTP_USER_AGENT'] که معرف حضور هستند؟
اگر هم نیستند می‌بینید که با یه نگاه به کد خودشون رو معرفی میکنند!
قبل از اینکه اطلاعاتی رو که داخل متغیر ها ذخیره کردیم وارد جدول کنیم باید چک کنیم که آیا همچین IP امروز به سایت سرزده یا نه اگه سرنزده اطلاعات رو وارد میکنیم:

// it's not, then insert it.
if($id==null){
$rows_affected = $wpdb->insert( $wpdb->prefix.'hadistat', array( 'year' => $year,
'month' => $month, 'day' => $day, 'url' => $url,
'ip' => $ip, 'time' => $now, 'shows' => 1,'url' => $url, 'browser' => $browser));
}اگر IP تکراریه time رو بروز رسانی میکنیم و به Show یکی اضافه میکنیم.

// it's exist then update Time and increas Shows
else
$wpdb->query("UPDATE {$wpdb->prefix}hadistat SET shows = shows+1, time = $now WHERE id = $id ");خب فعلا تا همینجا کافیه انشاالله تو پست بعدی یک ابزارک هم اضافه می‌کنیم.

hadiaj168
June 19th, 2011, 21:24
خب حالا زمان اضافه کردن ابزارکیه که وعدشو داده بودیم.
برای ساختن یک ابزارک از کلاس WP_Widget استفاده میکنیم، این کلاس در فایل WP_Widget.php در پوشه wp_include قرار داره.
به گفته خود کلاس WP_Widget هر ابزارکی که می خوایم بسازیم باید WP_Widget رو گسترش بدیم یعنی باید کلاسی رو تعریف کنیم که از WP_Widget مشتق شده باشه (البته این طور که من فهمیدم،اگه جایی اشتباه میگم دوستان تصحیح کنند).
خب ما کلاس hadistat_WP_Widget رو که از WP_Widget مشتق شده رو میسازیم:

// New Style widgets
class hadistat_WP_Widget extends WP_Widget {

function hadistat_WP_Widget() {
$this->__construct('wp_hadistat', 'آمار', array('description' => 'یک آمار گیر کوچک برای وبسایت شما!' ));
}
ابتدا سازنده کلاس که باید همنام کلاس باشه برای تعیین مقادیر اولیه ای که نیاز داریم ،با استفاده از تابع construct__ که در کلاس WP_Widget تعریف شده.

تابع __construct چند پارامتر دارد که تعیین دو تاشون الزامیه:

$id_base : یک نام منحصر به فرد برای ابزارک (اگه مشخصش نکنید به صورت خودکار قسمتی از نام کلاستون به عنوان id_base انتخاب میشه).
$name : نامی که در قسمت مدیریت ابزارک مشاهده می کنید.
برای توضیحات بیشتر به فایل WP_Widget.php مراجعه کنید.

برای نمایش تنظیمات ابزارک تابع form رو ایجاد می‌کنیم و تنظیمات مورد نظر رو با یک آرایه تعریف میکنیم:


// Widget Form in admin page
function form( $instance ) {
/* Set up some default widget settings. */
$instance = wp_parse_args( (array) $instance, array( 'online' => true , 'title'=> 'آمار', 'today' => true, 'month' => true ) );
$title = esc_attr($instance['title']);
?>
در هنگام مقدار دهی به این آرایه (در اینجا instance) حتما از تابع wp_parse_args (https://codex.wordpress.org/Function_Reference/wp_parse_args) استفاده کنید ،این تابع دو آرایه دریافتی رو با هم ترکیب میکنه اگر این کار رو نکنید زمانی که مقدار متغیر رو در قسمت مدیریت ابزارک تغییر بدید و برروی ذخیره کلیک کنید مشاهده میکنید که تنظیمات مورد نظر تغییر نمیکنند چون وردپرس برای نمایش تنظیمات یک ابزارک از تابع form استفاده میکنه ولی و قتی تغییرات باتابع update انجام میشه با توجه به اینکه در هنگام فراخوانی تابع form مقادیر متغیر دوباره جاگذاری میشن تغییر ایجاد شده اعمال نمیشن.
در خط بعدی تابع esc_attr (https://codex.wordpress.org/Function_Reference/esc_attr) مقدار title رو میگیره و مقادیر < > & " ' رو برای نمایش در صفحه وب اینکد میکنه.

خب حالا زمان استفاده از یک مقدار html:


<p>
<label> عنوان:
<input id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title');?>" type="text" class="widefat" value="<?php echo $title; ?>" />
</label>
</p>

<p>
<label >
<input id="<?php echo $this->get_field_id('online'); ?>" name="<?php echo $this->get_field_name('online'); ?>" type="checkbox" value="1" <?php checked(true , $instance['online']); ?> /> <?php echo 'آنلاین'; ?>
</label>
</p>

<p>
<label >
<input id="<?php echo $this->get_field_id('today'); ?>" name="<?php echo $this->get_field_name('today'); ?>" type="checkbox" value="1" <?php checked(true , $instance['today']); ?> /> <?php echo 'بازدید امروز'; ?>
</label>
</p>

<p>
<label >
<input id="<?php echo $this->get_field_id('month'); ?>" name="<?php echo $this->get_field_name('month'); ?>" type="checkbox" value="1" <?php checked(true , $instance['month']); ?> /> <?php echo 'بازدید این ماه'; ?>
</label>
</p>

<?php
}
توابع get_field_name و get_field_id که از اسمشون پیداست چیکار میکنن! و حتما هم باید استفاده بشن به این دلیل:

This function should be used in form() methods to create (name,id) attributes for fields to be saved by update()


تابع checked (https://codex.wordpress.org/Function_Reference/checked) دو مقدار رو میگیره و اگر هر دو یکسان بودند مقدار "checked="checked رو برگشت میده.

خب این از تابع form ،حالا ابزارک ما در قسمت مدیریت با تمامی تنظیماتش نمایش داده میشه اما با تغییر تنظیمات و کلیک بر روی دکمه ذخیره تغییری ایجاد نمیشه برای ذخیره تغییرات نیاز به تابع update داریم:

function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['online']= (bool) $new_instance['online'];
$instance['today']= (bool) $new_instance['today'];
$instance['month']= (bool) $new_instance['month'];
$instance['title']= strip_tags($new_instance['title']);
return $instance;
}حالا زمان نمایش ابزارک در صفحه سایته برای این کار تابع widget رو ایجاد میکنیم.
البته ما در تابع widget یک تابع دیگر رو خارج از کلاس فراخوانی کردیم ولی فرقی هم نمیکنه میتونستیم این کار رو هم نکنیم!


// Echo the widget content.
function widget($args, $instance) {
show_widget_hadistat($args,$instance);
}

}// end class

// show the widgen ad sidebar
function show_widget_hadistat($args,$instance) {
global $wpdb;

// extract $args to variables : before_widget ,after_widget, before_title & ...
extract($args);
$title = esc_attr($instance['title']);

$now = time();
// time and date
$today = getdate();
$year = $today['year'];
$month = $today['mon'];
$day = $today['mday'];

if($instance['online']){
$anline_query = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}hadistat where time>$now-300 "));
$anline = $wpdb->num_rows;
}

if($instance['today']){
$today_shows = $wpdb->get_var($wpdb->prepare("SELECT SUM(shows) FROM {$wpdb->prefix}hadistat where year=$year AND month=$month AND day=$day ;" ));
}

if($instance['month']){
$month_shows = $wpdb->get_var($wpdb->prepare("SELECT SUM(shows) FROM {$wpdb->prefix}hadistat where year=$year AND month=$month ;" ));
}

echo $before_widget . $before_title .$title. $after_title;
echo '<ul class="wrap">';
if($instance['online']) echo "<li>تعداد افراد آنلاین : $anline</li>";
if($instance['today']) echo "<li> بازدید امروز : $today_shows</li>";
if($instance['month']) echo "<li> بازدید این ماه : $month_shows</li>";
echo '</ul>';
echo $after_widget;
}
args آرایه‌ای شامل عناصر before_title, after_title, before_widget, and after_widget که به صورت خودکار تعریف میشن و $instance که تنطیماتیه که خودمون ایجاد کردیم.
تابع extract که یک تابع تعریف شده در php است آرایه‌ای رو میگیره و به متغیرهای متناسب با اون آرایه تجزیه میکنه با این کار ما میتونیم از مقادیر before_title, after_title, before_widget, and after_widget در مکان مناسب خودشون استفاده کنیم.
باقی کد هم مقداری کویریه برای بدست آوردن تعداد افراد آنلاین ،بازدید امروز و بازدید این ماه.
در پایان add_action و register_widget یادتون نره.

add_action('init', 'hadistat_WP_Widget_init', 1);

function hadistat_WP_Widget_init() {
register_widget('hadistat_WP_Widget');
}فقط یک نکته: یادتونه تو پست قبلی زمان اکشن قبلی رو گذاشتیم روی shutdown ؟

باید اون رو به :

add_action('init', 'hadistat_page_load', 0);تغییر بدید. مقدار 0 باعث میشه تابع بروزرسانی جدول زودتر از نمایش افزونه در سایت اجرا بشه در غیر این صورت تعداد افراد آنلاین درست نشون داده نمیشه.


انشاالله در ادامه صفحه‌ای در مدیریت برای گزارش گیری و مقایشه آمارها میسازیم....

افزونه رو به صورت کامل پیوست کردم با یک سری تغییرات کوچیک تو نام توابع متناسب با عملشون.:103: