問題描述

想知道是否有類或編程技術,允許我檢查特定插件的安裝和激活,如果沒有安裝插件,請從 WordPress 的插件庫中下載?

我有一個插件,我想要 scribu 的 Post 2 Post 插件,我想知道如何做到這一點?

最佳解決方案

我會鼓勵反對這個,但我明白你想做什麼,做一些類似的事情。

我怎麼做

我構建依賴於插件的插件,依賴於插件的插件和依賴於其他插件的插件的插件。如果我控制發展的雙方,我做兩件事情

在其他東西需要的插件中:

add_filter( 'my-cool-plugin-name-installed', '__return_true' );

在需要其他插件的插件/主題中:

if ( ! apply_filters( 'my-cool-plugin-name-installed', false ) )
    add_action( 'admin_notices', 'my-cool-plugin-name_not_installed' );

然後,我添加一個明亮的 「請安裝我的 super-cool 插件」 通知到管理屏幕的頂部與鏈接到下載頁面。

這給了我一個確定的方式來檢查我的依賴項是否存在並被安裝。如果插件已安裝但未激活,警告仍然顯示。

其他方式

@tollmanz 已經推薦了另一個選項。我不會 copy-paste 他的解決方案,但檢查您的依賴插件的核心功能的存在是一個偉大的方式來確保它在那裏。

再次,如果插件安裝但不活動,則此路由將僅檢測其是否處於活動狀態。

為什麼我這樣做

首先,我不喜歡別人的工具下載額外的東西到我的網站。所以我不強迫這個範例給其他用户。相反,我提示他們下載額外的代碼,並將它們指向正確的方向。更簡單的方法是與自動化安裝程序配合使用,以便他們可以通過單擊來拉下插件。

此外,我的代碼的幾個用户在服務器上,他們無法使用 one-click 安裝程序 (或自動下載) 。他們必須安裝 FTP 插件,所以無聲的 download-and-activate-a-dependency 系統根本無法工作。

最後,如果你正在使用別人的代碼,那麼當他們發佈新版本 (如果它們引入了錯誤) 或 if they’re hacked 時,你可以對它們進行 0 控制。所以不要自動安裝你不能聲明責任的代碼。

次佳解決方案

處理類似情況的方法是在插件依賴關係中查找核心類或函數,並檢查它是否存在。例如,我構建了一個依賴於簡單術語元插件的插件。我檢查了它使用:

if(!function_exists('simple_term_meta_install'))
{
    // Do stuff to download plugin
}

在我的插件中,我只是用插件打包了這個插件。我只會運行它,如果它還沒有安裝。

您的其他選項將是提示用户下載插件並進行安裝。

關於如何自動下載… 我不知道。我會看看 WP 核心如何管理這個,並嘗試從內置系統中收集一些知識。

第三種解決方案

關於 EAMann 的通知想法,您可以在管理員通知中添加一個鏈接,該鏈接將管理員添加到添加插件中的搜索結果頁面。由於指定的名稱是其結果中首先列出的確切名稱。所有需要的是單擊立即安裝鏈接。

function posts_2_posts_required() {
    $url = network_admin_url( 'plugin-install.php?tab=search&type=term&s=Posts+2+Posts&plugin-search-input=Search+Plugins' );
    echo '
    <div class="error">
        <p>The <a href="http://'%20.%20$url%20.%20'">Posts 2 Posts Plugin</a> is required.</p>
    </div>
    ';
}

function check_required_plugins() {
    if ( current_user_can( 'activate_plugins' ) ) {
        include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
        if ( ! is_plugin_active( 'posts-2-posts/posts-2-posts.php' ) )
            add_action( 'admin_notices', 'posts_2_posts_required' );
    }
}
add_action( 'plugins_loaded', 'check_required_plugins' );

要訪問 current_user_can(),您需要等待插件加載,因此 plugins_loaded 操作。無論您的站點是否設置為多站點,network_admin_url()將返回正確的 URL 。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。