프로그래밍 방식 및 자동으로 WordPress 플러그인을 다운로드, 설치, 활성화 및 교체하는 방법

게시 됨: 2018-09-18

사용자가 무엇이든 하도록 하는 것은 어렵습니다. 양식을 작성하거나 몇 번의 클릭만 하면 고유한 저항이 있습니다. 약한 암호를 변경하는 것과 같이 해당 작업이 사용자를 위한 것이더라도 수행하지 않습니다. 사용자가 필수 플러그인을 설치하도록 하거나 더 나쁜 경우 활성 플러그인을 새 플러그인으로 교체하는 경우에도 동일하게 적용됩니다. 경계선 미션 임파서블입니다.

고맙게도 약간의 코드와 사용자 동의가 있으면 WordPress 플러그인을 다운로드, 설치, 활성화, 비활성화 및 삭제할 수 있습니다. 이 자동화된 프로세스를 책임감 있게 배포하면 WordPress 관리자에서 필요한 사용자 작업에 대한 사용자 경험을 대폭 개선하고 전환율을 높일 수 있습니다.

사용자가 무엇이든 하도록 하는 것은 어렵습니다. 그렇다면 #WordPress 플러그인을 자동으로 다운로드, 설치 및 활성화하지 않으시겠습니까? 몇 줄의 코드만 있으면 됩니다.

트윗하려면 클릭

코드를 통해 플러그인을 다운로드, 설치 및 활성화하는 이유는 무엇입니까?

여러 시나리오가 있지만 이론은 제쳐두고 WP Reset이 직면한 상황을 살펴보겠습니다. 나는 이미 reset-wp를 WP Reset으로 리브랜딩하는 것에 대한 포스트를 썼습니다. 다른 것 외에도 프로세스에는 이미 reset-wp를 사용하여 사이트에서 제거한 다음 WP Reset을 설치하는 사람들이 포함됩니다. 왜 누군가가 우리가 요청했기 때문에 그렇게 했을까요? 그리고 하고 싶어도 두 번의 클릭이 아니기 때문에 꺼려할 것입니다. 그러나 모든 것을 설명하고 "예, 계속 진행합니다. reset-wp를 Reset WP로 바꾸십시오"라는 버튼 하나로 요약하면 상황이 그렇게 나빠 보이지 않습니다.

그들의 허락 없이 사람들의 사이트를 어지럽히지 마십시오! 기간. 그것이 "사소한 일"일지라도. 멋지지 않아. 당신의 사이트가 아닙니다. 플러그인을 업데이트하거나 새로운 기능을 추가할 때 변경 사항을 사용자에게 알립니다.

우리가 사용자의 행동을 추적하지 못하도록 하는 wp.org 규칙으로 인해(사용자의 동의 없이, 그리고 우리는 사용자가 묻도록 귀찮게 하고 싶지 않았습니다) 불행히도 공유할 번호가 없습니다. 그러나 내가 말할 수 있는 것은 교체 프로세스를 거치거나 플러그인에서 알림을 본 reset-wp 사용자로부터 불만이 없었다는 것입니다. 그리고 우리는 7주 이상 이 과정을 진행해 왔습니다.

이렇게 해도 괜찮나요? 사용자가 마음에 들까요?

사용자는 뒤에서 당신이 하는 모든 일과 모든 일을 반드시 염두에 둘 것입니다! 그러지 마! 이용자의 허락 없이는 어떠한 행위도 하지 마십시오. 특히 플러그인이 wp.org에서 호스팅되는 경우 규칙에 위배되기 때문입니다. 그렇게 하면 관리자가 즉시 저장소에서 플러그인을 제거합니다.

그러나 권한을 요청하면 "플러그인 A를 플러그인 B로 바꿀 수 있습니까? 확인 해주세요." 그런 다음 그렇게 하는 것이 좋습니다. 한 플러그인을 비활성화 및 삭제하고 다른 플러그인을 다운로드 및 활성화하는 프로세스는 몇 번의 클릭 이상입니다. 따라서 해당 프로세스를 자동화하고 클릭 한 번으로 줄이면 사용자가 만족할 것입니다.

테마에 필요한 플러그인을 활성화하는 유사한 프로세스가 수년 동안 진행되어 왔으며 사용자는 이에 대해 괜찮습니다. 플러그인을 설치하기 위해 여러 링크를 따르는 대신 프로세스에 문제가 없는지 확인하고 한 번의 클릭으로 여러 플러그인이 설치됩니다.

평소와 같이 매우 적은 코드가 필요합니다.

의사 코드에서 이것은 우리가 하고자 하는 일반적인 아이디어입니다:

