programing

플러그인을 멀티사이트에 적응시키는 방법

mytipbox 2023. 3. 4. 13:57
반응형

플러그인을 멀티사이트에 적응시키는 방법

WordPress용으로이 많이 , 는 MUWordPress에 .
멀티사이트 설치를 지원하기 위해 플러그인을 '업그레이드'하기 위해 따라야 하는 고려사항/베스트 프랙티스/워크플로우/기능/함정에는 어떤 것이 있습니까?

예를 들어 다음과 같습니다.

  • 엔큐 스크립트/레지스터
  • 삽입 파일(php, 이미지)
  • 사용자 지정 파일 업로드 경로
  • $wpdb
  • 활성화, 제거, 비활성화
  • 관리자별 페이지 처리

Codex에서 단일 기능 설명에 멀티사이트에 대한 설명이 있을 수 있지만, 이 주제를 다루는 원스톱 페이지는 찾을 수 없었습니다.

큐잉과 포함은 정상적으로 진행됩니다.플러그인 경로와 URL이 동일합니다.

멀티사이트에서의 업로드 경로와 관련된 것은 전혀 다루지 않았고, 보통은 WP가 담당한다고 생각합니다.


$wpdb

모든 블로그에서 반복하기 위해 일반적으로 사용되는 스니펫이 있습니다.

global $wpdb;
$blogs = $wpdb->get_results("
    SELECT blog_id
    FROM {$wpdb->blogs}
    WHERE site_id = '{$wpdb->siteid}'
    AND spam = '0'
    AND deleted = '0'
    AND archived = '0'
");
$original_blog_id = get_current_blog_id();   
foreach ( $blogs as $blog_id ) 
{
    switch_to_blog( $blog_id->blog_id );
    // do something in the blog, like:
    // update_option()
}   
switch_to_blog( $original_blog_id );

를 들어서 ' 낫다'는 예를 볼 수 .restore_current_blog().switch_to_blog( $original_blog_id ) 여기switchrestore_current_param() vs switch_to_param()보다 신뢰성이 높다.


$blog_id

블로그 ID에 따라 일부 기능 또는 후크를 실행합니다.

global $blog_id;
if( $blog_id != 3 )
    add_image_size( 'category-thumb', 300, 9999 ); //300 pixels wide (and unlimited height)

또는 다음과 같은 경우가 있습니다.

if( 
    'child.multisite.com' === $_SERVER['SERVER_NAME'] 
    || 
    'domain-mapped-child.com' === $_SERVER['SERVER_NAME']
    )
{
    // do_something();
}

설치 - 네트워크 활성화만

헤더 Network: true (see: Sample Plugin) 페이지에는 플러그 인만 표시됩니다./wp-admin/network/plugins.php이 헤더를 사용하면 플러그인이 네트워크 전용일 때 발생하는 특정 액션을 차단할 수 있습니다.

function my_plugin_block_something()
{
    $plugin = plugin_basename( __FILE__ );
    if( !is_network_only_plugin( $plugin ) )
        wp_die(
            'Sorry, this action is meant for Network only', 
            'Network only',  
            array( 
                'response' => 500, 
                'back_link' => true 
            )
        );    
}

언인스톨

(De) Activation의 경우 각 플러그인에 따라 다릅니다.단, [Uninstalling]의 경우 파일에서 사용하는 코드는 다음과 같습니다.

<?php
/**
 * Uninstall plugin - Single and Multisite
 * Source: https://wordpress.stackexchange.com/q/80350/12615
 */

// Make sure that we are uninstalling
if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) 
    exit();

// Leave no trail
$option_name = 'HardCodedOptionName';

if ( !is_multisite() ) 
{
    delete_option( $option_name );
} 
else 
{
    global $wpdb;
    $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
    $original_blog_id = get_current_blog_id();

    foreach ( $blog_ids as $blog_id ) 
    {
        switch_to_blog( $blog_id );
        delete_option( $option_name );    
    }
    switch_to_blog( $original_blog_id );
}

관리 페이지

1) 관리 페이지 추가

는 관리 메뉴가 있는지 합니다.is_multisite()그에 따라 후크를 변경합니다.

$hook = is_multisite() ? 'network_' : '';
add_action( "{$hook}admin_menu", 'unique_prefix_function_callback' );

2) 멀티 사이트 대시보드를 확인하고 관리자 URL을 변경합니다.

// Check for MS dashboard
if( is_network_admin() )
    $url = network_admin_url( 'plugins.php' );
else
    $url = admin_url( 'plugins.php' );

3) 메인 사이트에서만 인터페이스 요소를 표시하는 회피책

Menu를하지 않고,network_admin_menu메인 사이트에서만 플러그인의 일부를 표시할 수 있습니다.

