برنامه نویسی در وردپرس با استفاده از کلاس های معرفی گردیده ، کار را بسیار آسان می نماید. افزونه نویس ها استفاده از کلاس های مربوطه و کدهای وردپرس را به خوبی استفاده می نمایند که آموزش استفاده از کلاس wp_list_table وردپرس به شما کمک می نماید که همانند قسمت “نوشته ها” یا “محصولات” در مدیریت وردپرس ایجاد کنید. درون این قسمت ها جدول هایی هستند که اطلاعات را از جدول فراخوانی و به کاربر نمایش میدهند. شما نیز قادرید در افزونه خود قسمت مدیریت آن از هر جدولی که دوست دارید یا اینکه اطلاعات خاص خود را به سبک وردپرس به راحتی نمایش دهید. کلاس WP List Table وردپرس کاربرد های بسیاری برای افراد فعال در این عرصه دارد.

Class WP List Table موجب میگردد که جدول هایی همانند نوشته ها درون منو خاص خود ایجاد کنید.

کلاس WP_List_Table ورپرس

اگه به قسمت همه نوشته ها بروید. مشاهده می کنید که تمام نوشته های شما مرتب با گزینه ویرایش ، حذف ، ویرایش سریع و تعداد ستون دیگر قابل نمایش است.

شما نیز قادرید در یک منو شخصی درون مدیریت وردپرس شبیه به نوشته یا محصولات ، یک جدول ایجاد کنید. البته و مسلما که نیاز دارید تا اطلاعات خاص شما درون آنان به نمایش در بیاید. در نظر بگیرید که ویژگی های این قسمت بسیار بالاست.

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

ویژگی های wp list table وردپرس

  • قابلیت تنظیم تعداد نمایش در هر صفحه
  • نمایش یا پنهان ستون ها در قسمت تنظیمات
  • حذف و ویرایش دسته جمعی
  • قابلیت تیک زنی محصولات
  • دسترسی سریع به منو ویرایش ، ویرایش سریع ، حذف و موراد دیگر برای هر نوشته
  • قابلیت سورت کردن
  • فیلتر دسته بندی و موارد دیگر
  • قابلیت جستجو در پست ها
  • فیلتر منتشر شده ها ، همه ، پیش نویس و امثال آن
  • ایجاد نوشته جدید

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

برای اینکار نیاز است که از کلاس wp-list-table وردپرس استفاده کنید. کار با آن بسیار ساده است.

استفاده از کلاس WP_List_Table

استفاده از این کلاس بسیار ساده است. ولی تغییرات در آن با کمی جستجو قابل انجام است.

درون این کلاس تعدادی تابع ثابت است که هر کدام وظیفه ای دارند. ما برای شما آنان را تفکیک توضیح میدهیم. اینگونه شما میدانید که اطلاعات خود را کجا قرار دهید.

شما دوتا فایل دارید که فایل دوم کلاس شماست. و فایل اول ، اقدام به فراخوانی فایل دوم می نماید.

در نظر بگیرید که ما این فایل ها را به صورت افزونه به شما میدهیم که شما بتوانید خروجی را ببینید.

1- ایجاد فولدر افزونه

فولدر

ابتدا داخل پوشه plugins یک پوشه بنام wp-list-table ایجاد کنید.

2- ایجاد یک فایل برای فراخوانی کلاس

فایل نوت پد

حالا یک فایل درون پوشه خود به نام wp-list-table.php بسازید و اطلاعات زیر را داخل آن قرار دهید.

<?php
/*
Plugin Name: Nemayman WP List Table
Description: This plugin creates a WP List Table for WordPress Posts.
Version: 1.0
*/

// Plugin code goes here

function nemayman_wp_list_table_menu_page() {
	// ایجاد منو و نمایش نتیجه
	$hook = add_menu_page(
		'WP List Table',
		'WP List Table',
		'manage_options',
		'nemayman-wp-list-table',
		'nemayman_wp_list_table_render'
	);
	// تنظیمات تعداد نمایش در صفحه نمایش فیلتر
	// برای اینکه فقط اینجا نشون بده
	add_action( "load-$hook", 'add_options' );
}

add_action( 'admin_menu', 'nemayman_wp_list_table_menu_page' );

function nemayman_wp_list_table_render() {
	require plugin_dir_path( __FILE__ ).'wp-list-table-content.php';
	echo '<div class="wrap">';
	echo '<h2>WP List Table</h2>';
	$nemayman_WP_List_Table = new nemayman_WP_List_Table;
	$nemayman_WP_List_Table->prepare_items();?>
	<form id="posts-filter" method="post">
	<?php
		$nemayman_WP_List_Table->display();
	?>
	</form> <?php

  echo '</div>';

}

