Jak programowo i automatycznie pobierać, instalować, aktywować i zastępować wtyczki WordPress?

Opublikowany: 2018-09-18

Nakłonienie użytkowników do zrobienia czegokolwiek jest trudne. Czy to wypełnianie formularza, czy po prostu wykonanie kilku kliknięć – istnieje nieodłączny opór. Nawet jeśli to działanie ma na celu dobro użytkowników, jak zmiana słabego hasła, nie zrobią tego. To samo dotyczy nakłaniania użytkowników do zainstalowania wymaganej wtyczki lub, co gorsza, zastępowania aktywnej wtyczki nową. To graniczna misja niemożliwa.

Na szczęście za pomocą odrobiny kodu i zgody użytkownika możemy pobierać, instalować, aktywować, dezaktywować, a nawet usuwać wtyczki WordPress. Ten zautomatyzowany proces, jeśli zostanie wdrożony w sposób odpowiedzialny, może radykalnie poprawić wrażenia użytkownika i zwiększyć współczynniki konwersji dla niezbędnych działań użytkownika w administratorze WordPress.

Nakłonienie użytkowników do zrobienia czegokolwiek jest trudne. Dlaczego więc nie pobierać, instalować i aktywować wtyczek #WordPress automatycznie? Zajmuje tylko kilka linijek kodu.

KLIKNIJ, ABY TWEETOWAĆ

Po co pobierać, instalować i aktywować wtyczki za pomocą kodu?

Istnieje wiele scenariuszy, ale pomijając teorię, spójrzmy na sytuację, którą ma pod ręką WP Reset. Napisałem już post o rebrandingu reset-wp na WP Reset. Oprócz innych rzeczy, proces ten obejmuje pozyskanie osób, które już używają resetowania-wp, aby usunąć je ze swoich witryn, a następnie zainstalować WP Reset. Dlaczego ktoś miałby to robić tylko dlatego, że o to poprosiliśmy? A nawet jeśli zechcą to zrobić, będą niechętni, bo to daleko od dwóch kliknięć. Jeśli jednak wszystko wyjaśnimy i sprowadzimy do jednego przycisku „Tak, śmiało, zamień reset-wp na Reset WP”, wtedy sprawy nie wyglądają tak źle.

Nie zadzieraj ze stronami innych osób bez ich zgody! Okres. Nawet jeśli to „maleńka rzecz”. To nie fajne. To nie jest Twoja witryna. Powiadamiaj użytkowników o wszelkich zmianach, gdy zaktualizują wtyczkę lub gdy dodasz nowe funkcje.

Ze względu na zasady wp.org, które uniemożliwiają nam śledzenie działań użytkowników (bez ich zgody, a nie chcieliśmy zawracać im głowy pytaniami) nie mam niestety żadnych numerów do udostępnienia. Ale mogę ci powiedzieć, że nie mieliśmy żadnych skarg od użytkowników reset-wp, którzy przeszli proces wymiany lub po prostu zobaczyli powiadomienie we wtyczce. I prowadzimy ten proces od ponad siedmiu tygodni.

Czy mogę to zrobić? Czy użytkownicy będą mieli coś przeciwko?

Użytkownikom z pewnością będzie przeszkadzać wszystko, co robisz za ich plecami! Nie rób tego! Nie rób niczego bez zgody użytkowników. Zwłaszcza jeśli wtyczka jest hostowana na wp.org, ponieważ jest to niezgodne z zasadami. Jeśli to zrobisz, administratorzy natychmiast usuną Twoją wtyczkę z repozytorium.

Ale jeśli poprosisz o pozwolenie – „Czy możemy zastąpić wtyczkę A wtyczką B? Proszę potwierdzić." Wtedy można to zrobić. Proces dezaktywacji i usunięcia jednej wtyczki oraz pobrania i aktywacji innej zajmuje więcej niż kilka kliknięć. Jeśli więc uda Ci się zautomatyzować ten proces i zredukować go do jednego kliknięcia, użytkownicy będą zadowoleni.

Podobny proces aktywacji wymaganych wtyczek do motywów trwa od lat i użytkownicy są z tym w porządku. Zamiast podążać za wieloma linkami, aby zainstalować wtyczki, potwierdzają, że są w porządku z procesem, a kilka wtyczek zostaje zainstalowanych jednym kliknięciem.

Jak zwykle potrzeba bardzo mało kodu

W pseudokodzie jest to ogólna idea tego, co chcemy zrobić:

// 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

To dość proste i nieskomplikowane. Dopóki użytkownik ma odpowiednie uprawnienia do plików, wszystko pójdzie gładko. Cała wymiana nie zajmuje więcej niż sekundę lub dwie.

Potrzebujemy kilku funkcji

Na szczęście WordPress ma większość funkcji, których potrzebujemy, albo gotowych, albo częściowo gotowych, więc jest to kwestia złożenia rzeczy w całość.

