Wyłącz wtyczkę / działanie wtyczki za pomocą motywu

19

Na swojej stronie zainstalowałem wtyczkę Google Analyticator . Korzystam również z wtyczki MobilePress do obsługi motywu przeznaczonego dla przeglądarek mobilnych innych niż smartfony. Skonfigurowałem Google Analytics dla urządzeń mobilnych do użytku w tym temacie i chciałbym wyłączyć wtyczkę Analyticator, ponieważ zawiera ona wywołanie większego pliku js.

Czy ktoś wie, czy można wyłączyć wtyczkę za pomocą functions.php lub innej metody?

Wydaje mi się, że zlokalizowałem kod, który dodaje funkcje do strony, więc jeśli nie można wyłączyć całej wtyczki, czy można zatrzymać wykonywanie działań? Próbowałem je wyłączyć bezpośrednio bez powodzenia. Oto kod z pliku wtyczki:

add_action('wp_head', 'add_google_analytics', 999999);
add_action('init', 'ga_outgoing_links');

Próbowałem usunąć te działania za pomocą:

remove_action('wp_head','add_google_analytics',9999999);
remove_action('init', 'ga_outgoing_links');

Każda pomoc jest mile widziana.

PNMG
źródło
Jeśli chodzi o mnie, powinno to działać technicznie, więc jest coś w twoim czasie uruchomienia tego kodu, który idzie źle (za wcześnie lub za późno). Podaj więcej informacji.
Rarst
Tak, myślałem, że to też zadziała. Nie mam zbyt dużego doświadczenia z operacjami dodawania / usuwania, więc nie byłem pewien, jak dalej to debugować. Mimo że odpowiedź EAManna działała, jakiego rodzaju informacji szukałeś?
PNMG,
Jestem trochę zdezorientowany - czy nie jest łatwiej po prostu wyłączyć wtyczkę zwykłymi środkami, jeśli trzeba jej na zawsze zniknąć? Która odpowiedź EAManna ma tylko kod. Zakładałem, że chcesz dynamicznie go wyłączyć pod pewnymi warunkami ...
Rarst
Mam regularny motyw, który jest ustawiony w wordpress dla każdej zwykłej przeglądarki na pulpicie. W tym temacie chcę użyć wtyczki GA. Wtyczka mobilepress korzysta z php, aby uzyskać ciąg agenta użytkownika i obsługuje inny motyw niż smartfon lub inny smartfon. Chciałem użyć pliku functions.php dla motywu innego niż smartfon, aby wyłączyć wtyczkę GA z umieszczania JS w <head> tylko dla tego motywu. Nadal należy włączyć pozostałe dwa motywy (komputer stacjonarny i smartfon). Czy to pomaga wyjaśnić?
PNMG,
Tak właśnie myślałem. Jednak dezaktywacja spowoduje trwałe wyłączenie wtyczki i pozostanie wyłączona, dopóki nie zostanie aktywowana jawnie. Nie widzę, żeby pasowało do twojego przypadku użycia.
Rarst

Odpowiedzi:

25

Kiedy WordPress aktywuje wtyczkę, wywołuje activate_plugin()funkcję. Ta funkcja aktywuje wtyczkę w piaskownicy i przekierowuje gdzie indziej po sukcesie. Jest używany przez kilku autorów do programowego aktywowania zależności wtyczek.

Istnieje inna funkcja, deactivate_plugin()która działa podobnie w odwrotnym kierunku ... tak naprawdę WordPress dezaktywuje wtyczki po kliknięciu „dezaktywuj” lub „wyłącz”.

Aby dezaktywować zainstalowaną wtyczkę, wystarczy zadzwonić:

deactivate_plugins( '/plugin-folder/plugin-name.php' );

Lub, aby dezaktywować wiele wtyczek jednocześnie:

deactivate_plugins( array( '/first-plugin/first.php', '/second-plugin/second.php' ) );

