Lấy dữ liệu plugin và theme ở WordPress.org bằng API




data vpn

Hôm qua có một người bạn chat với mình là muốn làm một trang tra cứu thông tin theme/plugin cho thành viên mà chưa biết cách làm thế nào để lấy các dữ liệu của chúng tại thư viện WordPress.Org thông qua cách đơn giản và tối ưu nhất. Ý tưởng đó làm mình sực nhớ tới WordPess.org API mà nó có thể làm được. Khi bạn truy cập vào trang WordPress.org API thì có thể thấy documentation khá ngắn gọn và có thể hơi khó hiểu cho những newbie. Vì vậy mà ở bài này, mình sẽ hướng dẫn bạn sử dụng nó để lấy dữ liệu của các theme và plugin tại thư viện WordPress.org và hy vọng nó giúp ích cho ý tưởng của các bạn.

I. Tiếp cận WordPress.org API

1.1) Địa chỉ API cho plugin

Địa chỉ của API lấy thông tin plugin là http://api.wordpress.org/plugins/info/1.0/, và nếu bạn muốn lấy thông tin chi tiết một plugin thì chỉ cần thêm slug của plugin đó vào đăng sau địa chỉ (mở trang plugin ra, nhìn lên URL sẽ thấy slug). Ví dụ mình muốn lấy thông tin plugin SEO by Yoast thì có:

http://api.wordpress.org/plugins/info/1.0/wordpress-seo

Kết quả sẽ trả về dữ liệu kiểu dữ liệu tuần tự, một vài trường hợp bạn cần lấy theo dữ liệu kiểu JSON thì chỉ cần thêm .json vào cuối URL là:

http://api.wordpress.org/plugins/info/1.0/wordpress-seo.json

Lúc này trình duyệt sẽ gửi một truy vấn với phương thức GET tới server API và trả lại thông tin của plugin như sau:

Tips: cài JSON Formatter cho Google Chrome để xem dữ liệu kiểu JSON dễ dàng.

wpapi-seobyyoastjson   Nếu bạn là một developer thì mình nghĩ các bạn đã biết làm thế nào với đống dữ liệu này. Bạn có thể xử lý bằng kiểu gì bạn thích nếu lấy dữ liệu về một website không phải là WordPress. Còn nếu bạn muốn lấy về website WordPress của bạn thì mình có một cách hay hơn đó là sử dụng hàm plugins_apithemes_api vốn được sử dụng để lấy thông tin của các plugin và theme về Dashboard của WordPress.

II. Sử dụng hàm plugin_api

Ngay tại dòng #29 đến #102 tại /wp-admin/includes/plugin-install.php họ viết một hàm tên plugin_api như sau (đã xóa comment):

 function plugins_api($action, $args = null) {
  	if ( is_array($args) ) 		$args = (object)$args;
	if ( !isset($args->per_page) ) 		$args->per_page = 24;
	$args = apply_filters( 'plugins_api_args', $args, $action ); 	$res = apply_filters( 'plugins_api', false, $action, $args );
	if ( false === $res ) {
 		$url = $http_url = 'http://api.wordpress.org/plugins/info/1.0/'; 		if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) 			$url = set_url_scheme( $url, 'https' );
		$args = array( 			'timeout' => 15, 			'body' => array( 				'action' => $action, 				'request' => serialize( $args ) 			) 		); 		$request = wp_remote_post( $url, $args );
		if ( $ssl && is_wp_error( $request ) ) {
 			trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); 			$request = wp_remote_post( $http_url, $args ); 		}
  		if ( is_wp_error($request) ) {
 			$res = new WP_Error('plugins_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.' ), $request->get_error_message() ); 		}
 else {
 			$res = maybe_unserialize( wp_remote_retrieve_body( $request ) ); 			if ( ! is_object( $res ) && ! is_array( $res ) ) 				$res = new WP_Error('plugins_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.' ), wp_remote_retrieve_body( $request ) ); 		}
 	}
 elseif ( !is_wp_error($res) ) {
 		$res->external = true; 	}
 	return apply_filters( 'plugins_api_result', $res, $action, $args );
}

