कई प्लगइन निर्देशिकाओं को जोड़ें


39

काम

आप register_theme_directory()अपने WP स्थापना के लिए अतिरिक्त थीम्स निर्देशिकाओं को पंजीकृत कर सकते हैं । अफसोस की बात यह है कि प्लगइन्स के लिए समान कार्यक्षमता नहीं है। हमारे पास पहले से ही MU-Plugin, Drop-Ins, Plugins और Themes हैं। लेकिन हमें एक बेहतर फ़ाइल संगठन के लिए और अधिक की आवश्यकता है।

यहां प्राप्त करने के लिए कार्यों की सूची दी गई है:

  • एक अतिरिक्त प्लगइन निर्देशिका जोड़ें
  • प्रत्येक प्लगइन निर्देशिका के लिए, एक नया "टैब" आवश्यक है जैसा कि यहां दिखाया गया है [1]
  • अतिरिक्त निर्देशिका में डिफ़ॉल्ट प्लगइन निर्देशिका के समान कार्यक्षमता होगी

वहाँ तुम्हारे लिए क्या है?

सबसे अच्छा और सबसे पूर्ण जवाब एक इनाम से सम्मानित किया जाएगा।


[१] एक नया प्लगइन फ़ोल्डर / निर्देशिका के लिए अतिरिक्त टैब


3
चूंकि निर्देशिका संरचना निर्देशिका के स्थिरांक से बहुत अच्छी तरह से जुड़ी हुई है, इसलिए मुझे संदेह है कि फ़ाइल सिस्टम स्तर पर ऐसा करना व्यावहारिक है (कोर अपनाने के बिना)। एक्सटेंशन में संगठन की वर्चुअल परत एक्सटेंशन स्तर पर प्राप्त करना आसान हो सकती है।
दुर्लभ

@Rarst जो आपको अपने विचारों को जोड़ने से पीछे नहीं हटना चाहिए :)
kaiser

यह एक बड़ी विशेषता होगी।
ltfishie

फीचर अच्छा लगता है। बस इंजीनियर कोर को उलटने की जरूरत है, यह पता करें कि यह कैसे किया जाना चाहिए (WP तरीका) और फिर देवताओं को एक पैच सबमिट करें ... आप register_theme_directory () - search_theme_directories () - get_raw_theme_root () - get_theme_roots देखना चाहते हैं () - get_theme () - get_themes ()
स्टर्लिंग हैमिल्टन

2
दोस्तों: क्या जमा करें ? यह एक प्रश्न है, पूर्ण विकसित कोड के साथ नहीं उत्तर :) FYI करें: एक वर्ग के लिए फिरget_themes() से लिखने के लिए trac पर एक नया टिकट
केसर

जवाबों:


28

ठीक है, मैं इस पर एक छुरा ले जाऊँगा। रास्ते में कुछ सीमाओं का सामना करना पड़ा:

  1. WP_List_Table के उपवर्गों में बहुत सारे फ़िल्टर नहीं हैं, कम से कम नहीं जहां हमें उनकी आवश्यकता है।

  2. फ़िल्टर की कमी के कारण, हम वास्तव में शीर्ष पर प्लगइन प्रकारों की एक सटीक सूची को बनाए नहीं रख सकते हैं।

  3. हमें प्लगइन्स को सक्रिय करने के लिए कुछ भयानक (पढ़ें: गंदे) जावास्क्रिप्ट हैक का भी उपयोग करना होगा।

मैंने अपना व्यवस्थापक क्षेत्र कोड एक वर्ग के अंदर लपेटा है, इसलिए मेरे फ़ंक्शन नाम उपसर्ग नहीं हैं। आप यहाँ इस कोड को देख सकते हैं । कृपया योगदान दें!

सेंट्रल एपीआई

एक साधारण फ़ंक्शन जो एक वैश्विक चर सेट करता है जिसमें हमारे प्लगइन निर्देशिकाएं एक सहयोगी सरणी में होंगी। $key, आदि आंतरिक रूप से उपयोग प्लगइन्स लाने के लिए कुछ होने जा रहा है $dirया तो करने के लिए एक पूर्ण पथ या कुछ और रिश्तेदार है wp-contentनिर्देशिका। $labelव्यवस्थापक क्षेत्र में हमारे प्रदर्शन के लिए होने जा रहा है (जैसे। एक अनुवाद करने योग्य स्ट्रिंग)।

