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

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

I. Truy cập vào API WordPress.org

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 của plugin, chỉ cần thêm slug của plugin sau địa chỉ. (Mở trang plugin, nhìn vào URL để xem slug). Ví dụ: nếu tôi muốn nhận thông tin plugin SEO by Yoast, tôi có:

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

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

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

Bây giờ, trình duyệt sẽ gửi một truy vấn với phương thức GET đến máy chủ API và trả về thông tin của plugin như sau:

Lời khuyên: Tải về JSON định dạng để Google Chrome dễ dàng xem dữ liệu JSON.

Lấy dữ liệu plugin và theme ở WordPress.org bằng API [NEW] Nếu bạn là một nhà phát triển thì tôi nghĩ bạn đã biết phải làm gì với đống dữ liệu này. Bạn có thể xử lý nó theo cách bạn muốn nếu bạn đang truy xuất dữ liệu từ một trang web không phải WordPress. Và nếu bạn muốn có được trang web WordPress của mình, thì tôi có một cách tốt hơn đó là sử dụng. hàm số plugins_apithemes_api được sử dụng để lấy thông tin về plugin và chủ đề về Trang tổng quan WordPress.

II. Sử dụng chức năng 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 có tên plugin_api như sau (đã loại bỏ nhận xét):


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 vào đoạn trên, chúng ta có thể viết một đoạn mã để lấy dữ liệu plugin về trang web 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 những ai muốn lấy thông tin plugin dựa trên 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ờ đầu ra sau khi chúng ta in các đối tượng của nó là: wpapi-apiobject Nó trả về tất cả thông tin bạn cần, bây giờ tôi thử áp dụng và tiếp tục viết nội dung plugin bằng cách lấy từng đối tượng trong đó (tên, tác giả, …):


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 chỉnh dữ liệu bạn muốn nhận

Mặc định khi bạn gửi câu truy vấn như trên thì máy chủ sẽ nhận được rất nhiều dữ liệu, trong đó có thể có một số dữ liệu không cần thiết mà plugin_api cho phép gỡ bỏ. Vì vậy, nếu bạn muốn loại bỏ một số dữ liệu bạn không muốn nhận để làm cho truy vấn nhanh hơn, chúng tôi thay đổi 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 trường có thể bị xóa:

  • 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ỉ quyên góp.
  • homepage: Địa chỉ trang web của 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 Mô tả, Câu hỏi thường gặp, Cài đặt,….
  • tags: Các thẻ của plugin trên thư viện.
  • tested: Phiên bản WordPress đã được thử nghiệm.

Mã đầy đủ trong 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

Loại này thích hợp để bạn xây dựng công cụ tìm kiếm thông tin plugin theo câu hỏi tìm kiếm, hoặc hiển thị danh sách các plugin mới, hot, … Cách sử dụng mình đã nói ở trên, ở đây mình chỉ nói qua biến tùy chỉnh. $args$plugin_api. Ví dụ: nếu tôi muốn lấy danh sách plugin tại http://wordpress.org/plugins/browse/popular/, tôi sẽ thiết lập nó như sau: Đặt 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

);

Tôi muốn giải thích các thông 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 các plugin phổ biến.
    • new: danh sách plugin mới.
    • updated: danh sách plugin cập nhật.
    • top-rated: danh sách plugin được đánh giá cao.
  • search (thay thế cho duyệt): tham số nhận danh sách các plugin theo truy vấn tìm kiếm.
  • tag (thay thế để duyệt): lấy danh sách các plugin theo thẻ.
  • author (thay thế để duyệt): lấy danh sách các plugin theo tên tác giả.
  • page (tùy chọn): Số trang mà bạn muốn lấy kết quả. Ví dụ, bạn muốn lấy kết quả trên trang 1.
  • >per_page: số lượng plugin trên mỗi trang.
  • fields (tùy chọn): chọn các trường để lấy hoặc xóa. Xem phần 2.3.

Lưu ý rằng giữa tham số browse, search, tagauthor sau đó chỉ cần sử dụng một.

Cài đặt 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 );

Nghĩa là, khi bạn muốn lấy thông tin về một plugin, hãy sử dụng tham số plugin_informationnếu bạn muốn truyền truy vấn để nhận nhiều plugin, hãy sử dụng query_plugins. Và bây giờ tôi cố gắng print_r nó ra ngoài.

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 được chia thành 2 phần chính như sau:

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

Bây giờ tôi muốn hiển thị danh sách tên plugin, hãy 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 Mã đầ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(

‘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. Nhận thông tin chủ đề

Với các chủ đề, chúng tôi sử dụng giống như các plugin. Sự khác biệt duy nhất là chúng ta sẽ sử dụng hàm themes_api trong tập tin /wp-admin/includes/theme.php vì vậy trước tiên chúng ta phải nhúng tệp đó 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) Nhận thông tin chủ đề qua slug

Tiếp theo là một ví dụ về việc lấy thông tin của một chủ đề, được viết giống 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 đủ: wpapi-themeobj Sau đó, lọc đối tượng ra để hiển thị đẹp mắt.


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

wpapi-themeinfo Mã đầy đủ:


/* 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) Nhận chủ đề dựa trên truy vấn

Cũng giống như nhận truy vấn plugin, tôi có mã sau để nhận danh sách các chủ đề 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

Phần kết

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

Đánh giá nội dung này