自プラグインの各種情報を取得

はじめに

プラグインの開発者には、新たなバージョンの WordPress がリリースされる前に、Tested up to:(検証済み最新バージョン:)の値を確認するように、以下の様なメールが届きます。同じ事をやってみようと思いコードを書いてみました。

概要

プラグイン単体の場合は、plugins_api で取得できます。全プラグインの情報の場合、取得できる関数が見当たらないので、プロフィールサイトから取得する事にしました。プロフィールサイトには以下の様に各プラグインのリンクにスタイルをあてるクラス「plugin-info-container」があったので、そこからスクレイピングしました。

WordPress の関数を使えるように、wp-load.php を読み込めるようにしました。

また、コマンドラインオプションを設け、プラグイン単体での各属性を取得できるようにしました。各属性に関しては、plugins_api を参照してください。

以下に動作を動画(倍速)で示します。

コード

<?php
/**
 * Name:        profiles-plugins.php
 * Version:     1.00
 * Author:      Katsushi Kawamori
 * Author URI:  https://riverforest-wp.info/
 * License:     GPLv2 or later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 *
 * @package     profiles-plugins
 */

/* Your WordPress profile url */
const WP_PROFILE_URL = 'https://profiles.wordpress.org/katsushi-kawamori/';

/* Wp load. This file => wp-content/uploads/profiles-plugins.php */
list( $abspath, $mypath ) = explode( 'wp-content', dirname( __FILE__ ), 2 );
$wp_load_path = $abspath . 'wp-load.php';
require_once( $wp_load_path );

/* For plugins_api */
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';

$cmdoptions = array();
/* Example -a active_installs -p woocommerce */
$cmdoptions = getopt( 'a:p:' );

/* Default atribute 'tested' */
if ( isset( $cmdoptions['a'] ) && ! empty( $cmdoptions['a'] ) ) {
	$atr = $cmdoptions['a'];
} else {
	$atr = 'tested';
}

if ( isset( $cmdoptions['p'] ) && ! empty( $cmdoptions['p'] ) ) {
	$slug = $cmdoptions['p'];
	$plugin_s = array(
		'name' => read_plugins_api( $slug, 'name' ),
		'link' => read_plugins_api( $slug, 'homepage' ),
		'slug' => $slug,
		$atr => read_plugins_api( $slug, $atr ),
	);
	print_r( $plugin_s );
} else {
	/* Scraping */
	$dom = new DOMDocument( '1.0', 'UTF-8' );
	$html = file_get_contents( WP_PROFILE_URL );
	@$dom->loadHTML( $html );
	$xpath = new DOMXpath( $dom );
	/* Get <a> tag within class plugin-info-container */
	$a_tags = $xpath->query( '//div[@class="plugin-info-container"][1]//a' );
	$count = 0;
	foreach ( $a_tags as $node ) {
		/* Get href attribute from within <a> tag */
		$link_url = 'https:' . $node->getAttribute( 'href' );
		/* Get slug from URL */
		$link_s = untrailingslashit( $link_url );
		$links = explode( '/', $link_s );
		$slug = end( $links );

		++$count;
		$plugin_s = array(
			'count' => $count,
			'name' => $node->nodeValue,
			'link' => $link_url,
			'slug' => $slug,
			$atr => read_plugins_api( $slug, $atr ),
		);
		print_r( $plugin_s );
	}
}

/** ==================================================
 * Get api and value
 *
 * @param string $slug  slug.
 * @param string $atr  atribute.
 * @return mixed api value.
 * @since 1.00
 */
function read_plugins_api( $slug, $atr ) {

	/* Call API */
	$call_api = plugins_api(
		'plugin_information',
		array(
			'slug' => $slug,
			'fields' => array(
				'short_description' => true,
				'description' => true,
				'active_installs' => true,
				'downloaded' => true,
				'icons' => true,
				'banners' => true,
				'ratings' => true,
			),
		)
	);

	return $call_api->$atr;

}

この記事を書いた人