Có cách nào để trình cắm có được số phiên bản của chính nó không?


8

Có API nào tôi có thể gọi, bên trong trình cắm của mình để xác định phiên bản của trình cắm không?

Tôi chỉ muốn trình cắm của mình phát ra một nhận xét html với số phiên bản của chính nó ... cho mục đích chẩn đoán.

Câu trả lời:


9

@david : Cả @Adam Backtrom và @ Viper007Bond đều đưa ra một số lời khuyên tốt vì vậy tôi nghĩ tôi sẽ nhận lời khuyên của họ và xem liệu tôi không thể thực hiện điều gì đó, xem bên dưới.

Cái gì sau iS một plugin có tên WP Active Plugins Data phân tích siêu dữ liệu tiêu đề cho tất cả các plugin đang hoạt động bất cứ lúc nào bất kỳ plugin nào được kích hoạt và nó lưu trữ tất cả siêu dữ liệu cho mỗi plugin vào một tùy chọn mảng wp_options. Tôi đã thiết kế nó cho cả plugin WordPress thông thường và plugin nhiều trang web. Bạn có thể tải xuống ở đây từ ý chính nhưng tôi cũng đã sao chép mã ở đây để bạn xem xét:

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

Bạn muốn xem làm thế nào nó hoạt động? Đây là một tệp thử nghiệm mà bạn có thể thả vào thư mục gốc của trang web WordPress của mình ( http://example.com/test.php.) Hãy chắc chắn rằng bạn đã kích hoạt cả plugin này và Akismet trước khi kiểm tra nó.

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

Nếu nó không chính xác những gì bạn cần ít nhất thì nó sẽ cho bạn một điểm khởi đầu tốt. Hi vọng điêu nay co ich.


+1. Làm tốt lắm, Mike. Tôi tự hỏi có bao nhiêu plugin sẽ ra khỏi StackExchange này. :)
Annika Backstrom

Cảm ơn. Trên thực tế, tôi hy vọng rất nhiều nhưng tôi cũng hy vọng rằng chỉ có những thứ tốt nhất mới được đưa vào kho lưu trữ. Có quá nhiều rác ngay bây giờ!
MikeSchinkel

2

Bạn có thể phân tích dữ liệu meta của plugin (thứ đó ở đầu tệp), nhưng sẽ tốt hơn cho hiệu suất nếu bạn chỉ đặt biến PHP của riêng mình với số phiên bản phù hợp. Khi bạn cập nhật plugin, chỉ cần cập nhật cả hai số phiên bản.

Đó là công việc hơi nhiều cho bạn trong ngắn hạn, nhưng tốt hơn rất nhiều trong dài hạn.


Hiệu suất có thể tốt hơn khi chỉ xác định một biến nhưng cũng không hay lắm khi thay đổi số phiên bản ở 2 vị trí. Đối với các chủ đề, có một chức năng tương tự wp_get_theme thậm chí được sử dụng trong các ví dụ: codex.wordpress.org/Child_Theme Có vẻ như là một thiết kế xấu trong WordPress, sẽ tốt hơn nếu chúng ta có thể đặt phiên bản plugin thông qua một biến và sau đó sử dụng lại biến với các hàm wp_enqueue_style và wp_enqueue_script.
baptx

Điều này là chính xác, tuy nhiên, đây là một tối ưu hóa sẽ không đáng kể khi xem xét mọi thứ khác mà Wordpress thực hiện trên mỗi yêu cầu. Nói cách khác, nó không thành vấn đề
paulcol.

1

Có trong màn hình quản trị : get_plugin_data(). Trong các mẫu, tôi nghĩ rằng bạn sẽ cần plugin để giữ dữ liệu đó trong PHP, ví dụ: đặt hằng số hoặc toàn cầu hoặc một cái gì đó và giữ giá trị đó được đồng bộ hóa với số phiên bản tiêu đề của plugin.

wp-settings.phpcác cuộc gọi wp_get_active_and_valid_plugins(), kéo dữ liệu từ active_pluginstùy chọn trang web. Tùy chọn này chỉ chứa đường dẫn đến tệp plugin và wp-settings.phpchỉ chạy include_oncetrên tệp, vì vậy nó không bao giờ được phân tích cú pháp cho siêu dữ liệu plugin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.