কীভাবে একটি প্লাগইন তৈরি করতে অন্য প্লাগইন প্রয়োজন?


30

আমি একটি প্লাগইন তৈরি করছি যা একটি প্রধান প্লাগইনে অতিরিক্ত কার্যকারিতা যুক্ত করে। আদর্শভাবে প্লাগইন প্রশাসনের পর্দায়, "অ্যাক্টিভেট" লিঙ্কটি অক্ষম করা উচিত এবং একটি ইনলাইন নোট যুক্ত করা উচিত যা ব্যবহারকারীকে বর্তমান প্লাগইনটি ব্যবহার করার আগে প্রথমে মূল প্লাগইন ইনস্টল করতে এবং সক্রিয় করতে বলে।


1
ব্যবহার সম্পর্কে কি: is_plugin_active ()? যেমন: if (is_plugin_active('path/to/plugin.php')) { // Do something }
টমসি

উত্তর:


35

বন্ধুরা, উত্তরগুলির জন্য ধন্যবাদ। যদিও উভয় উত্তরই আমাকে সঠিক পথে চালিত করেছে, তবুও বাক্সটির বাইরে কোনও কাজ হয়নি। সুতরাং আমি আমার সমাধানগুলি নীচে ভাগ করছি।

পদ্ধতি 1 - রেজিস্টার_অ্যাক্টিভেশন_হুক ব্যবহার করে:

প্লাগইন / প্যারেন্ট-প্লাগইন / প্যারেন্ট-প্লাগইন.এফপিতে প্যারেন্ট প্লাগইন তৈরি করুন:

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

প্লাগইন / চাইল্ড-প্লাগইন / চাইল্ড-প্লাগইন.এফপি-এ চাইল্ড প্লাগইন তৈরি করুন:

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

লক্ষ্য করুন যে আমি deactivate_plugins( $plugin );কোনও কারণে এটি ব্যবহার করি না এটি কার্যকর হয় না। সক্রিয়করণ পুনঃনির্দেশ বাতিল করতে এবং ব্যবহারকারীকে অবহিত করতে আমি wp_die ব্যবহার করেছি।

সুবিধা:

  • সহজ সমাধান এবং পদ্ধতির 2 এর তুলনায় অতিরিক্ত ডিবি হিট খরচ করে না

অসুবিধা:

  • wp_die স্ক্রিনটি কুরুচিপূর্ণ
  • আপনি প্লাগিন অ্যাডমিন স্ক্রিনে চেকবক্সগুলি একই সাথে প্যারেন্ট প্লাগইন এবং চাইল্ড প্লাগইনটি সক্রিয় করে দিলে wp_die স্ক্রিনটি এখনও প্রদর্শিত হবে।

পদ্ধতি 2 - অ্যাডমিন_নিট এবং অ্যাডমিন_নোটিস ব্যবহার করে

প্লাগইন / প্যারেন্ট-প্লাগইন / প্যারেন্ট-প্লাগইন.এফপিতে প্যারেন্ট প্লাগইন তৈরি করুন:

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

প্লাগইন / চাইল্ড-প্লাগইন / চাইল্ড-প্লাগইন.এফপি-এ চাইল্ড প্লাগইন তৈরি করুন:

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

সুবিধা:

  • আপনি যখন একই সময়ে চেকবক্সগুলি ব্যবহার করে পিতামাতা এবং শিশু প্লাগইনকে সক্রিয় করেন তখন কাজ করে

অসুবিধা:

  • অ্যাডমিন_ইনিট চালানোর পরে প্লাগইনটি আসলে প্রথমে সক্রিয় এবং নিষ্ক্রিয় হওয়ার কারণে অতিরিক্ত ডিবি হিট হয়।

সক্রিয় লিঙ্কটি অক্ষম করার বিষয়ে আমার প্রশ্নের হিসাবে, আমি ব্যবহার করতে পারি:

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

তবে, এই কোডটি রাখার মতো কোনও জায়গা নেই বলে এটি অত্যন্ত ব্যবহারিক হয়ে উঠেছে। এই কোডটি চালানোর জন্য প্যারেন্ট প্লাগইনটি সক্রিয় হওয়া উচিত বলে আমি এটি প্যারেন্ট প্লাগইনে রাখতে পারি না। অবশ্যই চাইল্ড প্লাগইন বা ফাংশন.এফপি-র অন্তর্ভুক্ত নয়। সুতরাং আমি এই ধারণা স্ক্র্যাপ করছি।


1
পদ্ধতি 2 দুর্দান্ত কাজ! আমি এটি অন্য কারও প্লাগইন প্রসারিত করতে ব্যবহার করেছি।
কলিনের দাম

2

এটি চেষ্টা করে দেখুন, এটি মন্তব্য করেছে, যাতে এটি আপনাকে বুঝতে এটি সহায়তা করে।

<?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'
    }
}
?> 

