Apakah ada cara bagi plug-in untuk mendapatkan nomor versi sendiri?

8

Apakah ada API yang dapat saya panggil, di dalam plug-in saya, untuk menentukan versi plug-in?

Saya hanya ingin plugin saya memancarkan komentar html dengan nomor versi sendiri ... untuk tujuan diagnostik.

David G
sumber

Jawaban:

9

@david : @Adam Backtrom dan @ Viper007Bond memberikan beberapa saran bagus, jadi saya pikir saya akan mengambil saran mereka dan melihat apakah saya tidak dapat mengimplementasikan sesuatu, lihat di bawah.

Apa yang mengikuti iS sebuah plugin bernama WP Active Plugins Data yang mem-parsing metadata header untuk semua plugin yang aktif setiap kali plugin diaktifkan dan menyimpan semua metadata untuk setiap plugin ke dalam opsi array di wp_options. Saya mendesainnya untuk plugin WordPress reguler dan plugin multisite untuk seluruh situs. Anda dapat mengunduhnya di sini dari intisari tetapi saya juga menyalin kode di sini untuk ulasan Anda:

<?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);
}

Ingin melihat cara kerjanya? Berikut ini adalah file uji yang dapat Anda masukkan di root situs WordPress Anda ( http://example.com/test.php.) Pastikan Anda telah mengaktifkan plugin ini dan Akismet sebelum Anda mengujinya.

<?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));

Jika tidak tepat yang Anda butuhkan setidaknya itu akan memberi Anda titik awal yang baik. Semoga ini membantu.

MikeSchinkel
sumber
+1. Kerja bagus, Mike. Saya bertanya-tanya berapa banyak plugin yang akan keluar dari StackExchange ini. :)
Annika Backstrom
Terima kasih. Sebenarnya, saya berharap banyak tetapi saya juga berharap hanya yang terbaik yang masuk ke repositori. Ada terlalu banyak sampah di sana sekarang!
MikeSchinkel
2

Anda dapat menguraikan meta data plugin Anda (hal-hal di bagian atas file), tetapi lebih baik untuk kinerja jika Anda hanya mengatur variabel PHP Anda sendiri dengan nomor versi yang cocok. Saat Anda memperbarui plugin, perbarui kedua nomor versi.

Ini sedikit lebih bekerja untuk Anda dalam jangka pendek, tetapi jauh lebih baik dalam jangka panjang.

Viper007Bond
sumber
Mungkin lebih baik bagi kinerja untuk hanya mendefinisikan variabel tetapi juga tidak terlalu baik untuk mengubah nomor versi di 2 tempat. Untuk tema, ada fungsi serupa wp_get_theme yang bahkan digunakan dalam contoh: codex.wordpress.org/Child_Themes Sepertinya desain yang buruk di WordPress, akan lebih baik jika kita dapat mengatur versi plugin melalui variabel dan kemudian menggunakan kembali variabel dengan fungsi wp_enqueue_style dan wp_enqueue_script.
baptx
ini benar, bagaimanapun, ini adalah salah satu optimasi akan diabaikan mengingat semua yang dilakukan Wordpress pada setiap permintaan. Dengan kata lain, itu tidak masalah
paulcol.
1

Ada di layar admin: get_plugin_data(). Dalam templat, saya pikir Anda akan memerlukan plugin untuk menyimpan data itu dalam PHP, misalnya, menetapkan konstanta atau global atau sesuatu, dan menjaga nilai itu disinkronkan dengan nomor versi header plugin.

wp-settings.phppanggilan wp_get_active_and_valid_plugins(), yang menarik data dari active_pluginsopsi situs. Opsi ini hanya berisi path ke file plugin, dan wp-settings.phphanya berjalan include_oncepada file, jadi itu tidak pernah diuraikan untuk metadata plugin.

Annika Backstrom
sumber