プラグインが独自のバージョン番号を取得する方法はありますか?


8

プラグインの内部で、プラグインのバージョンを判別するために呼び出すことができるAPIはありますか?

診断目的で、プラグインに独自のバージョン番号を付けてhtmlコメントを出力させたいだけです。

回答:


9

@david:@Adam Backtromと@ Viper007Bondの両方がいくつかの良いアドバイスを提供しているので、彼らのアドバイスを参考にして、何かを実装できないかどうかを確認したいと思いました。以下を参照してください。

プラグインがアクティブ化されるたびにすべてのアクティブなプラグインのヘッダーメタデータを解析し、各プラグインのすべてのメタデータをの配列オプションに格納するWP Active Plugins Dataと呼ばれるプラグインは次のとおりwp_optionsです。通常のWordPressプラグインとマルチサイトのサイト全体のプラグインの両方のために設計しました。ここからgistからダウンロードできますが、レビューのためにここにもコードをコピーしました。

<?php
/*
Plugin Name: WP Active Plugins Data
Plugin URI: http://mikeschinkel.com/wordpress-plugins/wp-active-plugins-data/
Description: Loads Plugin Data on Plugin Activation and Persists to wp_options for quick retrieval.
Version: 0.1
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
Note: Written for http://wordpress.stackexchange.com/questions/361/is-there-a-way-for-a-plug-in-to-get-its-own-version-number
*/

require_once(ABSPATH.'wp-admin/includes/plugin.php');

function get_active_plugin_version($plugin_path_file, $sitewide = false) {
    return get_active_plugin_attribute($plugin_path_file,'Version');
}
function get_active_plugin_attribute($plugin_path_file, $attribute) {
    $all_plugins_data = get_active_plugins_data($plugin_path_file,$sitewide);
    return (isset($all_plugins_data[$attribute]) ? $all_plugins_data[$attribute] : false);
}
function get_active_plugins_data($plugin_path_file, $sitewide = false) {
    $failsafe = false;
    $plugin = plugin_basename(trim($plugin_path_file));
    $sitewide = (is_multisite() && ( $sitewide || is_network_only_plugin($plugin)));
    if ($sitewide) {
        $all_plugins_data = get_site_option('active_sitewide_plugin_data',array());
    } else {
        $all_plugins_data = get_option('active_plugin_data',array());
    }
    if (!$failsafe && !is_array($all_plugins_data) || count($all_plugins_data)==0) {
        $failsafe = true; // Don't risk infinite recursion
        if ($sitewide) {
            $active_plugins = get_site_option('active_sitewide_plugins',array());
        } else {
            $active_plugins = get_option('active_plugins',array());
        }
        persist_active_plugin_data(null,$active_plugins,$sitewide);
        $all_plugins_data = get_active_plugin_version($plugin_path_file,$sitewide);
    }
    return $all_plugins_data[$plugin_path_file];
}
add_action('update_site_option_active_sitewide_plugins','persist_sitewide_active_plugin_data',10,2);
function persist_sitewide_active_plugin_data($option, $plugins) {
    persist_active_plugin_data(null,$plugins,'sitewide');
}
add_filter('update_option_active_plugins','persist_active_plugin_data',10,2);
function persist_active_plugin_data($old_plugins, $new_plugins, $sitewide=false) {
    $active_plugin_data = array_flip($new_plugins);
    $plugin_dir = WP_PLUGIN_DIR;
    foreach($new_plugins as $plugin) {
        $active_plugin_data[$plugin] = get_plugin_data("$plugin_dir/$plugin");
    }
    if ($sitewide)
        update_site_option('active_sitewide_plugin_data',$active_plugin_data);
    else
        update_site_option('active_plugin_data',$active_plugin_data);
}

それがどのように機能するかを見たいですか?WordPressサイトのルートにドロップできるテストファイルを次に示します(http://example.com/test.php)。テストする前に、このプラグインとAkismetの両方がアクティブになっていることを確認してください。

<?php
/*
* test.php - Place in root of WordPress website.
*
* Before running be sure to activate both Akismet and the WP Active Plugin Data plugin
*
*/

include "wp-load.php";

header('Content-type:text/plain');
$akismet = "akismet/akismet.php";
echo "Akismet Version: " . get_active_plugin_version($akismet);
echo "\n\nAkismet Description: " . get_active_plugin_attribute($akismet,'Description');
echo "\n\nAll Akismet Data:\n";
print_r(get_active_plugins_data($akismet));

それがあなたが正確に必要とするものではない場合、それはあなたに良い出発点を与えるでしょう。お役に立てれば。


+1。よくできました、マイク。このStackExchangeからいくつのプラグインが出てくるのでしょうか。:)
Annika Backstrom

ありがとう。実際、私は多くのことを期待していますが、最良のものだけがリポジトリに移行することも期待しています。現在、ゴミが多すぎます!
MikeSchinkel、2010

2

プラグインのメタデータ(ファイルの先頭にあるもの)を解析できますが、一致するバージョン番号を使用して独自のPHP変数を設定した方がパフォーマンスが向上します。プラグインを更新するときは、両方のバージョン番号を更新してください。

短期的には少し作業量が増えますが、長期的にはかなり改善されます。


変数を定義するだけでパフォーマンスが向上する場合がありますが、バージョン番号を2か所で変更することもあまり適切ではありません。テーマについては、さえの例で使用されて似た機能wp_get_themeがあります:codex.wordpress.org/Child_Themes我々は変数を介してプラグインのバージョンを設定し、再利用することができればそれはWordPressで悪いデザインのように見えるが、それは良いだろうwp_enqueue_styleおよびwp_enqueue_script関数を持つ変数。
baptx

これは正しいですが、Wordpressがすべてのリクエストで実行する他のすべてのことを考慮すると、これは1つの最適化は無視できます。言い換えれば、それは問題ではありません
ポールコル。

1

管理画面にあります:get_plugin_data()。テンプレートでは、定数またはグローバルなどを設定し、その値をプラグインヘッダーのバージョン番号と同期させるなど、PHPでデータを保持するプラグインが必要になると思います。

wp-settings.phpwp_get_active_and_valid_plugins()active_pluginsサイトオプションからデータを取得します。このオプションには、プラグインファイルへのパスのみが含まれ、ファイルでwp-settings.phpのみ実行include_onceされるため、プラグインメタデータの解析は行われません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.