Istnieje drugi parametr (pierwszy to ciąg lub tablica wtyczek do wyłączenia), który pozwala na wyłączenie wtyczek bez wywoływania haków dezaktywacji. Domyślnie jest ustawiony na false, i zalecamy pozostawienie go w ten sposób. Chyba że z jakiegoś powodu chcesz pominąć dezaktywację, wykonaj następujące czynności:

deactivate_plugins( '/plugin-folder/plugin-name.php', true );

To po prostu wyłączyłoby wtyczkę, ale nie uruchomiłoby niczego, co wtyczka zarejestrowała w celu dezaktywacji. Jeśli więc wtyczka usuwa opcje lub tabele db, gdy jest dezaktywowana, należy wykonać tę „cichą” dezaktywację, aby zachować te informacje i wykorzystać je gdzie indziej.

EAMann
źródło
Świetna odpowiedź - i to nie tylko w porównaniu z inną, powiedzmy, bezbarwną odpowiedzią „oto strona internetowa”, która może być gdzieś w pobliżu.
redaktor
Kod umieszczony w funkcji.php dezaktywuje wtyczkę w panelu administratora, tym samym wyłączając ją z pozostałych dwóch motywów. Dziękuję Rarst za zwrócenie na to uwagi. Chciałem po prostu go wyłączyć dla jednego motywu, w którym znajduje się plik functions.php.
PNMG,
Zawsze używasz tylko jednego motywu na danej stronie ... ale jeśli chcesz ponownie aktywować wtyczkę po dezaktywacji motywu, jest to również możliwe.
EAMann
11

Dzieje się tak dzięki doskonałej odpowiedzi EAManna powyżej i pomyślałem, że może być również pomocny dla oryginalnego plakatu ...

Potrzebowałem rozwiązania, aby upewnić się, że użytkownicy dezaktywują moją wtyczkę, jeśli przesłali wersję premium (aby uniknąć potencjalnych konfliktów). Wcześniej wykryłem jego stan za pomocą is_plugin_active i pokazałem komunikat o błędzie administratora, aby zachęcić użytkowników do wyłączenia. To DUŻO gładsze ...

function deactivate_plugin_conditional() {
    if ( is_plugin_active('plugin-folder/plugin-name.php') ) {
    deactivate_plugins('plugin-folder/plugin-name.php');    
    }
}
add_action( 'admin_init', 'deactivate_plugin_conditional' );

Uwaga: Wydaje się, że nie działa na register_activation_hook, ale admin_init działa jak urok.

Mark Jeldi
źródło
1
Dla pewności jestem pewien, że is_plugin_active jest już zaznaczony w haczyku dezaktywacji_pluginów, więc nie powinien tego robić ponownie
Bryan Willis,
1

Oto moje rozwiązanie, stwórz wtyczkę, która może wyłączyć inne wtyczki:

/*
 * Plugin Name: Disable/Configure Plugins
 * Description: Lets you disable/configure plugins based on environment variables
 * Author:      Chris Sewell
 */

/**
 * Disable specified plugins in development environment.
 * 
 * This is a "Must-Use" plugin. Code here is loaded automatically before regular plugins load.
 * This is the only place from which regular plugins can be disabled programatically.
 * 
 * Place this code in a file in WP_CONTENT_DIR/mu-plugins or specify a custom location 

 * to "development" or "production" in each particular server/environment.
 */

/* Disable specified plugins in development environment */
if (((getenv('environment') == 'production') || (getenv('environment') == 'alpha')) == false) {
    $plugins = array(
        'w3-total-cache/w3-total-cache.php'
    );
    require_once(ABSPATH . 'wp-admin/includes/plugin.php');
    deactivate_plugins($plugins);
}

Przekaż to do produkcji, włącz, a następnie przenieś bazę danych na lokalną maszynę programistyczną.

Źródło

użytkownik128526
źródło