<?php
function register_plugin_directory( $key, $dir, $label )
{
    global $wp_plugin_directories;
    if( empty( $wp_plugin_directories ) ) $wp_plugin_directories = array();

    if( ! file_exists( $dir ) && file_exists( trailingslashit( WP_CONTENT_DIR ) . $dir ) )
    {
        $dir = trailingslashit( WP_CONTENT_DIR ) . $dir;
    }

    $wp_plugin_directories[$key] = array(
        'label' => $label,
        'dir'   => $dir
    );
}

फिर, ज़ाहिर है, हमें प्लगइन्स लोड करने की आवश्यकता है। plugins_loadedरास्ते में देर से हुक और सक्रिय प्लगइन्स के माध्यम से जाना, प्रत्येक लोड हो रहा है।

व्यवस्थापक क्षेत्र

आइए एक वर्ग के अंदर अपनी कार्यक्षमता स्थापित करें।

<?php
class CD_APD_Admin
{

    /**
     * The container for all of our custom plugins
     */
    protected $plugins = array();

    /**
     * What custom actions are we allowed to handle here?
     */
    protected $actions = array();

    /**
     * The original count of the plugins
     */
    protected $all_count = 0;

    /**
     * constructor
     * 
     * @since 0.1
     */
    function __construct()
    {
        add_action( 'load-plugins.php', array( &$this, 'init' ) );
        add_action( 'plugins_loaded', array( &$this, 'setup_actions' ), 1 );

    }

} // end class

हम plugins_loadedवास्तव में जल्दी हुक करने जा रहे हैं और अनुमत "क्रियाएं" सेट करेंगे जिनका हम उपयोग कर रहे हैं। ये प्लगइन सक्रियण को संभालेगा और निष्क्रिय कर देगा क्योंकि अंतर्निहित कार्य इसे कस्टम निर्देशिकाओं के साथ नहीं कर सकता है।

function setup_actions()
{
    $tmp = array(
        'custom_activate',
        'custom_deactivate'
    );
    $this->actions = apply_filters( 'custom_plugin_actions', $tmp );
}

तो वहाँ समारोह में झुका है load-plugins.php। यह सभी प्रकार की मजेदार चीजें करता है।

function init()
{
    global $wp_plugin_directories;

    $screen = get_current_screen();

    $this->get_plugins();

    $this->handle_actions();

    add_filter( 'views_' . $screen->id, array( &$this, 'views' ) );

    // check to see if we're using one of our custom directories
    if( $this->get_plugin_status() )
    {
        add_filter( 'views_' . $screen->id, array( &$this, 'views_again' ) );
        add_filter( 'all_plugins', array( &$this, 'filter_plugins' ) );
        // TODO: support bulk actions
        add_filter( 'bulk_actions-' . $screen->id, '__return_empty_array' );
        add_filter( 'plugin_action_links', array( &$this, 'action_links' ), 10, 2 );
        add_action( 'admin_enqueue_scripts', array( &$this, 'scripts' ) );
    }
}

एक बार में उस एक चीज से गुजरते हैं। get_pluginsविधि, एक और समारोह के चारों ओर एक आवरण है। यह विशेषता pluginsको डेटा से भरता है ।

function get_plugins()
{
    global $wp_plugin_directories;
    foreach( array_keys( $wp_plugin_directories ) as $key )
    {
       $this->plugins[$key] = cd_apd_get_plugins( $key );
    }
}

cd_apd_get_pluginsget_pluginsहार्डकोड WP_CONTENT_DIRऔर pluginsव्यापार के बिना फ़ंक्शन में निर्मित का एक चीर है । मूल रूप से: $wp_plugin_directoriesवैश्विक से निर्देशिका प्राप्त करें , इसे खोलें, सभी प्लगइन फ़ाइलों को ढूंढें। बाद में उन्हें कैश में स्टोर करें।