Và dựa theo đoạn trên đó, chúng ta có thể viết một code lấy dữ liệu plugin về website của mình như sau:

2.1) Hiển thị plugin theo tên plugin (slug)

Cách này phù hợp với bạn nào muốn lấy thông ti
n plugin dựa theo slug của plugin đó.

  /* Gọi file plugin-install.php vào để sử dụng function của nó */

if ( ! function_exists( ‘plugins_api’ ) )
require_once( ABSPATH . ‘wp-admin/includes/plugin-install.php’ );

/* Thiết lập query để gửi truy vấn */

$args = array(
‘slug’ => ‘wordpress-seo’
);

/* Thiết lập API để lấy dữ liệu */

$plugin_api = plugins_api( ‘plugin_information’, $args );

/** Kiểm tra dữ liệu nhận để hiển thị lỗi hoặc kết quả */

if ( is_wp_error( $plugin_api ) ) {

echo ‘Lấy thông tin plugin thất bại’;

}
else {

echo ‘<pre>’.print_r( $plugin_api, true ). ‘</pre>’; // Xem thông tin các đối tượng
}

Bây giờ kết quả trả về sau khi ta in các đối tượng của nó ra là: wpapi-apiobject Nó trả về toàn bộ thông tin mà bạn cần rồi đấy, bây giờ mình thử áp dụng và viết tiếp đoạn in nội dung plugin bằng cách lấy từng đối tượng trong đó ra (name, author,…):

  	echo 'Tên plugin: '. $plugin_api->name .'<br />';

echo ‘Tên tác giả: ‘. $plugin_api->author .'<br />’;

echo ‘<a href=”‘. $plugin_api->download_link .'”>Tải plugin</a><br />’;

echo ‘Lượt tải: ‘. $plugin_api->downloaded .'<br />’;

Kết quả: wpapi-echo

2.2) Tùy biến dữ liệu muốn nhận

Mặc định khi bạn gửi truy vấn như phía trên thì máy chủ sẽ nhận rất nhiều dữ liệu mà trong số đó có thể có vài dữ liệu không cần thiết mà plugin_api cho phép loại bỏ nó. Vì vậy nếu bạn muốn loại bỏ một vài dữ liệu không muốn nhận để truy vấn nhanh hơn thì ta sửa biến $args như sau:

  /* Thiết lập query để gửi truy vấn */

$args = array(
‘slug’ => ‘wordpress-seo’,
‘fields’ => array(
‘homepage’ => false
)
);

Danh sách các fields có thể loại bỏ:

  • added: Ngày xuất bản plugin.
  • compatibility: Danh sách các phiên bản WordPress tương thích.
  • donate_link: Địa chỉ donation.
  • homepage: Địa chỉ website trang chủ của plugin.
  • last_updated: Thời gian cập nhật cuối cùng của plugin.
  • rating: Điểm đánh giá.
  • require: Phiên bản WordPress tương thích.
  • section: Thông tin của trang Description, FAQ, Install,….
  • tags: Các tag của plugin trên thư viện.
  • tested: Phiên bản WordPress đã test.

Toàn bộ code ở phần này:

  /* Gọi file plugin-install.php vào để sử dụng function của nó */

if ( ! function_exists( ‘plugins_api’ ) )
require_once( ABSPATH . ‘wp-admin/includes/plugin-install.php’ );

/* Thiết lập query để gửi truy vấn */

$args = array(
‘slug’ => ‘wordpress-seo’,
‘fields’ => array(
‘homepage’ => false
)
);

/* Thiết lập API để lấy dữ liệu */

$plugin_api = plugins_api( ‘plugin_information’, $args );

if ( is_wp_error( $plugin_api ) ) {

echo ‘Lấy thông tin plugin thất bại’;

}
else {

echo ‘Tên plugin: ‘. $plugin_api->name .'<br />’;

echo ‘<a href=”‘. $plugin_api->download_link .'”>Tải plugin</a><br />’;

echo ‘Lượt tải: ‘. $plugin_api->downloaded .'<br />’;

}

 2.3) Hiển thị thông tin theo truy vấn

