Eklenti nasıl yapılır ek eklenti gerektirir?


30

Bir ana eklentiye ekstra işlevsellik katan bir eklenti inşa ediyorum. İdeal olarak, eklenti yönetim ekranında, "etkinleştirme" bağlantısı devre dışı bırakılmalı ve kullanıcının mevcut eklentiyi kullanmadan önce ana eklentiyi yüklemesini ve etkinleştirmesini söyleyen bir satır içi not eklenmelidir.


1
Peki ya: is_plugin_active ()? örneğin: if (is_plugin_active('path/to/plugin.php')) { // Do something }
TomC

Yanıtlar:


35

Cevaplar için teşekkürler çocuklar. Her iki cevap da beni doğru yola koysa da, hiçbiri kutudan çıktı. Bu yüzden aşağıda çözümlerimi paylaşıyorum.

Yöntem 1 - register_activation_hook kullanma:

Eklentiler / parent-plugin / parent-plugin.php içinde Üst Eklentiyi oluşturun:

<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/

Eklentiler / child-plugin / child-plugin.php içinde Çocuk Eklentisini oluşturun:

<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
register_activation_hook( __FILE__, 'child_plugin_activate' );
function child_plugin_activate(){

    // Require parent plugin
    if ( ! is_plugin_active( 'parent-plugin/parent-plugin.php' ) and current_user_can( 'activate_plugins' ) ) {
        // Stop activation redirect and show error
        wp_die('Sorry, but this plugin requires the Parent Plugin to be installed and active. <br><a href="' . admin_url( 'plugins.php' ) . '">&laquo; Return to Plugins</a>');
    }
}

Ben kullanmıyorum o Bildirimi deactivate_plugins( $plugin );çalışmıyor nedense olarak. Bu yüzden aktivasyon yönlendirmesini iptal etmek ve kullanıcıyı bilgilendirmek için wp_die kullandım.

Avantajı:

  • Basit çözüm ve yöntem 2'ye kıyasla ek db isabetleri olmaz

Dezavantajları:

  • wp_die ekranı çirkin
  • Eklenti yönetici ekranındaki onay kutularını kullanarak Ebeveyn Eklentisi ve Çocuk Eklentisini aynı anda etkinleştirdiyseniz, wp_die ekranı görünecektir.

Yöntem 2 - admin_init ve admin_notices kullanma

Eklentiler / parent-plugin / parent-plugin.php içinde Üst Eklentiyi oluşturun:

<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/

Eklentiler / child-plugin / child-plugin.php içinde Çocuk Eklentisini oluşturun:

<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
add_action( 'admin_init', 'child_plugin_has_parent_plugin' );
function child_plugin_has_parent_plugin() {
    if ( is_admin() && current_user_can( 'activate_plugins' ) &&  !is_plugin_active( 'parent-plugin/parent-plugin.php' ) ) {
        add_action( 'admin_notices', 'child_plugin_notice' );

        deactivate_plugins( plugin_basename( __FILE__ ) ); 

        if ( isset( $_GET['activate'] ) ) {
            unset( $_GET['activate'] );
        }
    }
}

function child_plugin_notice(){
    ?><div class="error"><p>Sorry, but Child Plugin requires the Parent plugin to be installed and active.</p></div><?php
}

Avantajı:

  • Ebeveyn ve Çocuk eklentisini aynı anda etkinleştirdiğinizde onay kutularını kullanarak çalışır

dezavantajı:

  • Eklenti aslında ilk başta aktive edildiğinde ve admin_init çalıştırıldıktan sonra devre dışı bırakıldığı için ilave db isabetleri de ekleyin.

Etkinleştir bağlantısını devre dışı bırakmayla ilgili soruma gelince, şunları kullanabilirim:

add_filter( 'plugin_action_links', 'disable_child_link', 10, 2 );
function disable_child_link( $links, $file ) {

    if ( 'child-plugin/child-plugin.php' == $file and isset($links['activate']) )
        $links['activate'] = '<span>Activate</span>';

    return $links;
}

Bununla birlikte, bu kodu koyacak bir yer olmadığı için pratik olmadığı ortaya çıktı. Ebeveyn eklentisinin bu kodun çalışması için aktif olması gerektiğinden ebeveyn eklentisine ekleyemedim. Kesinlikle çocuk eklentisine ya da functions.php'ye ait değil. Bu yüzden bu fikri siliyorum.


1
Yöntem 2 harika çalıştı! Başka birinin eklentisini genişletmek için kullandım.
Collin Fiyatı

2

Bunu deneyin, yorumlandı, böylece anlamanıza yardımcı olacak.

<?php
register_activation_hook( __FILE__, 'myplugin_activate' ); // Register myplugin_activate on
function myplugin_activate() {
    $plugin = plugin_basename( __FILE__ ); // 'myplugin'
    if ( is_plugin_active( 'plugin-directory/first-plugin.php' ) ) {
        // Plugin was active, do hook for 'myplugin'
    } else {
        // Plugin was not-active, uh oh, do not allow this plugin to activate
        deactivate_plugins( $plugin ); // Deactivate 'myplugin'
    }
}
?> 

Bu bir hata verirse, 'myplugin' öğesinin 'seçeneğini' işaretleyebilir ve yanlış veya etkinleştirilmemiş olarak ayarlayabilirsiniz.


2

Önerilen çözümlerin her ikisinin de kusurları vardır.

Yöntem 1: Belirtildiği gibi, wp_die () ekranı, Eklenti yönetici ekranındaki onay kutularını kullanarak Ebeveyn Eklentisi ve Çocuk Eklentisi aynı anda etkinleştiğinde görünecektir.

Yöntem 2: Bazı kullanım durumlarında 'admin_init', 'plugins_loaded' ( https://codex.wordpress.org/Plugin_API/Action_Reference ) sonrasında ve kaldırma kancasından sonra yürütüldüğünden iyi değil https: // codex . wordpress.org/Function_Reference/register_uninstall_hook ). Örneğin, eğer eklentinin ana eklentinin aktif olup olmadığına bakılmaksızın, kaldırmayla ilgili bazı kodlar çalıştırılmasını istiyorsak, bu yaklaşım çalışmayacak.

Çözüm:

Öncelikle, ana eklentinin ana PHP dosyasının sonuna aşağıdaki kodu eklememiz gerekir:

do_action( 'my_plugin_loaded' );

Bu, tüm eklentilere çekirdek eklentinin yüklendiğini söyleyen bir olay / sinyal gönderir.

Ardından, eklentinin sınıfı aşağıdaki gibi görünmelidir:

class My_Addon
{
    static function init ()
    {
        register_activation_hook( __FILE__, array( __CLASS__, '_install' ) );

        if ( ! self::_is_parent_active_and_loaded() ) {
            return;
        }
    }

    #region Parent Plugin Check

    /**
     * Check if parent plugin is activated (not necessarly loaded).
     *
     * @author Vova Feldman (@svovaf)
     *
     * @return bool
     */
    static function _is_parent_activated()
    {
        $active_plugins_basenames = get_option( 'active_plugins' );
        foreach ( $active_plugins_basenames as $plugin_basename ) {
            if ( false !== strpos( $plugin_basename, '/my-plugin-main-file.php' ) ) {
                return true;
            }
        }

        return false;
    }

    /**
     * Check if parent plugin is active and loaded.
     *
     * @author Vova Feldman (@svovaf)
     *
     * @return bool
     */
    static function _is_parent_active_and_loaded()
    {
        return class_exists( 'My_Plugin' );
    }

    /**
     *
     * @author Vova Feldman (@svovaf)
     */
    static function _install()
    {
        if ( ! self::_is_parent_active_and_loaded() ) {
            deactivate_plugins( basename( __FILE__ ) );

            // Message error + allow back link.
            wp_die( __( 'My Add-on requires My Plugin to be installed and activated.' ), __( 'Error' ), array( 'back_link' => true ) );
        }
    }

    #endregion Parent Plugin Check
}

if (My_Addon::_is_parent_active_and_loaded())
{
    // If parent plugin already included, init add-on.
    My_Addon::init();
}
else if (My_Addon::_is_parent_activated())
{
    // Init add-on only after the parent plugins is loaded.
    add_action( 'my_plugin_loaded', array( __CLASS__, 'init' ) );
}
else
{
    // Even though the parent plugin is not activated, execute add-on for activation / uninstall hooks.
    My_Addon::init();
}

Umarım yardımcı olur :)


4
Bu cevabın da bir kusuru vardır. :-) do_action ('my_plugin_loaded') ekleyebileceğiniz ana eklenti üzerinde tam kontrolünüz olduğunu varsayar; kodunda. Seçilen cevap, ebeveyn eklentisinin kontrolü ile veya kontrolsüz olarak çalışacaktır (örneğin ebeveyn eklentisi sizin değildir)
kosinix

Teşekkürler, bu tam olarak aradığım şeydi. Benim durumumda, ben yapmak ebeveyn eklentisi üzerinde tam kontrole sahip ve bağımlılık bu tür oluşturmak için gerekli.
cr0ybot

0

TGM Eklentisi Aktivasyonuna ihtiyacınız olduğunu düşünüyorum .

TGM Plugin Activation , WordPress temalarınız (ve eklentileriniz) için eklentileri kolayca talep etmenizi veya önermenizi sağlayan bir PHP kütüphanesidir. Kullanıcılarınızın yerel WordPress sınıflarını, işlevlerini ve arayüzlerini kullanarak eklentileri tekil veya toplu biçimde otomatik olarak kurmalarını, güncellemelerini ve hatta etkinleştirmelerini sağlar. Birlikte verilen eklentilere, WordPress Plugin Repository'deki eklentilere ve hatta internette başka bir yerde barındırılan eklentilere başvurabilirsiniz.


Yanlış link. Burada
XedinBilinmeyen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.