// تنظیمات تعداد نمایش در صفحه نمایش فیلتر
function add_options() {
  $option = 'per_page';
  $args = array(
         'label' => 'Posts',
         'default' => 20,
         'option' => 'posts_per_page'
         );
  add_screen_option( $option, $args );
}

// save filter per_page
add_filter('set-screen-option', 'nemay_save_wp_list_table_set_option', 10, 3);
function nemay_save_wp_list_table_set_option($status, $option, $value) {
  return $value;
}

?>
  • تابع nemayman_wp_list_table_menu_page : وظیفه این تابع ساخت یک منو در مدیریت وردپرس است.
  • فانکشن nemayman_wp_list_table_render : وظیفه فرخوانی کلاس wp list table ما را دارد.
  • تابع add_options : وظیفه ایجاد یک تنظیمات برای نمایش تعداد نوشته ها در هر صفحه را بر عهده دارد.
  • nemay_save_wp_list_table_set_option : این تابع وظیفه ذخیره تنظیمات یا همان تعداد نوشته ها در هر صفحه را درون دیتابیس انجام میدهد.

3- کلاس Wp List Table ورپرس

فایل نوت پد

در این قسمت یک کلاس کامل را برای شما قرار داده ایم. ابتدا یک فایل به نام wp-list-table-content.php را ایجاد کنید و اطلاعات زیر را درون آن قرار دهید.