Kiểu này thích hợp cho bạn build một công cụ tìm thông tin plugin theo truy vấn search, hoặc hiển thị danh sách plugin mới, đang hot,….. Cách sử dụng mình đã nói ở trên rồi, ở đây mình chỉ nói qua việc tùy chỉnh biến $args$plugin_api. Chẳng hạn mình muốn lấy danh sách plugin ở http://wordpress.org/plugins/browse/popular/ thì mình sẽ thiết lập như sau: Thiết lập biến tham số $args:

  /* Thiết lập query để gửi truy vấn */

$args = array(

‘browse’ => ‘top-rated’, //Tham số truy vấn của trang
‘page’ => 1, // Số trang cần lấy kết quả.
‘per_page’ => ‘5’, // Số plugin hiển thị mỗi trang

);

Mình xin giải thích các tham số như sau:

  • browse: tên truy vấn của trang, có 4 loại truy vấn như sau:
    • popular: danh sách plugin thông dụng.
    • new: danh sách plugin mới.
    • updated: danh sách plugin vừa cập nhật.
    • top-rated: danh sách plugin được đánh giá cao.
  • search (thay thế cho browse): tham số lấy danh sách plugin theo truy vấn tìm kiếm.
  • tag (thay thế cho browse): lấy danh sách plugin theo tag.
  • author (thay thế cho browse): lấy danh sách plugin theo tên tác giả.
  • page (tùy ý): Số trang mà bạn muốn lấy kết quả. Ví dụ bạn muốn lấy kết quả ở trang 1.
  • >per_page: số lượng plugin ở mỗi trang.
  • fields (tùy ý): lựa chọn các field cần lấy hoặc loại bỏ. Xem ở phần 2.3.

Lưu ý là giữa tham số browse, search, tagauthor thì chỉ sử dụng một cái thôi nhé.

Thiết lập biến $plugin_api để lấy dữ liệu.

  /* Thiết lập API để lấy dữ liệu */

$plugin_api = plugins_api( ‘query_plugins’, $args );

Tức là khi bạn muốn lấy thông tin một plugin thì sử dụng tham số plugin_information, còn muốn truyền query lấy nhiều plugin thì dùng query_plugins. Và bây giờ mình thử print_r nó ra nhé.

echo '<pre>'. print_r( $plugin_api, true ). '</pre>'/* Vòng lặp lấy dữ liệu của từng plugin */
;

Kết quả trả về: wpapi-queryplugins Kết quả trả về sẽ là một chuỗi dữ liệu tuần tự chia ra 2 phần chính như sau:

  • info: thông tin của truy vấn
  • plugins: thông tin chi tiết của từng plugin.

Bây giờ mình muốn hiển thị danh sách tên plugin thì sử dụng foreach như sau:

 	/* Vòng lặp lấy dữ liệu của từng plugin */

foreach ( $plugin_api->plugins as $plugins ) {

echo $plugins->name. ‘<br / >’;
}

Kết quả: wpapi-foreachqueryapi   Toàn bộ code:

  /* Gọi file plugin-install.php vào để sử dụng function của nó */

if ( ! function_exists( ‘plugins_api’ ) )
require_once( ABSPATH . ‘wp-admin/includes/plugin-install.php’ );

/* Thiết lập query để gửi truy vấn */

$args = array(

‘browse’ => ‘top-rated’, //Tham số truy vấn của trang
‘page’ => 1, // Số trang cần lấy kết quả.
‘per_page’ => ‘5’, // Số plugin hiển thị mỗi trang

);

/* Thiết lập API để lấy dữ liệu */

$plugin_api = plugins_api( ‘query_plugins’, $args );

