ایول.. عالی بود
منبع: چگونه یک افزونه برای وردپرس بنویسیم / رادیکال دو
ایول.. عالی بود
منبع: چگونه یک افزونه برای وردپرس بنویسیم / رادیکال دو
سلام
در ابتدا از دوست عزیز Am!r برای این مطلبشون بسیار سپاسگذارم، فکر میکنم این تنها مطلب درمورد نوشتن افزونه برای وردپرس به زبان فارسی بود که من پیدا کردم بازم ممنون...
حالا با اجازتون میخوایم یه مقدار جلوتر بریم و افزونه ای رو به عنوان نمونه بسازیم که با دیتابیس کار کنه و به عنوان یک ابزارک ازش استفاده کنیم.
افزونه آمار چطوره؟
عالیه!(دموکراسی رو حال کردید!)
برای این کار اولین چیزی که نیاز داریم یه جدوله.
فیلد های جدول:
id : یک ایندکس برای جدول.
year و month و day : سال ،ماه و روز بازدید.
url : آدرسی که بازدید کننده از طریق اون وارد سایت ما شده.
IP : ip بازدیدکننده.
time : زمان بازدید به صورت تایم استمپ (این به درد زمانی میخوره که بخایم آمار افراد آنلاین رو بدست بیاریم).
shows : تعداد بازدید های یک ip در یک روز.
browser : مرورگر و سیستم عامل بازدیدکننده.
ما جدول رو به صورت زیر ایجاد میکنیم:
register_activation_hook این تایع رو دوست عزیزمون در بالا توضیح دادند!کد PHP:
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);
}
wpdb کلاسی برای کار با دیتابیس در وردپرس.این کلاس رو باید به صورت یک متغیر گلوبال استفاده کنید.
$wpdb->prefix پیشوند جداولی که در دیتابیس شما ساخته شده است
خب خط بعدی که مشخصه یک کویری ساده برای ساخت جدول.
حالا برای ساختن جدولمون نیاز به تابع ()dbDelta داریم که در فایل upgrade.php موجوده ،پس اول فایل مورد نظر رو اینکلود میکنیم وبعد تابع رو بکار میبریم.البته تابع ()dbDelta یک سری قوانین خاص داره که می تونید اینجا ببینید.
خب این از اولین مرحله.
حالا جدول برای وارد کردن آمار بازدیدکننده ها آمادست:
بازدید صفحه یعنی یه رویداد خاص! پس باید از اکشن استفاده کنیم اما خودم هم نمیدونم دقیقا در چه زمانی بهتره،من گذاشتم روی shutdown (اینجا میتونید لیستی از وقایع رو ببینید).کد PHP:
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 ;" ));
وقتی سایت مشاهده میشه ما یک سری از مشخصات فرد بازدید کننده و شرایط زمانی (و آب و هوایی!) رو ذخیره میکنیم. توابع getdate , $_SERVER['REMOTE_ADDR'] , time() , $_SERVER['HTTP_REFERER'] $_SERVER['HTTP_USER_AGENT'] که معرف حضور هستند؟
اگر هم نیستند میبینید که با یه نگاه به کد خودشون رو معرفی میکنند!
قبل از اینکه اطلاعاتی رو که داخل متغیر ها ذخیره کردیم وارد جدول کنیم باید چک کنیم که آیا همچین IP امروز به سایت سرزده یا نه اگه سرنزده اطلاعات رو وارد میکنیم:
اگر IP تکراریه time رو بروز رسانی میکنیم و به Show یکی اضافه میکنیم.کد PHP:
// 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));
}
خب فعلا تا همینجا کافیه انشاالله تو پست بعدی یک ابزارک هم اضافه میکنیم.کد PHP:
// 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 در ساعت 20:13 دلیل: سوتی!
خب حالا زمان اضافه کردن ابزارکیه که وعدشو داده بودیم.ابتدا سازنده کلاس که باید همنام کلاس باشه برای تعیین مقادیر اولیه ای که نیاز داریم ،با استفاده از تابع construct__ که در کلاس WP_Widget تعریف شده.
برای ساختن یک ابزارک از کلاس WP_Widget استفاده میکنیم، این کلاس در فایل WP_Widget.php در پوشه wp_include قرار داره.
به گفته خود کلاس WP_Widget هر ابزارکی که می خوایم بسازیم باید WP_Widget رو گسترش بدیم یعنی باید کلاسی رو تعریف کنیم که از WP_Widget مشتق شده باشه (البته این طور که من فهمیدم،اگه جایی اشتباه میگم دوستان تصحیح کنند).
خب ما کلاس hadistat_WP_Widget رو که از WP_Widget مشتق شده رو میسازیم:
کد PHP:
// New Style widgets
class hadistat_WP_Widget extends WP_Widget {
function hadistat_WP_Widget() {
$this->__construct('wp_hadistat', 'آمار', array('description' => 'یک آمار گیر کوچک برای وبسایت شما!' ));
}
تابع __construct چند پارامتر دارد که تعیین دو تاشون الزامیه:
$id_base : یک نام منحصر به فرد برای ابزارک (اگه مشخصش نکنید به صورت خودکار قسمتی از نام کلاستون به عنوان id_base انتخاب میشه).
$name : نامی که در قسمت مدیریت ابزارک مشاهده می کنید.
برای توضیحات بیشتر به فایل WP_Widget.php مراجعه کنید.
برای نمایش تنظیمات ابزارک تابع form رو ایجاد میکنیم و تنظیمات مورد نظر رو با یک آرایه تعریف میکنیم:
کد PHP:
// 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 استفاده کنید ،این تابع دو آرایه دریافتی رو با هم ترکیب میکنه اگر این کار رو نکنید زمانی که مقدار متغیر رو در قسمت مدیریت ابزارک تغییر بدید و برروی ذخیره کلیک کنید مشاهده میکنید که تنظیمات مورد نظر تغییر نمیکنند چون وردپرس برای نمایش تنظیمات یک ابزارک از تابع form استفاده میکنه ولی و قتی تغییرات باتابع update انجام میشه با توجه به اینکه در هنگام فراخوانی تابع form مقادیر متغیر دوباره جاگذاری میشن تغییر ایجاد شده اعمال نمیشن.
در خط بعدی تابع esc_attr مقدار title رو میگیره و مقادیر < > & " ' رو برای نمایش در صفحه وب اینکد میکنه.
خب حالا زمان استفاده از یک مقدار html:
توابع get_field_name و get_field_id که از اسمشون پیداست چیکار میکنن! و حتما هم باید استفاده بشن به این دلیل:کد PHP:
<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
}
This function should be used in form() methods to create (name,id) attributes for fields to be saved by update()
تابع checked دو مقدار رو میگیره و اگر هر دو یکسان بودند مقدار "checked="checked رو برگشت میده.
خب این از تابع form ،حالا ابزارک ما در قسمت مدیریت با تمامی تنظیماتش نمایش داده میشه اما با تغییر تنظیمات و کلیک بر روی دکمه ذخیره تغییری ایجاد نمیشه برای ذخیره تغییرات نیاز به تابع update داریم:
حالا زمان نمایش ابزارک در صفحه سایته برای این کار تابع widget رو ایجاد میکنیم.کد PHP:
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 یک تابع دیگر رو خارج از کلاس فراخوانی کردیم ولی فرقی هم نمیکنه میتونستیم این کار رو هم نکنیم!
args آرایهای شامل عناصر before_title, after_title, before_widget, and after_widget که به صورت خودکار تعریف میشن و $instance که تنطیماتیه که خودمون ایجاد کردیم.کد PHP:
// 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;
}
تابع extract که یک تابع تعریف شده در php است آرایهای رو میگیره و به متغیرهای متناسب با اون آرایه تجزیه میکنه با این کار ما میتونیم از مقادیر before_title, after_title, before_widget, and after_widget در مکان مناسب خودشون استفاده کنیم.
باقی کد هم مقداری کویریه برای بدست آوردن تعداد افراد آنلاین ،بازدید امروز و بازدید این ماه.
در پایان add_action و register_widget یادتون نره.
فقط یک نکته: یادتونه تو پست قبلی زمان اکشن قبلی رو گذاشتیم روی shutdown ؟کد PHP:
add_action('init', 'hadistat_WP_Widget_init', 1);
function hadistat_WP_Widget_init() {
register_widget('hadistat_WP_Widget');
}
باید اون رو به :
تغییر بدید. مقدار 0 باعث میشه تابع بروزرسانی جدول زودتر از نمایش افزونه در سایت اجرا بشه در غیر این صورت تعداد افراد آنلاین درست نشون داده نمیشه.کد PHP:
add_action('init', 'hadistat_page_load', 0);
انشاالله در ادامه صفحهای در مدیریت برای گزارش گیری و مقایشه آمارها میسازیم....
افزونه رو به صورت کامل پیوست کردم با یک سری تغییرات کوچیک تو نام توابع متناسب با عملشون.
ویرایش توسط hadiaj168 : June 19th, 2011 در ساعت 21:32
در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)