// pseudo code only!
// DO NOT copy & paste

var $old_plugin;
var $new_plugin;

if ( is_plugin_installed( $new_plugin ) ) {
  // new plugin is already installed
  // make sure we have the last version
  upgrade_plugin( $new_plugin );
} else {
  install_plugin( $new_plugin );
}

if ( !is_plugin_active( $new_plugin ) ) {
  // new plugin is not active - activate it
  activate_plugin( $new_plugin );
}

// deactivate old plugin
deactivate_plugin( $old_plugin );

// if needed delete old plugin
delete_plugin( $old_plugin );

// pseudo code only!
// DO NOT copy & paste

그것은 아주 간단하고 간단합니다. 사용자에게 올바른 파일 권한이 설정되어 있는 한 모든 것이 원활하게 진행됩니다. 전체 교체는 완료하는 데 1~2초 이상 걸리지 않습니다.

몇 가지 기능이 필요합니다.

고맙게도 WordPress에는 우리가 필요로 하는 대부분의 기능이 완료되었거나 반쯤 완료되었으므로 모든 것을 함께 모으는 것입니다.

이해해야 할 중요한 개념은 WordPress가 플러그인을 식별하는 방법, 어떤 플러그인이 어떤 플러그인인지 아는 방법입니다. 플러그인 폴더 이름과 기본 PHP 파일의 조합인 플러그인 슬러그에 의해 수행됩니다. 예: hello-dolly/hello-dolly.php. 기본 PHP 파일은 플러그인 헤더가 있는 파일입니다. 슬러그를 얻으려면 plugin_basename( __FILE__ ) 을 실행하십시오. 플러그인이 활성화되어 있는지 확인하거나 플러그인으로 무언가를 하고 싶을 때마다 플러그인 슬러그를 사용해야 합니다. 이 슬러그는 wp.org의 슬러그와 비슷하지만 동일하지는 않습니다. 저장소에서 슬러그는 파일 이름이 없는 폴더 이름일 뿐입니다. 따라서 Hello Dolly의 경우 "hello-dolly"입니다. 당장은 필요하지 않지만 명확히 해야 합니다. 다소 혼란스러운 이 주제에 대한 자세한 내용은 Stack Exchange의 이 스레드를 확인하세요.

WordPress는 플러그인을 슬러그(예: hello-dolly/hello-dolly.php)로 식별합니다. 슬러그를 얻으려면 플러그인의 기본 파일에서 plugin_basename( __FILE__ ) 을 실행하십시오.

is_plugin_active( $plugin_slug ) 내장되어 있으므로 우리가 할 일이 없습니다. Codex 페이지는 많은 추가 정보를 공개하지 않으며 단순한 기능입니다.

is_plugin_installed( $plugin_slug ) 는 내장형으로 제공되지 않지만 몇 줄만 코딩하면 됩니다.

function is_plugin_installed( $slug ) {
  if ( ! function_exists( 'get_plugins' ) ) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }
  $all_plugins = get_plugins();
  
  if ( !empty( $all_plugins[$slug] ) ) {
    return true;
  } else {
    return false;
  }
}

이것들은 모두 우리에게 필요한 조건부 테스트 기능입니다. 이제 뭔가를 하는 사람들을 위해. activate_plugin( ) 은 내장되어 있으며 4개의 매개변수가 있으므로 이에 대한 Codex 페이지를 확인하십시오.

deactivate_plugins( $plugin_slug ) 도 즉시 사용할 수 있지만 함수 이름의 "s"(복수형)에 유의하십시오. 또한 몇 가지 매개변수가 있으므로 Codex 페이지를 읽으십시오.

install_plugin( $plugin_zip )Plugin_Upgrader 클래스의 일부로 사용할 수 있습니다. 추가 코드가 필요 없고 새 클래스 인스턴스만 있으면 됩니다. upgrade_plugin( $plugin_slug ) 도 마찬가지입니다.

function install_plugin( $plugin_zip ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();

  $upgrader = new Plugin_Upgrader();
  $installed = $upgrader->install( $plugin_zip );

  return $installed;
}

function upgrade_plugin( $plugin_slug ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();

  $upgrader = new Plugin_Upgrader();
  $upgraded = $upgrader->upgrade( $plugin_slug );

  return $upgraded;
}

wp_cache_flush() 는 필요하지 않을 수 있지만 안전한 측면을 위해 추가했습니다. 실행하는 데 10ms가 더 걸리는 것 외에도 해를 끼칠 수 없습니다.

함께 모아서

호기심이 아니라 플러그인에 코드를 구현해야 하는 필요성 때문에 이 기사를 읽는다면 reset-wp 플러그인을 설치하는 것이 좋습니다. 코드에 대해 읽는 것은 좋지만 야생에서 테스트하는 것과 비교할 수 있는 것은 없습니다.

