• 4880 fans
  • 1036 reader
  • 123 followers

Chào các thành viên Izwebz, mình là tanlevis(nickname). Nay mình muốn chia sẻ một chút kiến thức về WP. Bài này mình sẽ nói về cách tự tạo một Widget cho Theme. Cụ thể là mình sẽ làm 1 widget để thể hiện trạng thái nick yahoo đang online hay offline.

custom Widget wordpress

Widget(wg – gọi tắt thế đi nha :D gõ lại làm biếng quá :| ) trong WP luôn được chứa bởi sidebar. Mọi wg luôn được kế thừa từ lớp cha – WP_Widget. Vì vậy muốn có 1 wg mới ta phải tạo 1 class mới kế thừa WP_Widget như sau:

Mở file function.php trong thư mục theme mà bạn đang dung. Thêm vào những dòng code sau:

<?php
/*
 * Tạo Yahoo status widget
 * */
class Yahoo_Status extends WP_Widget {

	//Khởi tạo contructor của 1 lớp
	function Yahoo_Status(){
		parent::WP_Widget('Yahoo_Status_Widget', 
			'Yahoo Status', 
			array('description' => 'Trạng thái nick yahoo.'));
	}

Hàm Yahoo_Status ở dòng 614 là 1 constructor của class Yahoo_Status, trong hàm này ta tiến hành khởi tạo những thông số cơ bản cho Yahoo_Status bằng cách gọi ngược lên constructor của cha nó (WP_Widget) với những thông số truyền vào như sau:

$id_base: ‘Yahoo_Status_Widget’ – Id để xác định .
$name: ‘Yahoo Status’ – Tên wg.
$widget_options = array(‘description’ => ‘Trạng thái nick yahoo.’) – Thông tin tóm tắt của wg.

Kế tiếp chúng ta bắt buộc phải overrides 3 phương thức của lớp cha (WP_Widget) để hiển thị, cập nhật được wg của chúng ta.
Để hiển thị được wg lên sidebar trong Admin Panel, ta phải định nghĩa cho wg một bộ khung được quy định sẵn của WP như sau:

function widget( $args, $instance ) {
		extract($args);
		$title = apply_filters( 'widget_title', 
			empty($instance['title']) ? '' : $instance['title'], 
			$instance, $this->id_base);
		$text = apply_filters( 'widget_text', 
			$instance['text'], $instance );
		echo $before_widget;
		if ( !empty( $title ) ) { 
			echo $before_title . $title . $after_title; } ?>			
			<ul class="nick_status">
			<?php $str = explode(",", $text);				
				foreach ($str as $s) : ?>
				  <li>
				  	<a href="ymsgr:sendIM?<?php echo trim($s);?>">
						<img border="0" src="http://presence.msg.yahoo.com/online?u=<?php echo trim($s);?>&m=g&t=1&l=us">
					</a>
				  </li>
			<?php endforeach;						
			?>
			</ul>			
		<?php
		echo $after_widget;
	}

Tham số cụ thể như sau:
$args: Mảng thông số dùng để hiển thị như: before_title, after_title, before_widget, and after_widget.
$instance: Những thực bên trong cấu hình nên wg như textbox, label, radio, checkbox… vd: $instance[‘title’]: lấy thực thể có ID là title.

Dòng 630 – 642 mình dùng chuỗi text nhập vào từ textarea được ngăn cách bởi dấu “,” . Sau đó tách chuỗi ra thành từng phần tử của một mảng string bằng hàm explode(“,”, $text), sau đó dùng link tới yahoo server để nhận về trạng thái online hay offline.
Tiếp theo để cập nhật được thông tin của wg ta phải overrides phương thức update như sau:

