플러그인의 네트워크 활성화 방지


9

현재 네트워크 활성화를 지원하지 않는 플러그인이 있습니다. 물론이 문제를 해결하는 가장 좋은 방법은 해결하려는 것입니다. 그러나 그 동안 네트워크 활성화를 방지하기 위해 사용할 수있는 임시 솔루션이 있는지 궁금합니다.

  1. 활성화가 네트워크 전체인지 감지 (어떻게 ??)
  2. 현재 지원되지 않는 메시지를 표시하고 악취가납니다. 죄송합니다.
  3. 활성화 중단 또는 비활성화

또는 다른 제안도 받아 들였습니다. 감사.

설명을 위해 : 네트워크 전체의 활성화가 아니라 다중 사이트 활성화가 좋습니다.

답변:


5

여기에 대한 답변은 과대 평가되고 너무 복잡합니다. 활성화를 막는 대신 플러그인을 비활성화하는 이유는 무엇입니까? 활성화시 die ( '여기에서 오류 메시지)를 호출하는 것만 큼 간단한 작업이 수행됩니다.

function activate($networkwide) {
    if (is_multisite() && $networkwide) 
       die('This plugin can\'t be activated networkwide');
}

register_activation_hook('your-plugin/index.php','activate');

그런 다음 패널에서 활성화하려고하면 페이지 상단에 오류 메시지와 함께 멋진 오류가 발생합니다.


6

플러그인 헤더 Network: false는 불행히도 WordPress…에서 무시됩니다. 그러나 활성화 훅에는 매개 변수 $network_wide가 있으며 활성화하는 동안 플러그인을 비활성화하는 데 사용할 수 있습니다.

<?php
/**
 * Plugin Name: Prevent Network Activation
 * Plugin URI:  http://wordpress.stackexchange.com/questions/76145/prevent-network-activation-of-plugin
 * Network:     false
 *
 * Note the 'Network' option will be ignored by WordPress.
 */

register_activation_hook( __FILE__, 'pna_check_network_activation' );

function pna_check_network_activation( $network_wide )
{
    if ( ! $network_wide )
        return;

    deactivate_plugins( plugin_basename( __FILE__ ), TRUE, TRUE );

    header( 'Location: ' . network_admin_url( 'plugins.php?deactivate=true' ) );
    exit;
}

이 방법은 유용하지만 현재 진행중인 상황을 설명 할 수는 없습니다. 나는 wp_die거기에 넣고 리디렉션을 건너 뛸 수 있었지만 설명없이 비활성화하는 것보다 덜 끈적 거리는 것 같습니다. :)
k3davis 2014

1
이것이 내가 사용했던 해결책입니다. 방금 비활성화 URL로 리디렉션하지 않고 메시지를 보내도록이 기능을 "다이"로 조정했습니다. 가장 깨끗하지는 않지만 모든 요구 사항을 충족하고 다른 솔루션보다 오버 헤드가 적으므로 임시 패치가 필요합니다.
k3davis

4

네트워크 플러그인 목록에서 간단히 숨길 수 있습니다.

add_filter( 'all_plugins', 'wpse_76145_hide_network_plugin' );
function wpse_76145_hide_network_plugin( $all )
{
    global $current_screen;

    if( $current_screen->is_network )
        unset($all['akismet/akismet.php']);

    return $all;
}

일회성 네트워크 관리자 알림을 표시합니다. Q & A add_role ()을 한 번만 실행하면 되나요? .

add_action( 'network_admin_notices', 'wpse_76145_admin_notice' );

function wpse_76145_admin_notice()
{ 
    global $current_screen;
    if( 'plugins-network' == $current_screen->id )
    {
        if ( wpse_25643_run_once( 'hide_akismet_network' ) )
            echo '<div class="error">Akismet not available in Network mode</div>';
    }
}

function wpse_25643_run_once( $key )
{
    $test_case = get_option( 'run_once' );

    if ( isset( $test_case[$key] ) && $test_case[$key] )
    {
        return false;
    }
    else
    {
        $test_case[$key] = true;
        update_option( 'run_once',$test_case );
        return true;
    }
}

또는이 다른 기술을 사용하십시오 . 관리 영역에 처음 로그인 할 때 사용자에게 알림 추가


2

(이것은 테스트되지 않았습니다)

add_action( 'activated_plugin', 'wpse76145_no_network_activation',10,2 );
function wpse76145_no_network_activation( $plugin, $network_wide){

   if( $plugin == 'myplugin/myplugin.php' && $network_wide ){
       //Plugin was network activated

       //Network deactivate
       deactivate_plugins( $plugin,false, true );

       //Activate on single site
       activate_plugins( $plugin);

       add_option('wpse76145_network_activate_notice',1);
   }

}

그런 다음 옵션 을 admin_notices확인 wpse76145_network_activate_notice하고 알림을 표시하십시오.

참고 : 'myplugin / myplugin.php'를 하드 코딩하지 않는 것이 좋습니다.-교체하면 효과가 있다고 생각합니다 plugin_basename(__FILE__);.

다중 사이트 활성화가 정상이면 편집switch_to_blog() 하여 각 플러그인에서 개별적으로 활성화 하는 데 사용할 수 있습니다 . 사용자가 요청한 내용을 수행하지 않았으므로 여전히 알림을 표시합니다.


이것은 작동 할 수 있지만 플러그인이 이미 비활성화 된 경우 관리자 통지가 어떻게 호출되는지 이해하지 못합니까? 아니면 이것이 일어날 수있는 단일 사이트 활성화입니까?
k3davis

기본 사이트에서만 플러그인을 활성화합니다.
Stephen Harris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.