<?php 
if (!class_exists('WP_List_Table')) {
    require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}else{
    class nemayman_WP_List_Table extends WP_List_Table
	{
		//private $posts_per_page = 20;
		
		function __construct(){
			global $status, $page;                
			add_action( 'admin_menu', [ $this, 'plugin_menu' ] );
			parent::__construct( array(
				'singular'  => 'notification',  
				'plural'    => 'notifications',   
				'ajax'      => false      
			) );        
		}

		//برای فیلتر برای بالای جدول بیاره مثل منتشر شده ، زباله
		protected function get_views() { 
			$status_links = array(
				"all"       => __("<a href='#'>All</a>",'my-plugin-slug'),
				"published" => __("<a href='#'>Published</a>",'my-plugin-slug'),
				"trashed"   => __("<a href='#'>Trashed</a>",'my-plugin-slug')
			);
			return $status_links;
		}

		// نام پیشرفض ستون ها
		function column_default($item, $column_name){
			return $item->$column_name;
		}
				
		
		// اکشن های زیر آیتم برای ویرایش یا حذف
		function column_user_login($item){
			$actions = array(
				'email'     => sprintf('<a href="?page=%s&action=%s&email_id=%s">E-mail</a>',$_REQUEST['page'],'user_login',$item->ID),
				'delete'    => sprintf('<a href="?page=%s&action=%s&delete_id=%s">Delete</a>',$_REQUEST['page'],'delete',$item->ID),
			);

			//Return the title contents
			return sprintf('%1$s %2$s',
				/*$1%s*/ $item->user_login, 
				/*$2%s*/ $this->row_actions($actions)
			);
		}  


		// چک باکس کنار آیتم ها
		function column_cb($item){
			return sprintf(
				'<input type="checkbox" name="%1$s[]" value="%2$s" />',
				/*$1%s*/ $this->_args['singular'],  
				/*$2%s*/ $item->ID                
			);
		}


		// نمایش اسم ستون ها از جدول وردپرس
		function get_columns()
		{
			$columns = array(
				'cb'			=> '<input type="checkbox" />',
				'ID'			=> 'ID',
				'user_login'	=> 'نام کاربری',
				'user_nicename'	=> 'نام',
				'user_email'	=> 'ایمیل'
			);
			return $columns;
		}
		
		// ستون های قابل سورت
		public function get_sortable_columns() {
			$sortable_columns = array(
				'user_login'	=> array('wp_user_id',false),     //true means it's already sorted
				'user_nicename'	=> array('date',false),
				'user_email'	=> array('common',false)
			);
			return $sortable_columns;
		}

		// کشویی بالا که فیلتر می کنه
		public function get_bulk_actions() {
			$actions = array(
				'delete'		=> 'Delete'
			);
			return $actions;
		}


		// اگر فلتر ها رو انتخاب کرد چه اتفاقی بیفته
		public function process_bulk_action() {
			// Detect when a bulk action is being triggered...
			if ( 'delete' === $this->current_action() ) {

				// In our file that handles the request, verify the nonce.
				$nonce = esc_attr( $_REQUEST['notification'] );
				if ( ! wp_verify_nonce( $nonce, 'sp_delete_customer' ) ) {
					die( 'Go get a life script kiddies' );
				} else {
					self::delete_customer( absint( $_GET['customer'] ) );

							// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
							// add_query_arg() return the current url
							wp_redirect( esc_url_raw( add_query_arg() ) );
					exit;
				}
			}
			
			
				// If the delete bulk action is triggered
			if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'delete' ) 
			|| ( isset( $_POST['action2'] ) && $_POST['action2'] == 'delete' )){

				$delete_ids = esc_sql( $_POST['notification'] );
				// loop over the array of record IDs and delete them
				foreach ( $delete_ids as $id ) {
					self::delete_customer( $id );

				}

				// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
					// add_query_arg() return the current url
					wp_redirect( esc_url_raw(add_query_arg()) );
				exit;
			}
				

		}


		//نمایش آیتم ها 
		function prepare_items() {
			
			global $wpdb;
			$args = array('ID','user_login', 'user_nicename', 'user_email');
			$sql_select = implode(', ', $args);
			$data = $wpdb->get_results("SELECT " . $sql_select . " FROM " . $wpdb->prefix . "users ");	
					
			$columns = $this->get_columns();
			$hidden = array();
			$sortable = $this->get_sortable_columns();

			$this->_column_headers = array($columns, $hidden, $sortable);        

			$this->process_bulk_action();  // فراخوانی اجرا کننده اکشن کشویی

			function usort_reorder($a,$b){
				$orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'title'; //If no sort, default to title
				$order = (!empty($_REQUEST['order'])) ? $_REQUEST['order'] : 'asc'; //If no order, default to asc
				$result = strcmp($a[$orderby], $b[$orderby]); //Determine sort order
				return ($order==='asc') ? $result : -$result; //Send final sort direction to usort
			}
		   // usort($data, 'usort_reorder');        

			$current_page = $this->get_pagenum();        

			$total_items = count($data);

		   // $data = array_slice($data,(($current_page-1)*$per_page),$per_page); 
			$posts = $data;
			empty($posts) AND $posts = array();



			# >>>> Pagination
			$user = get_current_user_id();
			$screen = get_current_screen();
			$option = $screen->get_option('per_page', 'option'); 

            $per_page = get_user_meta($user, $option, true);

            $this->_column_headers = array($columns,$hidden,$sortable); 
 
            if ( empty ( $per_page) || $per_page < 1 ) {
            
              $per_page = $screen->get_option( 'per_page', 'default' ); 
 
            }
			# <<<< Pagination
				
		
			$current_page = $this->get_pagenum();
			$total_items = count($posts);
			$this->set_pagination_args(array(
				'total_items' => $total_items,
				'per_page' => $per_page,
				'total_pages' => ceil($total_items / $per_page)
			));
			$last_post = $current_page * $per_page;
			$first_post = $last_post - $per_page + 1;
			$last_post > $total_items AND $last_post = $total_items;

			$range = array_flip(range($first_post - 1, $last_post - 1, 1)); 
			$posts_array = array_intersect_key($posts, $range);
			# <<<< Pagination
			// Prepare the data
			$permalink = __('Edit:', 'nemay-wallet');
			foreach ($posts_array as $key => $post) {
				
			}
			$this->items = $posts_array;
		}
		
	}//class

}//else

در این کلاس ، ما داخل منو ایجاد گردیده تمام کاربران را نمایش دادیم.

کدهای بالا دارای خروجی صحیح هستند.

دقت کنید که وقتی کدهای بالا را ریختید. برید داخل افزونه های مدیریت و افزونه مورد نظر را فعالت کنید. سپس از منو wp list table قادرید تمام کاربران را مشاهده کنید. این یک نمونه کد تست شده است.
بنر طراحی سایت نمای من

توضیحات کامل توابع کلاس wp_list_table

در این قسمت تمام توابع بالا را به صورت جداگانه توضیح داده ایم که شما قادر به ویرایش آن باشید. کدهای بالا به شما کمک می نماید که کاربران را نمایش دهید. برای تغییر اطلاعات جدول ، نیاز است که خط 139 را تغییر دهید.

