একাধিক প্লাগইন ডিরেক্টরি যুক্ত করুন


39

কাজটি

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

অর্জনের জন্য এখানে কাজের তালিকা:

  • একটি অতিরিক্ত প্লাগইন ডিরেক্টরি যুক্ত করুন
  • প্রতিটি প্লাগইন ডিরেক্টরিতে এখানে প্রদর্শিত হিসাবে একটি নতুন "ট্যাব" প্রয়োজন [1]
  • অতিরিক্ত ডিরেক্টরিতে ডিফল্ট প্লাগইন ডিরেক্টরিতে যেমন কার্যকারিতা থাকে

তোমার জন্য সেখানে কি আছে?

সেরা এবং সবচেয়ে সম্পূর্ণ উত্তর একটি অনুদান দেওয়া হবে।


[1] নতুন প্লাগইন ফোল্ডার / ডিরেক্টরিগুলির জন্য অতিরিক্ত ট্যাব


3
যেহেতু ডিরেক্টরি কাঠামোটি ডিরেক্টর্ট কনস্ট্যান্টের সাথে বেশ জড়িত, আমার সন্দেহ আছে যে ফাইল সিস্টেমের স্তরে এটি করাটি ব্যবহারিক (এটি মূল গ্রহণ ছাড়াই)। অ্যাডমিনে প্রতিষ্ঠানের ভার্চুয়াল স্তরটি এক্সটেনশান স্তরে অর্জন করা আরও সহজ হতে পারে।
রর্স্ট

@ রারস্ট যা আপনাকে আপনার চিন্তাভাবনা যুক্ত করে আটকাবে না :)
কায়সার

এটি একটি দুর্দান্ত বৈশিষ্ট্য হবে।
এলটিফিশি

বৈশিষ্ট্যটি ভাল শোনাচ্ছে। ইঞ্জিনিয়ার কোরকে কেবল বিপরীত করা দরকার, এটি কীভাবে করা উচিত তা নির্ধারণ করুন (ডাব্লুপি উপায়) এবং তারপরে দেবগণের কাছে একটি প্যাচ জমা দিন ... আপনি নিবন্ধন_পরিচালনা (ডিরেক্টরি) () - অনুসন্ধান_থিম_ডাইরেক্টরি () - get_raw_theme_root () - get_theme_roots এ দেখতে চান () - get_theme () - get_themes ()
স্টার্লিং হ্যামিল্টন

2
বলছি: কি জমা দাও ? এটি একটি প্রশ্ন, সম্পূর্ণ ফুটিয়ে তোলা কোড সহ উত্তর নয় :) এফওয়াইআই: একটি ক্লাসে নতুন করে লেখারget_themes() জন্য ট্র্যাকের একটি নতুন টিকিট
কায়সার

উত্তর:


28

ঠিক আছে, আমি এই সময়ে ছুরিকাঘাত করব। পথে আমি কিছু সীমাবদ্ধতার মুখোমুখি হয়েছি:

  1. WP_List_Table এর সাবক্লাসে প্রচুর ফিল্টার নেই, কমপক্ষে যেখানে আমাদের সেগুলি হওয়া দরকার no

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

এরপরে হ'ল প্লাগইনগুলি সক্রিয় ও নিষ্ক্রিয় করার সমস্যাযুক্ত ব্যবসা business এটি করার জন্য, আমরা 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;
}

এরপরে, আসুন আপনি তালিকার টেবিলটিতে অন্যথায় যে প্লাগইনগুলি দেখেছেন সেগুলি থেকে মুক্তি দিন এবং সেগুলি আমাদের কাস্টম প্লাগইনগুলি দিয়ে প্রতিস্থাপন করুন। ভিতরে intoোকা 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 );
}

এখানে পরিবর্তন হওয়া একমাত্র জিনিস হ'ল (১) আমরা ক্রিয়াগুলি পরিবর্তন করছি, (২) প্লাগইন স্থিতি রেখেছি এবং (৩) ননসের নাম কিছুটা পরিবর্তন করি changing

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

আমাদের জেএস সারিবদ্ধ করার সময় আমরা 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 )
        )
    );
}

এবং অবশ্যই, জেএসটি সঠিকভাবে প্রদর্শন করতে তালিকার সক্রিয় / নিষ্ক্রিয় প্লাগইনগুলি পেতে কিছু দুর্দান্ত হ্যাক just আমরা সমস্ত প্লাগইনগুলির সঠিক গণনাটিকে আবার 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()
ফুসিয়া

ধন্যবাদ! মতামত সর্বদা স্বাগত। __return_empty_arrayফাংশন অন্তর্ভুক্ত !
chrisguitarguy

1
আপনার সমস্ত জায়গার একটি তালিকা সংগ্রহ করা উচিত যেখানে একটি সাধারণ কোর ফিল্টার আপনাকে পৃথক ফাংশন সংরক্ষণ করতে পারে। এবং তারপরে ... একটি ট্র্যাকের টিকিট জমা দিন।
ফুসিয়া

এটি সত্যিই দুর্দান্ত। এটি যদি আমরা কোনও থিমের অভ্যন্তরে একটি গ্রন্থাগার হিসাবে করতে পারি তবে এটি আরও শীতল হবে ( গিথুব : github.com/chrisguitarguy/WP- প্লাগইন- ডিরেক্টরিগুলি / ডিরেক্টরিগুলি / 4 )
জুলিয়েন_সি

1
+1 বিশ্বাস করা যায় না আমি এই উত্তরটি মিস করেছি - দুর্দান্ত কাজ! আমি সপ্তাহান্তে আপনার কোডটি আরও বিশদে দেখব :)। @ জুলিয়েন_সি - আপনি কেন কোনও থিমের ভিতরে এটি ব্যবহার করবেন?
স্টিফেন হ্যারিস

2

আমার ব্যক্তিগতভাবে ইউআই সংশোধন করার আগ্রহ নেই, তবে আমি বেশ কয়েকটি কারণে আরও একটি সংগঠিত ফাইল সিস্টেমের বিন্যাস পছন্দ করবো।

সেই লক্ষ্যে, অন্য পদ্ধতির মধ্যে রয়েছে সিমলিংকগুলি ব্যবহার করা।

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(সুরকার, বা গিট সাবমডিউলগুলির মাধ্যমে বা আপনি যা পছন্দ করেন)।

তারপরে আপনার কাছে একটি সরল বাশ স্ক্রিপ্ট বা ডাব্লুপি-সিএলআই কমান্ড থাকতে পারে যা অতিরিক্ত ডিরেক্টরিগুলি স্ক্যান করে এবং pluginsএটি যে প্রতিটি সাবফোল্ডার এটি খুঁজে পায় তার জন্য একটি সিমিলিংক তৈরি করে।

pluginsএখনও বিশৃঙ্খলাযুক্ত হবে, তবে এটি কোনও বিষয় নয় কারণ আপনার কেবল plugins-customএবং সাথে ইন্টারঅ্যাক্ট করতে হবে plugins-external

nঅতিরিক্ত ডিরেক্টরিতে স্কেলিং প্রথম দুটি হিসাবে একই প্রক্রিয়া অনুসরণ করবে।


-3

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


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