<?php
function cd_apd_get_plugins( $dir_key ) 
{
    global $wp_plugin_directories;

    // invalid dir key? bail
    if( ! isset( $wp_plugin_directories[$dir_key] ) )
    {
        return array();
    }
    else
    {
        $plugin_root = $wp_plugin_directories[$dir_key]['dir'];
    }

    if ( ! $cache_plugins = wp_cache_get( 'plugins', 'plugins') )
        $cache_plugins = array();

    if ( isset( $cache_plugins[$dir_key] ) )
        return $cache_plugins[$dir_key];

    $wp_plugins = array();

    $plugins_dir = @ opendir( $plugin_root );
    $plugin_files = array();
    if ( $plugins_dir ) {
        while ( ( $file = readdir( $plugins_dir ) ) !== false ) {
            if ( substr($file, 0, 1) == '.' )
                continue;
            if ( is_dir( $plugin_root.'/'.$file ) ) {
                $plugins_subdir = @ opendir( $plugin_root.'/'.$file );
                if ( $plugins_subdir ) {
                    while (($subfile = readdir( $plugins_subdir ) ) !== false ) {
                        if ( substr($subfile, 0, 1) == '.' )
                            continue;
                        if ( substr($subfile, -4) == '.php' )
                            $plugin_files[] = "$file/$subfile";
                    }
                    closedir( $plugins_subdir );
                }
            } else {
                if ( substr($file, -4) == '.php' )
                    $plugin_files[] = $file;
            }
        }
        closedir( $plugins_dir );
    }

    if ( empty($plugin_files) )
        return $wp_plugins;

    foreach ( $plugin_files as $plugin_file ) {
        if ( !is_readable( "$plugin_root/$plugin_file" ) )
            continue;

        $plugin_data = get_plugin_data( "$plugin_root/$plugin_file", false, false ); //Do not apply markup/translate as it'll be cached.

        if ( empty ( $plugin_data['Name'] ) )
            continue;

        $wp_plugins[trim( $plugin_file )] = $plugin_data;
    }

    uasort( $wp_plugins, '_sort_uname_callback' );

    $cache_plugins[$dir_key] = $wp_plugins;
    wp_cache_set('plugins', $cache_plugins, 'plugins');

    return $wp_plugins;
}

अगला ऊपर वास्तव में सक्रिय और प्लगइन्स को निष्क्रिय करने का pesky व्यवसाय है। ऐसा करने के लिए, हम handle_actionsविधि का उपयोग करते हैं । यह, फिर से, मुख्य wp-admin/plugins.phpफ़ाइल के ऊपर से फट गया है ।

function handle_actions()
{
    $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';

    // not allowed to handle this action? bail.
    if( ! in_array( $action, $this->actions ) ) return;

    // Get the plugin we're going to activate
    $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : false;
    if( ! $plugin ) return;

    $context = $this->get_plugin_status();

    switch( $action )
    {
        case 'custom_activate':
            if( ! current_user_can('activate_plugins') )
                    wp_die( __('You do not have sufficient permissions to manage plugins for this site.') );

            check_admin_referer( 'custom_activate-' . $plugin );

            $result = cd_apd_activate_plugin( $plugin, $context );
            if ( is_wp_error( $result ) ) 
            {
                if ( 'unexpected_output' == $result->get_error_code() ) 
                {
                    $redirect = add_query_arg( 'plugin_status', $context, self_admin_url( 'plugins.php' ) );
                    wp_redirect( add_query_arg( '_error_nonce', wp_create_nonce( 'plugin-activation-error_' . $plugin ), $redirect ) ) ;
                    exit();
                } 
                else 
                {
                    wp_die( $result );
                }
            }

            wp_redirect( add_query_arg( array( 'plugin_status' => $context, 'activate' => 'true' ), self_admin_url( 'plugins.php' ) ) );
            exit();
            break;
        case 'custom_deactivate':
            if ( ! current_user_can( 'activate_plugins' ) )
                wp_die( __('You do not have sufficient permissions to deactivate plugins for this site.') );

            check_admin_referer('custom_deactivate-' . $plugin);
            cd_apd_deactivate_plugins( $plugin, $context );
            if ( headers_sent() )
                echo "<meta http-equiv='refresh' content='" . esc_attr( "0;url=plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s" ) . "' />";
            else
                wp_redirect( self_admin_url("plugins.php?deactivate=true&plugin_status=$context") );
            exit();
            break;
        default:
            do_action( 'custom_plugin_dir_' . $action );
            break;
    }

}