এটি যদি কোনও ত্রুটি ছুঁড়ে ফেলে তবে আপনি 'মাইপ্লাগিন' এর 'বিকল্প' পরীক্ষা করে এটি মিথ্যাতে সেট করতে পারেন বা সক্রিয় নয়।


2

প্রস্তাবিত উভয় সমাধানেরই ত্রুটি রয়েছে।

পদ্ধতি 1: উল্লিখিত হিসাবে, wp_die () স্ক্রিনটি যখন পল্ট প্লাগইন এবং চাইল্ড প্লাগইন একই সাথে প্লাগইন অ্যাডমিন স্ক্রিনে চেকবক্সগুলি ব্যবহার করে সক্রিয় হবে তখন দেখা যাবে।

পদ্ধতি 2: কিছু ব্যবহার-ক্ষেত্রে এটি 'প্লাগইনসলোড' ( https://codex.wordpress.org/Plugin_API/Action_References ) এর পরে অ্যাডমিন_ইনিট কার্যকর করার পরে , এবং আনইনস্টল হুক ( https: // কোডেক্স ) পরে কার্যকর হয় না । wordpress.org/Function_References/register_uninstall_hook )। সুতরাং উদাহরণস্বরূপ, আমরা যদি পিতামাতা প্লাগইনটি সক্রিয় থাকিও বা না আনইনস্টল করার জন্য কিছু কোড অ্যাড-অনটি চালাতে চাই, তবে এই পদ্ধতির কাজ হবে না।

সমাধান:

প্রথমত, প্যারেন্ট প্লাগইনের মূল পিএইচপি ফাইলের শেষে আমাদের নীচের কোডটি যুক্ত করতে হবে:

do_action( 'my_plugin_loaded' );

এটি সমস্ত গ্রাহকদের কাছে একটি ইভেন্ট / সংকেত প্রেরণ করবে, এটি জানিয়েছে যে মূল প্লাগইনটি লোড হয়েছে।

তারপরে, অ্যাড-অনের ক্লাসটি নিম্নলিখিতগুলির মতো হওয়া উচিত:

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

আশা করি এটা সাহায্য করবে :)


4
এই উত্তরের একটি ত্রুটিও রয়েছে। :-) এটি ধরে নিয়েছে যে প্যারেন্ট প্লাগইনে আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে যেখানে আপনি do_action ('my_plugin_loaded') যুক্ত করতে পারবেন; এর কোডে নির্বাচিত উত্তরটি প্যারেন্ট প্লাগইনটির সাথে বা নিয়ন্ত্রণ ছাড়াই কাজ করবে (যেমন প্যারেন্ট প্লাগইন আপনার নয়)
kosinix

আপনাকে ধন্যবাদ, আমি ঠিক এটিই খুঁজছিলাম আমার ক্ষেত্রে, আমি কি করতে পিতা বা মাতা প্লাগইন উপর পূর্ণ নিয়ন্ত্রণ আছে, এবং নির্ভরতা এই ধরনের তৈরি করার প্রয়োজন ছিল।
cr0ybot

0

আমার মনে হয় আপনার টিজিএম প্লাগইন অ্যাক্টিভেশন দরকার ।

টিজিএম প্লাগইন অ্যাক্টিভেশন একটি পিএইচপি গ্রন্থাগার যা আপনাকে সহজেই আপনার ওয়ার্ডপ্রেস থিম (এবং প্লাগইন) এর জন্য প্লাগইনগুলির প্রয়োজন বা সুপারিশ করতে দেয়। এটি আপনার ব্যবহারকারীদের দেশীয় ওয়ার্ডপ্রেস ক্লাস, ফাংশন এবং ইন্টারফেস ব্যবহার করে একক বা বাল্ক ফ্যাশনে প্লাগইন ইনস্টল করতে, আপডেট করতে এবং স্বয়ংক্রিয়ভাবে সক্রিয় করতে দেয়। আপনি বান্ডেলযুক্ত প্লাগইনগুলি, ওয়ার্ডপ্রেস প্লাগইন রিপোজিটরি থেকে প্লাগইন এমনকি ইন্টারনেটে অন্য কোথাও হোস্ট করা প্লাগইনগুলি উল্লেখ করতে পারেন।


ভুল লিঙ্ক। লিঙ্কটি এখানে
XedinUnmitted
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.