if ( is_wp_error( $plugin_api ) ) {
echo ‘Lấy thông tin plugin thất bại’;

}
else {

// echo ‘<pre>’. print_r( $plugin_api, true ). ‘</pre>’;

/* Vòng lặp lấy dữ liệu của từng plugin */

foreach ( $plugin_api->plugins as $plugins ) {

echo $plugins->name. ‘<br />’;

}

}

III. Lấy thông tin theme

Với theme thì chúng ta sử dụng cũng giống như plugin. Chỉ khác là chúng ta sẽ sử dụng hàm themes_api trong file /wp-admin/includes/theme.php nên đầu tiên ta phải nhúng file đó vào như sau:

 	/* Gọi file theme.php vào để sử dụng function của nó */
 	if ( ! function_exists( 'themes_api' ) ) 	require_once( ABSPATH . 'wp-admin/includes/theme.php' );

3.1) Lấy thông tin của theme qua slug

Kế tiếp là ví dụ lấy thông tin của một theme, viết y hệt như lấy thông tin của plugin:

 	/* Gọi file theme.php vào để sử dụng function của nó */
 	if ( ! function_exists( 'themes_api' ) ) 	require_once( ABSPATH . 'wp-admin/includes/theme.php' );

/* Thiết lập query để gửi truy vấn */

$args = array(

‘slug’ => ‘Ravel’, // Slug của theme, có thể viết tên của theme

);

/* Thiết lập API để lấy dữ liệu */

$theme_api = themes_api( ‘theme_information’, $args );

if ( is_wp_error( $theme_api ) ) {

echo ‘Lấy thông tin themes thất bại’;

}
else {

echo ‘<pre>’. print_r( $theme_api, true ). ‘</pre>’;

}

Kết quả trả về khá đầy đủ nhé: wpapi-themeobj Rồi, lọc đối tượng ra hiển thị cho đẹp nào.

 echo $theme_api->name. '<br /> echo '<img src="'.$theme_api->screenshot_url.'" alt="" />';

wpapi-themeinfo Toàn bộ code:

 	/* Gọi file theme.php vào để sử dụng function của nó */
 	if ( ! function_exists( 'themes_api' ) ) 	require_once( ABSPATH . 'wp-admin/includes/theme.php' );

/* Thiết lập query để gửi truy vấn */

$args = array(

‘slug’ => ‘Ravel’, // Slug của theme, có thể viết tên của theme

);

/* Thiết lập API để lấy dữ liệu */

$theme_api = themes_api( ‘theme_information’, $args );

if ( is_wp_error( $theme_api ) ) {

echo ‘Lấy thông tin themes thất bại’;

}
else {

echo ‘<pre>’. print_r( $theme_api, true ). ‘</pre>’;

echo $theme_api->name. ‘<br />’;

echo ‘<img src=”‘.$theme_api->screenshot_url.'” alt=”” />’;
}

3.2) Lấy theme dựa vào truy vấn

Cũng giống như lấy truy vấn plugins, mình có đoạn code sau để lấy danh sách các theme mới nhất:

  /* Thiết lập query để gửi truy vấn */

$args = array(
‘browse’ => ‘new’,
‘page’ => 1,
‘per_page’ => 5
);

/* Thiết lập API để lấy dữ liệu */

$theme_api = themes_api( ‘query_themes’, $args );

if ( is_wp_error( $theme_api ) ) {

echo ‘Lấy thông tin themes thất bại’;

}
else {

// echo ‘<pre>’. print_r( $theme_api, true ). ‘</pre>’;

/* Hiển thị danh sách thông tin theme */

foreach ($theme_api->themes as $themes) {

echo $themes->name. ‘<br />’;
}

}

Kết quả: wpapi-themequery

 Lời kết

Tới đây mình hy vọng là đã truyền đạt đủ những gì mà bạn cần ở tính năng này, bạn có thể tự mày mò thêm để có thể sử dụng tính năng này một cách tối ưu nhất cho dự án của mình. Hy vọng vào một ngày đẹp trời nào đó, mình sẽ viết tutorial hướng dẫn cách bạn làm một widget sử dụng AJAX để tra cứu theme/plugin hoặc shortcode.




data vpn

Leave your comment