एक युगल कस्टम यहाँ फिर से कार्य करता है। cd_apd_activate_plugin(से फट गया activate_plugin) और cd_apd_deactivate_plugins(से फट गया deactivate_plugins)। दोनों हार्ड कोडित निर्देशिकाओं के बिना अपने संबंधित "मूल" कार्यों के समान हैं।

function cd_apd_activate_plugin( $plugin, $context, $silent = false ) 
{
    $plugin = trim( $plugin );

    $redirect = add_query_arg( 'plugin_status', $context, admin_url( 'plugins.php' ) );
    $redirect = apply_filters( 'custom_plugin_redirect', $redirect );

    $current = get_option( 'active_plugins_' . $context, array() );

    $valid = cd_apd_validate_plugin( $plugin, $context );
    if ( is_wp_error( $valid ) )
        return $valid;

    if ( !in_array($plugin, $current) ) {
        if ( !empty($redirect) )
            wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); // we'll override this later if the plugin can be included without fatal error
        ob_start();
        include_once( $valid );

        if ( ! $silent ) {
            do_action( 'custom_activate_plugin', $plugin, $context );
            do_action( 'custom_activate_' . $plugin, $context );
        }

        $current[] = $plugin;
        sort( $current );
        update_option( 'active_plugins_' . $context, $current );

        if ( ! $silent ) {
            do_action( 'custom_activated_plugin', $plugin, $context );
        }

        if ( ob_get_length() > 0 ) {
            $output = ob_get_clean();
            return new WP_Error('unexpected_output', __('The plugin generated unexpected output.'), $output);
        }
        ob_end_clean();
    }

    return true;
}

और निष्क्रिय करने का कार्य

function cd_apd_deactivate_plugins( $plugins, $context, $silent = false ) {
    $current = get_option( 'active_plugins_' . $context, array() );

    foreach ( (array) $plugins as $plugin ) 
    {
        $plugin = trim( $plugin );
        if ( ! in_array( $plugin, $current ) ) continue;

        if ( ! $silent )
            do_action( 'custom_deactivate_plugin', $plugin, $context );

        $key = array_search( $plugin, $current );
        if ( false !== $key ) {
            array_splice( $current, $key, 1 );
        }

        if ( ! $silent ) {
            do_action( 'custom_deactivate_' . $plugin, $context );
            do_action( 'custom_deactivated_plugin', $plugin, $context );
        }
    }

    update_option( 'active_plugins_' . $context, $current );
}

वहाँ भी cd_apd_validate_pluginसमारोह है, जो बंद है, validate_pluginहार्ड कोडित कबाड़ के बिना एक चीर बंद है ।

<?php
function cd_apd_validate_plugin( $plugin, $context ) 
{
    $rv = true;
    if ( validate_file( $plugin ) )
    {
        $rv = new WP_Error('plugin_invalid', __('Invalid plugin path.'));
    }

    global $wp_plugin_directories;
    if( ! isset( $wp_plugin_directories[$context] ) )
    {
        $rv = new WP_Error( 'invalid_context', __( 'The context for this plugin does not exist' ) );
    }

    $dir = $wp_plugin_directories[$context]['dir'];
    if( ! file_exists( $dir . '/' . $plugin) )
    {
        $rv = new WP_Error( 'plugin_not_found', __( 'Plugin file does not exist.' ) );
    }

    $installed_plugins = cd_apd_get_plugins( $context );
    if ( ! isset($installed_plugins[$plugin]) )
    {
        $rv = new WP_Error( 'no_plugin_header', __('The plugin does not have a valid header.') );
    }

    $rv = $dir . '/' . $plugin;
    return $rv;
}