	function update( $new_instance, $old_instance ) {
		$instance = $old_instance;
		$instance['title'] = strip_tags($new_instance['title']);
		if ( current_user_can('unfiltered_html') )
			$instance['text'] =  $new_instance['text'];
		else
			$instance['text'] = stripslashes( 
				wp_filter_post_kses( addslashes($new_instance['text']) ) 
			);		
		return $instance;
	}

Tham số cụ thể như sau:
$new_instance: Những thông tin mới từ người dung nhập vào những fied có trên wg.
$old_instance: Những thông tin hiện tại wg đang lưu.
Phương thức cuối cùng là form: hiển thị những thông tin nhập vào.

function form( $instance ) {
		$instance = wp_parse_args( (array) $instance, 
			array( 'title' => '', 'text' => '' ) );
		$title = strip_tags($instance['title']);
		$text = format_to_edit($instance['text']);
?>
		<p>
			<label for="<?php echo $this->get_field_id('title'); ?>">
				<?php _e('Tiêu đề:'); ?> </label>
			<input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" 
				name="<?php echo $this->get_field_name('title'); ?>" type="text" 
				value="<?php echo  esc_attr($title);?>" />
		</p>
			<label for="<?php echo $this->get_field_id('text'); ?>">
				<?php _e('Nick yahoo(cách nhau bởi dấu \'):'); ?> </label>
			<textarea class="widefat" rows="5" cols="10" 
				id="<?php echo $this->get_field_id('text'); ?>" 
				name="<?php echo $this->get_field_name('text'); ?>">
					<?php echo $text;?>
			</textarea>
		<p>
			<label for="<?php echo $this->get_field_id('text'); ?>">
				<?php _e('Ví dụ: tanvannguyen18, meocon17'); ?>
			</label>			
		</p>
<?php
	}
}
    
register_widget('Yahoo_Status');
?>

Tham số cụ thể như sau:
$instance: Những fied có trên wg.
Bài này mình chỉ tạo đơn giản có 3 label, 1 input và 1 textarea, cách gán id và value mình đã minh họa cụ thể trong hình. Có j không hiểu mọi người cứ comment bên dưới nha.

Cuối cùng ta xài lệnh register_widget(‘Yahoo_Status’); ngay bên dưới dấu kết thúc class Yahoo_Status để đăng ký với WP là ta có 1 wg mới, và vào lại Admin Panel để xem widget ta mới tạo.

Tới đây mình vừa hoàn thành 1 wg Yahoo_Status. Đây cũng là bài post đầu tiên của mình cho Izwebz, có gì mọi người đóng góp ý kiến để mình hoàn thiện hơn về những bài post sau. Cảm ơn mọi người đã đọc và chúc mọi người vui vẻ với Widget của mình.

Download file

Download file mẫu functions.php ở đây

Tham gia viết bài cho Izwebz

Đây là bài viết đầu tiên của Tanlevis cho izwebz. Rất cảm ơn sự đóng góp của bạn. Nếu bạn có khả năng, hãy cùng tham gia viết bài để chia sẻ kiến thức với cộng đồng.

Demon Warlock Website facebook twitter user_email