내 기본 설정은 전체 관리 GUI가 필요하지 않은 거의 모든 것에 admin_action을 사용하는 것입니다. 따라서 다른 작업과 필터가 추가되는 함수에 다음을 추가합니다. add_action( 'admin_action_replace_plugin', 'replace_plugin' ); . 사용자가 admin.php?action=replace_plugin을 열면 코드가 실행됩니다. 해당 URL을 하드코딩하지 마십시오. $url = add_query_arg(array('action' => 'replace_plugin'), admin_url('admin.php')); . 그것은 당신의 코드 품질에 대해 많은 것을 말해줍니다.

복사/붙여넣기 할 수 있는 코드는 다음과 같습니다. 분명히, 맨 위에 있는 세 개의 변수를 값으로 수정하십시오.

function replace_plugin() {
  // modify these variables with your new/old plugin values
  $plugin_slug = 'wp-reset/wp-reset.php';
  $plugin_zip = 'https://downloads.wordpress.org/plugin/wp-reset.latest-stable.zip';
  $old_plugin_slug = 'reset-wp/reset-wp.php';
  
  echo 'If things are not done in a minute <a href="plugins.php">click here to return to Plugins page</a><br><br>';
  echo 'Starting ...<br><br>';
  
  echo 'Check if new plugin is already installed - ';
  if ( is_plugin_installed( $plugin_slug ) ) {
    echo 'it\'s installed! Making sure it\'s the latest version.';
    upgrade_plugin( $plugin_slug );
    $installed = true;
  } else {
    echo 'it\'s not installed. Installing.';
    $installed = install_plugin( $plugin_zip );
  }
  
  if ( !is_wp_error( $installed ) && $installed ) {
    echo 'Activating new plugin.';
    $activate = activate_plugin( $plugin_slug );
    
    if ( is_null($activate) ) {
      echo '<br>Deactivating old plugin.<br>';
      deactivate_plugins( array( $old_plugin_slug ) );
      
      echo '<br>Done! Everything went smooth.';
    }
  } else {
    echo 'Could not install the new plugin.';
  }
}
  
function is_plugin_installed( $slug ) {
  if ( ! function_exists( 'get_plugins' ) ) {
    require_once ABSPATH . 'wp-admin/includes/plugin.php';
  }
  $all_plugins = get_plugins();
  
  if ( !empty( $all_plugins[$slug] ) ) {
    return true;
  } else {
    return false;
  }
}

function install_plugin( $plugin_zip ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();
  
  $upgrader = new Plugin_Upgrader();
  $installed = $upgrader->install( $plugin_zip );

  return $installed;
}

function upgrade_plugin( $plugin_slug ) {
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
  wp_cache_flush();
  
  $upgrader = new Plugin_Upgrader();
  $upgraded = $upgrader->upgrade( $plugin_slug );

  return $upgraded;
}

코드는 우리가 이미 논의한 모든 것을 사용합니다. GUI와 메시지는 매우 기본적이므로 약간의 CSS를 추가하거나 reset-wp에서 했던 것처럼 라이트박스에 URL을 로드합니다.

사용자를 위해 지루한 일상적인 작업을 자동으로 수행하는 것은 항상 #UX의 큰 장점입니다. 한 번의 클릭으로 여러 #WordPress 플러그인을 쉽게 다운로드, 설치 및 활성화하는 방법을 확인하십시오.

트윗하려면 클릭

한 번의 클릭은 항상 열 번보다 낫습니다.

사용자가 열 번 대신 한 번 클릭하게 하는 것은 항상 긍정적인 일입니다! 좋은 UX(사용자 경험)의 표시입니다. 따라서 플러그인 또는 테마에 다른 플러그인이 필요한 경우 모든 종속성에 대해 원클릭 설치 절차를 구현하는 것이 좋습니다. 의심할 여지 없이 플러그인 사용의 초기 단계에 있는 사람들로부터 더 적은 수의 지원 티켓을 받게 될 것입니다.

한 플러그인을 다른 플러그인으로 교체하는 경우 이러한 상황을 피하십시오. 때로는 피할 수 없는 경우도 있지만 문제는 모든 사용자가 새 플러그인으로 전환하지 못하게 한다는 것입니다. 즉, 두 개의 플러그인을 지원하거나 이전 플러그인을 계속 사용하는 사용자 기반의 일부를 포기하고 실망시켜야 합니다. 우리는 reset-wp로 동일한 결정에 직면했으며 두 솔루션 중 하나가 마음에 들지 않습니다.