ठीक है, उस रास्ते से बाहर। हम वास्तव में सूची तालिका प्रदर्शन के बारे में बात करना शुरू कर सकते हैं

चरण 1: तालिका के शीर्ष पर सूची में हमारे विचार जोड़ें। यह views_{$screen->id}हमारे initफ़ंक्शन के अंदर फ़िल्टर करके किया जाता है ।

add_filter( 'views_' . $screen->id, array( &$this, 'views' ) );

फिर वास्तविक झुका हुआ कार्य केवल लूप्स के माध्यम से होता है $wp_plugin_directories। यदि नव पंजीकृत निर्देशिकाओं में से एक में प्लगइन्स हैं, तो हम इसे प्रदर्शन में शामिल करेंगे।

function views( $views )
{
    global $wp_plugin_directories;

    // bail if we don't have any extra dirs
    if( empty( $wp_plugin_directories ) ) return $views;

    // Add our directories to the action links
    foreach( $wp_plugin_directories as $key => $info )
    {
        if( ! count( $this->plugins[$key] ) ) continue;
        $class = $this->get_plugin_status() == $key ? ' class="current" ' : '';
        $views[$key] = sprintf( 
            '<a href="%s"' . $class . '>%s <span class="count">(%d)</span></a>',
            add_query_arg( 'plugin_status', $key, 'plugins.php' ),
            esc_html( $info['label'] ),
            count( $this->plugins[$key] )
        );
    }
    return $views;
}

पहली बात यह है कि अगर हम कस्टम प्लगइन डायरेक्टरी पेज को देखना चाहते हैं, तो विचारों को फिर से फ़िल्टर करें। हमें inactiveगिनती से छुटकारा पाने की आवश्यकता है क्योंकि यह सटीक नहीं है। वहाँ कोई फिल्टर नहीं होने का एक परिणाम है जहाँ हम उन्हें होने की जरूरत है। फिर से हुक ...

if( $this->get_plugin_status() )
{
    add_filter( 'views_' . $screen->id, array( &$this, 'views_again' ) );
}

और एक त्वरित शुरुआत ...

function views_again( $views )
{
    if( isset( $views['inactive'] ) ) unset( $views['inactive'] );
    return $views;
}

अगला, चलो उन प्लगइन्स से छुटकारा पाएं जिन्हें आपने अन्यथा सूची तालिका में देखा होगा, और उन्हें हमारे कस्टम प्लगइन्स के साथ बदल दें। में हुक all_plugins

if( $this->get_plugin_status() )
{
    add_filter( 'views_' . $screen->id, array( &$this, 'views_again' ) );
    add_filter( 'all_plugins', array( &$this, 'filter_plugins' ) );
}

चूंकि हम पहले से ही अपने प्लगइन्स और डेटा सेट करते हैं ( setup_pluginsऊपर देखें ), filter_pluginsविधि सिर्फ (1) बाद के लिए सभी प्लगइन्स पर गिनती को बचाती है, और (2) प्लगइन्स को सूची तालिका में बदल देती है।

function filter_plugins( $plugins )
{
    if( $key = $this->get_plugin_status() )
    {
        $this->all_count = count( $plugins );
        $plugins = $this->plugins[$key];
    }
    return $plugins;
}

और अब हम बल्क एक्शन को मारेंगे। ये आसानी से समर्थित हो सकते हैं, मुझे लगता है?

if( $this->get_plugin_status() )
{
    add_filter( 'views_' . $screen->id, array( &$this, 'views_again' ) );
    add_filter( 'all_plugins', array( &$this, 'filter_plugins' ) );
    // TODO: support bulk actions
    add_filter( 'bulk_actions-' . $screen->id, '__return_empty_array' );
}

डिफ़ॉल्ट प्लगइन क्रियाएं लिंक हमारे लिए काम नहीं करने वाली हैं। इसलिए इसके बजाय, हमें अपना स्वयं का स्थापित करने की आवश्यकता है (कस्टम क्रियाओं के साथ, आदि)। में initकार्य करते हैं।