Kluczową koncepcją do zrozumienia jest to, w jaki sposób WordPress identyfikuje wtyczkę, skąd wie, która wtyczka jest którą. Robi to przez plugin slug – połączenie nazwy folderu wtyczki i głównego pliku PHP. Na przykład: hello-dolly/hello-dolly.php. Główny plik PHP to plik z nagłówkami wtyczek. Aby pobrać slug, uruchom plugin_basename( __FILE__ ) . Zawsze, gdy musisz sprawdzić, czy wtyczka jest aktywna lub chcesz coś z nią zrobić, musisz użyć ślimaka wtyczki. Ten ślimak jest podobny, ale nie taki sam, jak ślimak z wp.org. W repozytorium slug to tylko nazwa folderu, bez nazwy pliku. Tak więc dla Hello Dolly to „hello-dolly”. W tej chwili nie potrzebujemy tego, ale trzeba to wyjaśnić. Aby uzyskać bardziej dogłębną lekturę na ten nieco mylący temat, sprawdź ten wątek na Stack Exchange.

WordPress identyfikuje wtyczki po ich ślimaku, tj. hello-dolly/hello-dolly.php. Aby pobrać slug, uruchom plugin_basename( __FILE__ ) w głównym pliku wtyczki.

is_plugin_active( $plugin_slug ) jest wbudowany, więc nie mamy nic do zrobienia. Strona kodeksu nie ujawnia zbyt wiele, to prosta funkcja.

is_plugin_installed( $plugin_slug ) nie jest wbudowany, ale kod wymaga tylko kilku linijek.

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

To są wszystkie funkcje warunkowe, testujące, których potrzebujemy. Teraz dla tych, którzy coś robią. activate_plugin( ) jest wbudowana i ma cztery parametry, więc sprawdź na ten temat stronę w Kodeksie.

deactivate_plugins( $plugin_slug ) jest również dostępna po wyjęciu z pudełka, ale pamiętaj, aby zanotować „s” (liczba mnoga) w nazwie funkcji. To też ma kilka parametrów, więc przeczytaj stronę Kodeksu.

install_plugin( $plugin_zip ) jest dostępny jako część klasy Plugin_Upgrader . Nie potrzeba żadnego dodatkowego kodu, wystarczy nowa instancja klasy. To samo dotyczy 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() może nie być potrzebne, ale dodałem to tylko po to, aby być po bezpiecznej stronie. Poza tym, że działanie trwa o 10 ms dłużej, nie może zaszkodzić.

Kładąc wszystko razem

Jeśli czytasz ten artykuł nie z ciekawości, ale z realnej potrzeby zaimplementowania kodu we wtyczce, gorąco sugeruję zainstalowanie wtyczki reset-wp. Czytanie o kodzie jest przyjemne, ale nic nie może się równać z testowaniem na wolności.

Preferuję używanie admin_action do prawie wszystkiego, co nie wymaga pełnego GUI administratora. Dodaj więc to do funkcji, w której dodawane są inne akcje i filtry: add_action( 'admin_action_replace_plugin', 'replace_plugin' ); . Gdy użytkownik otworzy admin.php?action=replace_plugin, nasz kod zostanie uruchomiony. Proszę nie kodować na stałe tego adresu URL. Użyj czegoś takiego: $url = add_query_arg(array('action' => 'replace_plugin'), admin_url('admin.php')); . Mówi wiele o jakości Twojego kodu.

Oto kod, który możesz skopiować/wkleić. Oczywiście zmodyfikuj trzy zmienne na górze swoimi wartościami.

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

Kod wykorzystuje wszystko, co już omówiliśmy. GUI i wiadomości są bardzo proste, więc dodaj trochę CSS lub załaduj adres URL w lightbox, tak jak to zrobiliśmy w reset-wp.

Automatyczne wykonywanie nudnych, przyziemnych zadań dla użytkowników jest zawsze ogromnym plusem dla #UX. Zobacz, jak łatwo pobrać, zainstalować i aktywować wiele wtyczek #WordPress jednym kliknięciem.

KLIKNIJ, ABY TWEETOWAĆ

Jedno kliknięcie jest zawsze lepsze niż dziesięć

To, że użytkownicy klikną raz zamiast dziesięciu razy, jest zawsze pozytywną rzeczą! To znak dobrego UX (user experience). Więc jeśli twoja wtyczka lub motyw wymaga innych wtyczek, polecam zaimplementować procedurę instalacji jednym kliknięciem dla wszystkich zależności. Bez wątpienia otrzymasz mniej zgłoszeń pomocy technicznej od osób na wczesnych etapach korzystania z wtyczek.

Jeśli chodzi o zamianę jednej wtyczki na drugą – staraj się unikać takich sytuacji. Czasami jest to nieuniknione, ale problem polega na tym, że nigdy nie zmusisz wszystkich użytkowników do przejścia na nową wtyczkę, co oznacza, że ​​musisz obsługiwać dwie wtyczki lub porzucić i zawieść część swojej bazy użytkowników, która nadal korzysta ze starej wtyczki. Stoimy przed tą samą decyzją z reset-wp i nie podoba nam się żadne z tych dwóch rozwiązań