가장 큰 플러그인에 일부 다중 사이트 기능을 포함하기 시작하고 다음을 수행하여 플러그인 옵션의 일부를 주 사이트로 제한했습니다.즉, 플러그인이 하위 사이트에서 활성화되면 옵션이 표시되지 않습니다.

$this->multisite = is_multisite() 
        ? ( is_super_admin() && is_main_site() ) // must meet this 2 conditions to be "our multisite"
        : false;

다시 한 번 생각해 보면 다음과 같이 단순할 수 있습니다.is_multisite() && is_super_admin() && is_main_site(). 마지막 두 개의 반환은true1개의 사이트에 있습니다.

그 후:

if( $this->multisite )
    echo "Something only for the main site, i.e.: Super Admin!";

4) 유용한 후크 및 기능 수집

후크: , , , , ,manage_blogs_custom_column, , , , ,{$hook}admin_menu

기능: , , , ,is_network_admin,network_admin_url,is_network_only_plugin

PS: 작업 코드의 예는 더 많기 때문에, 저는 Codex보다 Word Press Answers에 링크합니다.


샘플 플러그인

멀티사이트 플러그인인 Network Deactivated but Active Others를 롤링하여 논워킹을 재개한 주석 버전을 아래에 표시했습니다(완료된 풀워킹 버전은 GitHub 참조).완료된 플러그인은 완전히 기능하며 설정 인터페이스가 없습니다.

플러그인 헤더에는Network: true.자사이트에서플러그인이표시되지않습니다.

<?php
/**
 * Plugin Name: Network Deactivated but Active Elsewhere
 * Network: true
 */ 

/**
 * Start the plugin only if in Admin side and if site is Multisite
 */
if( is_admin() && is_multisite() )
{
    add_action(
        'plugins_loaded',
        array ( B5F_Blog_Active_Plugins_Multisite::get_instance(), 'plugin_setup' )
    );
}    

/**
 * Based on Plugin Class Demo - https://gist.github.com/toscho/3804204 
 */
class B5F_Blog_Active_Plugins_Multisite
{
    protected static $instance = NULL;
    public $blogs = array();
    public $plugin_url = '';
    public $plugin_path = '';

    public static function get_instance()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    /**
     * Plugin URL and Path work as normal
     */
    public function plugin_setup()
    {
        $this->plugin_url    = plugins_url( '/', __FILE__ );
        $this->plugin_path   = plugin_dir_path( __FILE__ );
        add_action( 
            'load-plugins.php', 
            array( $this, 'load_blogs' ) 
        );
    }

    public function __construct() {}

    public function load_blogs()
    { 
        /**
         * Using "is_network" property from $current_screen global variable.
         * Run only in /wp-admin/network/plugins.php
         */
        global $current_screen;
        if( !$current_screen->is_network )
            return;

        /**
         * A couple of Multisite-only filter hooks and a regular one.
         */
        add_action( 
                'network_admin_plugin_action_links', 
                array( $this, 'list_plugins' ), 
                10, 4 
        );
        add_filter( 
                'views_plugins-network', // 'views_{$current_screen->id}'
                array( $this, 'inactive_views' ), 
                10, 1 
        );
        add_action(
                'admin_print_scripts',
                array( $this, 'enqueue')
        );

        /**
         * This query is quite frequent to retrieve all blog IDs.
         */
        global $wpdb;
        $this->blogs = $wpdb->get_results(
                " SELECT blog_id, domain 
                FROM {$wpdb->blogs}
                WHERE site_id = '{$wpdb->siteid}'
                AND spam = '0'
                AND deleted = '0'
                AND archived = '0' "
        );  
    }

    /**
     * Enqueue script and style normally.
     */
    public function enqueue()
    {
        wp_enqueue_script( 
                'ndbae-js', 
                $this->plugin_url . '/ndbae.js', 
                array(), 
                false, 
                true 
        );
        wp_enqueue_style( 
                'ndbae-css', 
                $this->plugin_url . '/ndbae.css'
        );
    }

    /**
     * Check if plugin is active in any blog
     * Using Multisite function get_blog_option
     */
    private function get_network_plugins_active( $plug )
    {
        $active_in_blogs = array();
        foreach( $this->blogs as $blog )
        {
            $the_plugs = get_blog_option( $blog['blog_id'], 'active_plugins' );
            foreach( $the_plugs as $value )
            {
                if( $value == $plug )
                    $active_in_blogs[] = $blog['domain'];
            }
        }
        return $active_in_blogs;
    }
}

기타 자원 - 전자책

플러그인 개발과 직접 관련이 없지만 다중 사이트 관리에 필수적입니다.
이 전자책은 멀티사이트의 두 거인 이상에 의해 작성되었습니다.미카 엡스타인(일명 입스텐우)과 안드레아 레닉.

언급URL : https://stackoverflow.com/questions/13960514/how-to-adapt-my-plugin-to-multisite

반응형