if( $this->get_plugin_status() )
{
    add_filter( 'views_' . $screen->id, array( &$this, 'views_again' ) );
    add_filter( 'all_plugins', array( &$this, 'filter_plugins' ) );
    // TODO: support bulk actions
    add_filter( 'bulk_actions-' . $screen->id, '__return_empty_array' );
    add_filter( 'plugin_action_links', array( &$this, 'action_links' ), 10, 2 );
}

यहां केवल एक चीज जो बदल जाती है वह है (1) हम क्रियाओं को बदल रहे हैं, (2) प्लगइन स्थिति को ध्यान में रखते हुए, और (3) गैर-नाम को थोड़ा बदल रहे हैं।

function action_links( $links, $plugin_file )
{
    $context = $this->get_plugin_status();

    // let's just start over
    $links = array();
    $links['activate'] = sprintf(
        '<a href="%s" title="Activate this plugin">%s</a>',
        wp_nonce_url( 'plugins.php?action=custom_activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . esc_attr( $context ), 'custom_activate-' . $plugin_file ),
        __( 'Activate' )
    );

    $active = get_option( 'active_plugins_' . $context, array() );
    if( in_array( $plugin_file, $active ) )
    {
        $links['deactivate'] = sprintf(
            '<a href="%s" title="Deactivate this plugin" class="cd-apd-deactivate">%s</a>',
            wp_nonce_url( 'plugins.php?action=custom_deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . esc_attr( $context ), 'custom_deactivate-' . $plugin_file ),
            __( 'Deactivate' )
        );
    }
    return $links;
}

और अंत में, हमें इसे बंद करने के लिए कुछ जावास्क्रिप्ट को संलग्न करने की आवश्यकता है। में initसमारोह फिर से (सब एक साथ इस समय)।

if( $this->get_plugin_status() )
{
    add_filter( 'views_' . $screen->id, array( &$this, 'views_again' ) );
    add_filter( 'all_plugins', array( &$this, 'filter_plugins' ) );
    // TODO: support bulk actions
    add_filter( 'bulk_actions-' . $screen->id, '__return_empty_array' );
    add_filter( 'plugin_action_links', array( &$this, 'action_links' ), 10, 2 );
    add_action( 'admin_enqueue_scripts', array( &$this, 'scripts' ) );
}

OurJS को एनकाउंटर करते समय, हम wp_localize_scriptकुल "सभी प्लगइन्स" काउंट का मान प्राप्त करने के लिए भी उपयोग करेंगे ।

function scripts()
{
    wp_enqueue_script(
        'cd-apd-js',
        CD_APD_URL . 'js/apd.js',
        array( 'jquery' ),
        null
    );
    wp_localize_script(
        'cd-apd-js',
        'cd_apd',
        array(
            'count' => esc_js( $this->all_count )
        )
    );
}

और हां, जेएस ठीक से प्रदर्शित करने के लिए सूची तालिका सक्रिय / निष्क्रिय प्लगइन्स प्राप्त करने के लिए सिर्फ कुछ अच्छे हैक हैं। हम Allलिंक में वापस सभी प्लगइन्स की सही गणना भी करेंगे ।

jQuery(document).ready(function(){
    jQuery('li.all a').removeClass('current').find('span.count').html('(' + cd_apd.count + ')');
    jQuery('.wp-list-table.plugins tr').each(function(){
        var is_active = jQuery(this).find('a.cd-apd-deactivate');
        if(is_active.length) {
            jQuery(this).removeClass('inactive').addClass('active');
            jQuery(this).find('div.plugin-version-author-uri').removeClass('inactive').addClass('active');
        }
    });
});

लपेटें

अतिरिक्त प्लगइन निर्देशिकाओं का वास्तविक लोडिंग बहुत अस्पष्ट है। सही ढंग से प्रदर्शित करने के लिए सूची तालिका प्राप्त करना अधिक कठिन हिस्सा है। मैं अभी भी पूरी तरह से संतुष्ट नहीं हूं कि यह कैसे निकला, लेकिन शायद कोई कोड में सुधार कर सकता है


1
प्रभावशाली! वास्तव में अच्छा काम। आपके कोड का अध्ययन करने के लिए मुझे सप्ताहांत में कुछ समय लगेगा। नोट: एक फ़ंक्शन है __return_empty_array()
FUXIA

धन्यवाद! प्रतिक्रिया हमेशा स्वागत है। __return_empty_arrayसमारोह में शामिल !
क्रिस

1
आपको उन सभी स्थानों की एक सूची एकत्र करनी चाहिए, जहां एक साधारण कोर फ़िल्टर ने आपको एक अलग फ़ंक्शन बचाया होगा। और फिर ... एक Trac टिकट जमा करें।
FUXIA

यह वास्तव में बहुत अच्छा है। अगर हम इसे एक थीम के अंदर एक पुस्तकालय के रूप में देख सकते हैं तो यह और भी अच्छा होगा। (Github पर मेरी टिप्पणी देखें: github.com/chrisguitarguy/WP-Plugin-Directories/issues/4 )
julb_c

1
+1 नहीं माना जा सकता है कि मुझे यह उत्तर याद आ गया है - महान काम! मैं सप्ताहांत पर आपके कोड को अधिक विस्तार से देखूंगा :)। @ जूलियन_सी - आप इसका उपयोग किसी विषय के अंदर क्यों करेंगे?
स्टीफन हैरिस

2

मुझे व्यक्तिगत रूप से UI को संशोधित करने में कोई दिलचस्पी नहीं है, लेकिन मैं कई कारणों से अधिक संगठित फ़ाइल सिस्टम लेआउट पसंद करूंगा।

उस अंत तक, एक और दृष्टिकोण सिम्बलिंक का उपयोग करना होगा।

wp-content
    |-- plugins
        |-- acme-widgets               -> ../plugins-custom/acme-widgets
        |-- acme-custom-post-types     -> ../plugins-custom/acme-custom-post-types
        |-- acme-business-logic        -> ../plugins-custom/acme-business-logic
        |-- google-authenticator       -> ../plugins-external/google-authenticator
        |-- rest-api                   -> ../plugins-external/rest-api
        |-- quick-navigation-interface -> ../plugins-external/quick-navigation-interface
    |-- plugins-custom
        |-- acme-widgets
        |-- acme-custom-post-types
        |-- acme-business-logic
    |-- plugins-external
        |-- google-authenticator
        |-- rest-api
        |-- quick-navigation-interface

आप अपने कस्टम प्लग इन को सेटअप कर सकते हैं plugins-custom, जो आपकी परियोजना के संस्करण नियंत्रण भंडार का हिस्सा हो सकता है।

तब आप तृतीय-पक्ष निर्भरताएँ plugins-external(संगीतकार, या गिट सबमॉडुल्स के माध्यम से, या जो भी आप चाहें) स्थापित कर सकते हैं।

तब आपके पास एक साधारण बैश स्क्रिप्ट या WP-CLI कमांड हो सकती है जो अतिरिक्त निर्देशिकाओं को स्कैन करती है, और pluginsइसे खोजने वाले प्रत्येक सबफ़ोल्डर के लिए एक सिमलिंक बनाती है।

pluginsअभी भी बरबाद किया जाएगा, लेकिन इससे कोई फर्क नहीं पड़ेगा क्योंकि आपको केवल plugins-customऔर के साथ बातचीत करनी होगी plugins-external

nअतिरिक्त निर्देशिकाओं के लिए स्केलिंग पहले दो के समान प्रक्रिया का पालन करेगी।


-3

या आप wp-content फ़ोल्डर को इंगित करने के लिए तय किए गए कस्टम निर्देशिका पथ के साथ COMPOSER का उपयोग भी कर सकते हैं। यदि यह आपके सवाल का सीधा जवाब नहीं है, तो यह सोचने का एक नया तरीका है, इससे पहले कि आप इसे खाएं, संगीतकार की ओर बढ़ें।


बहुत समय पहले संगीतकार के पास गया। कृपया इस प्रश्न की तारीख देखें। इसके अलावा: यह वास्तव में एक जवाब नहीं है। शायद यह दिखाएं कि वास्तव में इसे कैसे सेट किया जाए?
kaiser
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.