Tôi được sinh ra ở Việt Nam, nhưng hiện tại đang sống và làm việc tại Mỹ. Ngành tôi học không có liên quan gì đến thiết kế web. Nhưng đây là sở thích từ ngày còn là sinh viên du học, do vậy bây giờ dù cho đang đi làm nhưng tôi vẫn thích dùng thời gian rảnh rỗi của mình để học về thiết kế web. Như các bạn, tôi cũng việc mày mò tự học và khám phá.

  • http://galleryviet.net mr.law

    chào bạn tanlevis. mình đã đọc bài viết của bạn, và làm theo hướng dẫn để tạo một widget các bài viết random trên sidebar. nó đã chạy được nhưng chỉ dính một lỗi đó là khi mình post bài, hoặc chỉnh sửa thì bấm update bài viết nó bị lỗi trắng xóa khung post bài. chứ không về như định dạng ban đầu.
    mong bạn giải thích và sửa lỗi giúp mình. cảm ơn bạn

  • newbie

    Cho mình hỏi, nếu như mình muốn thêm text vào kế bên nút trạng thái của yahoo thì làm thế nào? VD như: Mr, abc, Ms, cde, v.v…

  • hoadai

    Chà chà. Hay lắm anh ah. Nhưng mà làm thế nào để người ta ẩn nick mà không báo là offline? em thử ẩn nick thì trên trang hiện là offline. hihi.

  • Daniel

    Bạn ơi nếu tớ muốn cho tên của người hỗ trợ chat vào thì làm sao (Ví dụ: Mr Lộc, Ms Hương…)

    • http://www.izwebz.com tanlevis

      U có thể dùng text widget của wp, paste mã html vào rồi style css thôi. Đó là cách đơn giản nhất, còn làm theo hướng dẫn của bài viết này thì phải thêm một số code + giải thuật vào thì mới như U muốn dc.

    • http://mamloving.com brian

      câu hỏi này admin cũng bó tay luôn rồi hả?
      Bác chặt chém admin quá…………..

  • programmer

    Cho mình hỏi chút :
    Mình mới vào nghề , giữa việc chọn Joomla , Drupall , WordPress nên chọn cái gì vậy ?

    • tanlevis

      @programmer: 1 phiếu cho WP. WP hay lắm, tìm hiểu thú vị lắm :D

    • http://mamloving.com brian

      Cho WP 1đ, mình thấy WordPress dễ sử dụng hơn…còn joomla thì nhìn vào nó như 1 đóng rác

      • http://congthao.com Cong Thao

        bạn này nói kì ghê. Mỗi CMS có một điểm mạnh riêng mà. Ko thì làm sao có thể phát triển đc như vậy

  • chicken dance

    Tai sao khong vao default-widgets.php mà viết , ai lại đi viết trong function.php

    • http://www.izwebz.com Demon Warlock

      Viết trong functions.php là chỉ để riêng cho theme đó mà không ảnh hưởng đến mã nguồn của WP.

  • Mưa tháng 7

    cảm ơn bạn nhiều

  • LaCrus

    mình mới demo trang bán hàng online http://pinkhouseshop.tk/ , bạn nào vào cho ý kiến giúp mình với. Thanks so much !!

  • http://www.smsbongda.com TipBongDa

    Mấy bạn nào muốn tạo website như ictexpress.com, thì vào trang Hutek.Info mà down nha! Theme Vpress1.0 đó. Làm 1 trang tin tức như Vnexpress.net. Mình cài rồi chạy tốt lắm.

  • đoàn

    bác dw bao h mới tái suất giang hồ đây

  • Nhan Pham

    @tanlevis: bạn dùng jquery lazyload đó

  • http://ebook24h.co.cc Phùng Anh Tú

    Cái load ảnh đó là 1 plug-in của jQuery có tên LazyLoad. Bạn lên google tìm là ra ngay. :D
    http://www.appelsiini.net/projects/lazyload

  • http://valentineyogurt.com tanlevis

    @Nguyễn Ngọc Long : website U làm hả, đẹp quá, có cái trò kéo chuột tới đâu nó load ảnh tới đó ấy. Mình hẻm biết zụ này, chỉ mình với dc hem :D

  • http://ictexpress.com Nguyễn Ngọc Long

    Bài này hay nhỉ vậy anh. Quá hay em đang rất cần này làm cho trang ictexpress.com và các trang khách của em

  • EDGE

    cám ơn bạn.bài viết hay lắm

Izwebz store
Izwebz store

Các series nên xem trên izwebz cho newbie

Khi vào izwebz chắc nhiều bạn cho rằng các bài viết trên izwebz đều không có hệ thống gì cả? Thực chất, các bài biết đều đi theo một series của riêng nó, ví dụ như PHP, HTML & CSS, PSD2HTML, Photoshop, illustrator,… Trong bài viết này, mình sẽ tổng hợp lại các series bài viết cần thiết cho một newbie.

Izwebz facebook group

Social connect

Recent Comments

Archives