قبل از انجام هر کاری ما داخل این کلاس کد زیر را قرار داده ایم. وظیفه این کد اینست که اگر از قبل کلاس class-wp-list-table فراخوانی نگردیده بود ؛ آنرا فراخوانی و از خطا جلوگیری می نماید.

if (!class_exists('WP_List_Table')) {
    require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );

1- تابع get_views کلاس wp_list_table

این تابع وظیفه نمایش فیلتر ها در بالای جدول را دارد.

//برای فیلتر برای بالای جدول بیاره مثل منتشر شده ، زباله
protected function get_views() { 
	$status_links = array(
		"all"       => __("<a href='#'>All</a>",'my-plugin-slug'),
		"published" => __("<a href='#'>Published</a>",'my-plugin-slug'),
		"trashed"   => __("<a href='#'>Trashed</a>",'my-plugin-slug')
	);
	return $status_links;
}
تابع get_views کلاس wp_list_table

2- تابع column_default در wp_list_table

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

// نام پیشرفض ستون ها
function column_default($item, $column_name){
	return $item->$column_name;
}
column_default در wp_list_table

3- تابع column_user_login کلاس wp_list_table

این تابع موجب می گردد که زیر هر سطر گزینه هایی همانند : ویرایش ، ویرایش سریع ، حذف و امثال آن را ایجاد کنید. ما اینجا فقط دو مورد را برای نمونه اضافه کردیم.

همچنین قادرید تعیین کنید که زیر کدام یک از آیتم ها نمایش دهد.

// اکشن های زیر آیتم برای ویرایش یا حذف
function column_user_login($item){
	$actions = array(
		'email'     => sprintf('<a href="?page=%s&action=%s&email_id=%s">E-mail</a>',$_REQUEST['page'],'user_login',$item->ID),
		'delete'    => sprintf('<a href="?page=%s&action=%s&delete_id=%s">Delete</a>',$_REQUEST['page'],'delete',$item->ID),
	);

	//Return the title contents
	return sprintf('%1$s %2$s',
		/*$1%s*/ $item->user_login, 
		/*$2%s*/ $this->row_actions($actions)
	);
}
column_user_login کلاس wp_list_table

4- تابع column_cb کلاس wp_list_table

با استفاده از column_cb قادرید در کنار آیتم ها چک باکس جهت تیک زنی را ایجاد کنید.

// چک باکس کنار آیتم ها
function column_cb($item){
	return sprintf(
		'<input type="checkbox" name="%1$s[]" value="%2$s" />',
		/*$1%s*/ $this->_args['singular'],  
		/*$2%s*/ $item->ID                
	);
}
column_cb کلاس wp_list_table

5- تابع get_columns کلاس wp_list_table

با استفاده از get_columns قادرید ستون ها را معرفی و نام آنان را به دلخواه تغییر دهید.

// نمایش اسم ستون ها از جدول وردپرس
function get_columns()
{
	$columns = array(
		'cb'		=> '<input type="checkbox" />',
		'ID'		=> 'ID',
		'user_login'	=> 'نام کاربری',
		'user_nicename'	=> 'نام',
		'user_email'	=> 'ایمیل'
	);
	return $columns;
}
column_default در wp_list_table

6- تابع get_sortable_columns کلاس wp_list_table

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

// ستون های قابل سورت
public function get_sortable_columns() {
	$sortable_columns = array(
		'user_login'	=> array('wp_user_id',false),     //true means it's already sorted
		'user_nicename'	=> array('date',false),
		'user_email'	=> array('common',false)
	);
	return $sortable_columns;
}

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

get_sortable_columns کلاس wp_list_table

7- تابع get_bulk_actions کلاس wp_list_table

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

// کشویی بالا که فیلتر می کنه
public function get_bulk_actions() {
	$actions = array(
		'delete'		=> 'Delete'
	);
	return $actions;
}
get_bulk_actions کلاس wp_list_table

8- تابع process_bulk_action کلاس wp_list_table

اگر آیتم هایی در get_bulk_actions یا column_user_login انتخاب شد. در این قسمت دستور میدهید که چه اتفاقی رخ دهد. اینکه با انتخاب پاک آیتمی حذف شود. نیاز است که اینجا کد را بنویسید.

ما فقط کدهای اولیه را نوشتیم که پیغام دهد. شما خود کدهای مربوطه را اضافه کنید.

// اگر فلتر ها رو انتخاب کرد چه اتفاقی بیفته
public function process_bulk_action() {
	// Detect when a bulk action is being triggered...
	if ( 'delete' === $this->current_action() ) {

		// In our file that handles the request, verify the nonce.
		$nonce = esc_attr( $_REQUEST['notification'] );
		if ( ! wp_verify_nonce( $nonce, 'sp_delete_customer' ) ) {
			die( 'Go get a life script kiddies' );
		} else {
			self::delete_customer( absint( $_GET['customer'] ) );

					// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
					// add_query_arg() return the current url
					wp_redirect( esc_url_raw( add_query_arg() ) );
			exit;
		}
	}
	
	
		// If the delete bulk action is triggered
	if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'delete' ) 
	|| ( isset( $_POST['action2'] ) && $_POST['action2'] == 'delete' )){

		$delete_ids = esc_sql( $_POST['notification'] );
		// loop over the array of record IDs and delete them
		foreach ( $delete_ids as $id ) {
			self::delete_customer( $id );

		}
			wp_redirect( esc_url_raw(add_query_arg()) );
		exit;
	}
		

}

این قسمت دارای تصویر نیست. زیرا کدهای پس از کلیک ، اتفاقات رخ میدهد.

9- تابع prepare_items کلاس wp_list_table

با استفاده از تابع prepare_items در کلاس wp list table شما اطلاعات را نمایش میدهید. تغییرات بسیار شما در این قسمت است. با استفاده از این بخش دستور select را تغییر و قادر به نمایش اطلاعات از جدول مورد نظر هستید.

//نمایش آیتم ها 
function prepare_items() {
	
	global $wpdb;
	$args = array('ID','user_login', 'user_nicename', 'user_email');
	$sql_select = implode(', ', $args);
	$data = $wpdb->get_results("SELECT " . $sql_select . " FROM " . $wpdb->prefix . "users ");	
			
	$columns = $this->get_columns();
	$hidden = array();
	$sortable = $this->get_sortable_columns();

	$this->_column_headers = array($columns, $hidden, $sortable);        

	$this->process_bulk_action();  // فراخوانی اجرا کننده اکشن کشویی

	function usort_reorder($a,$b){
		$orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'title'; //If no sort, default to title
		$order = (!empty($_REQUEST['order'])) ? $_REQUEST['order'] : 'asc'; //If no order, default to asc
		$result = strcmp($a[$orderby], $b[$orderby]); //Determine sort order
		return ($order==='asc') ? $result : -$result; //Send final sort direction to usort
	}
   // usort($data, 'usort_reorder');        

	$current_page = $this->get_pagenum();        

	$total_items = count($data);

   // $data = array_slice($data,(($current_page-1)*$per_page),$per_page); 
	$posts = $data;
	empty($posts) AND $posts = array();



	# >>>> Pagination
	$user = get_current_user_id();
	$screen = get_current_screen();
	$option = $screen->get_option('per_page', 'option'); 

	$per_page = get_user_meta($user, $option, true);

	$this->_column_headers = array($columns,$hidden,$sortable); 

	if ( empty ( $per_page) || $per_page < 1 ) {
	
	  $per_page = $screen->get_option( 'per_page', 'default' ); 

	}
	# <<<< Pagination
		

	$current_page = $this->get_pagenum();
	$total_items = count($posts);
	$this->set_pagination_args(array(
		'total_items' => $total_items,
		'per_page' => $per_page,
		'total_pages' => ceil($total_items / $per_page)
	));
	$last_post = $current_page * $per_page;
	$first_post = $last_post - $per_page + 1;
	$last_post > $total_items AND $last_post = $total_items;

	$range = array_flip(range($first_post - 1, $last_post - 1, 1)); 
	$posts_array = array_intersect_key($posts, $range);
	# <<<< Pagination
	// Prepare the data
	$permalink = __('Edit:', 'nemay-wallet');
	foreach ($posts_array as $key => $post) {

	}
	$this->items = $posts_array;
}
تابع prepare_items کلاس wp_list_table

در کد های این بخش برای تغییر دریافت اطلاعات از دیتابیس خاص خود کافیست فقط کدهای حدود خط 139 که شامل موارد زیر است را تغییر دهید.

$args       = array('ID','user_login', 'user_nicename', 'user_email');
$data       = $wpdb->get_results("SELECT " . $sql_select . " FROM " . $wpdb->prefix . "users ");	
  • در قسمت args نام ستون هایی که قرار است از جدول دریافت کنید را بنویسید.
  • در قسمت data دستور SELECT خود را انجام دهید. اگر فقط نام جدول تغییر می کند که کلمه users را به نام جدول خود تغییر دهید.