Dezactivare plugin / acțiune plugin prin intermediul temei

15 mar. 2011, 23:36:26
Vizualizări: 42.5K
Voturi: 27

Am instalat pluginul Google Analyticator pe site-ul meu. De asemenea, folosesc pluginul MobilePress pentru a afișa o temă destinată browserelor mobile non-smartphone. Am configurat Google Analytics pentru Mobile pentru utilizare în această temă și aș dori să dezactivez pluginul Analyticator deoarece include un apel către un fișier js mai mare.

Știe cineva dacă este posibil să dezactivezi un plugin folosind functions.php sau vreo altă metodă?

Cred că am localizat codul care adaugă funcțiile în pagină, așa că dacă nu este posibil să dezactivez întregul plugin, este posibil să opresc execuția acțiunilor? Am încercat să le dezactivez direct dar fără succes. Iată codul din fișierul plugin-ului:

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

Am încercat să elimin aceste acțiuni cu:

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

Orice ajutor este apreciat.

9
Comentarii

Din punctul meu de vedere, din punct de vedere tehnic ar trebui să funcționeze, deci problema este legată de momentul în care rulezi acest cod (prea devreme sau prea târziu). Te rog să oferi mai multe informații.

Rarst Rarst
15 mar. 2011 23:49:36

Da, și eu credeam că va funcționa. Nu am prea multă experiență cu acțiunile add/remove, așa că nu eram sigur cum să depanez mai departe. Chiar dacă răspunsul lui EAMann a funcționat, ce fel de informații suplimentare căutai?

PNMG PNMG
16 mar. 2011 00:29:23

Sunt puțin confuz - nu ar fi mai ușor să dezactivezi plugin-ul prin metode normale dacă trebuie eliminat definitiv? Ceea ce răspunsul lui EAMann face doar prin cod. Am presupus că voiai să-l dezactivezi dinamic în funcție de o anumită condiție...

Rarst Rarst
16 mar. 2011 00:33:02

Am o temă obișnuită configurată în WordPress pentru orice browser desktop normal. Pentru această temă, doresc să folosesc pluginul GA. Pluginul mobilepress utilizează PHP pentru a obține string-ul user-agent și servește o temă diferită pentru un smartphone sau un non-smartphone. Am vrut să folosesc fișierul functions.php pentru tema non-smartphone pentru a dezactiva pluginul GA din a insera JS în <head> doar pentru acea temă. Trebuie să rămână activ pentru celelalte două teme (desktop și smartphone). Ajută asta la clarificare?

PNMG PNMG
16 mar. 2011 01:42:32

Da, exact asta am crezut. Dar dezactivarea va dezactiva pluginul în mod persistent și va rămâne oprit până când este activat explicit. Nu cred că se potrivește cu cazul tău de utilizare.

Rarst Rarst
16 mar. 2011 02:09:05

Aaaa! Ai dreptate. Era sfârșitul zilei și am văzut că l-a eliminat din tema din care voiam să-l elimin, dar nu m-am obosit să verific celelalte. A dezactivat pur și simplu pluginul pentru tot. Deci cred că răspunsul de mai jos nu este ceea ce căutam. Mulțumesc că m-ai ajutat să înțeleg asta! Crezi că urmărirea codului remove_action este calea de urmat? Nu pare posibil să dezactivezi un plugin doar pentru o temă.

PNMG PNMG
16 mar. 2011 03:15:38

Da, eliminările ar trebui să fie potrivite. Exact când și cum rulezi funcțiile de eliminare?

Rarst Rarst
16 mar. 2011 10:31:24

Am plasat remove_action-urile la sfârșitul fișierului functions.php al temei. Le-am plasat separat, similar cu cum am menționat în întrebare și am încercat și să le pun într-un add_action: add_action('wp_head','my_remove_ga'); function my_remove_ga() { remove_action('wp_head','add_google_analytics'); remove_action('init', 'ga_outgoing_links'); } Am încercat și să folosesc var_dump() pe remove_action cu var_dump(remove_action('wp_head','add_google_analytics')); și returnează bool(false) care conform codex-ului înseamnă "Funcția nu a putut fi eliminată."

PNMG PNMG
16 mar. 2011 14:21:31

Am încercat și să comentez add_action-urile inițiale din plugin și să le adaug în functions.php al temei, apoi să folosesc remove_action-urile direct sub ele. Nici asta nu pare să funcționeze.

PNMG PNMG
16 mar. 2011 14:29:01
Arată celelalte 4 comentarii
Toate răspunsurile la întrebare 4
3
35

Când WordPress activează un plugin, apelează funcția activate_plugin(). Această funcție activează pluginul într-un mediu izolat (sandbox) și redirecționează în altă parte în caz de succes. Unii autori au folosit-o pentru a activa programatic dependințele pluginurilor.

Există o altă funcție, deactivate_plugins(), care face același lucru, dar în sens invers... de fapt, asta folosește WordPress atunci când dai clic pe "dezactivează" sau "oprește".

Pentru a dezactiva un plugin instalat, apelează:

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

Sau, pentru a dezactiva mai multe pluginuri simultan:

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

Există un al doilea parametru (primul fiind fie un șir de caractere, fie un array cu pluginurile de dezactivat) care permite dezactivarea fără a apela hook-urile de dezactivare. În mod implicit, este setat la false, și recomand să-l lași așa. Doar dacă vrei să ocolesc procesul de dezactivare, atunci ai putea face:

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

Asta ar opri doar pluginul, dar nu ar declanșa acțiunile înregistrate la dezactivare. Deci, dacă pluginul elimină opțiuni sau tabele din baza de date când este dezactivat, ai putea folosi această dezactivare "silențioasă" pentru a păstra acele informații și a le utiliza în altă parte.

15 mar. 2011 23:53:35
Comentarii

Răspuns excelent -- și nu doar în comparație cu un alt răspuns, să zicem, mai slab, de genul „uite un site web” care ar putea fi pe undeva în apropiere.

editor editor
15 mar. 2011 23:59:06

Acest cod, plasat în functions.php, va dezactiva pluginul în panoul de administrare, dezactivându-l astfel pentru celelalte două teme. Mulțumesc Rarst pentru observație. Eu voiam doar să îl dezactivez pentru tema unde se afla fișierul functions.php.

PNMG PNMG
16 mar. 2011 03:19:21

Folosești întotdeauna o singură temă într-un moment dat pe un site dat... dar dacă dorești să reactivezi pluginul după ce ai dezactivat tema, și asta este posibil.

EAMann EAMann
21 mar. 2011 16:35:40
1
14

Aceasta este grație răspunsului strălucit al lui EAMann mai sus și am crezut că ar putea fi util și pentru autorul inițial al postării...

Am avut nevoie de o soluție pentru a mă asigura că utilizatorii dezactivează plugin-ul meu dacă încarcă versiunea premium (pentru a evita potențiale conflicte). Anterior, detectam starea acestuia cu is_plugin_active și afișam un mesaj de eroare în administrare pentru a-i îndemna pe utilizatori să-l oprească. Această soluție este MULT mai elegantă...

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' );

Notă: Nu părea să funcționeze pe register_activation_hook, dar admin_init funcționează perfect.

20 mar. 2012 14:24:27
Comentarii

Doar pentru a nota, sunt destul de sigur că is_plugin_active este deja verificat în hook-ul deactivate_plugins, așa că nu ar trebui să fie nevoie să o verificăm din nou

Bryan Willis Bryan Willis
11 sept. 2014 07:24:37
0

Iată soluția mea, creează un plugin care poate dezactiva alte plugin-uri astfel:

/*
 * Plugin Name: Dezactivează/Configurează Plugin-uri
 * Description: Îți permite să dezactivezi/configurezi plugin-uri bazat pe variabile de mediu
 * Author:      Chris Sewell
 */

/**
 * Dezactivează plugin-uri specificate în mediul de dezvoltare.
 * 
 * Acesta este un plugin "Must-Use". Codul de aici este încărcat automat înainte de încărcarea plugin-urilor obișnuite.
 * Acesta este singurul loc de unde plugin-urile obișnuite pot fi dezactivate programatic.
 * 
 * Plasează acest cod într-un fișier în WP_CONTENT_DIR/mu-plugins sau specifică o locație personalizată

 * la "development" sau "production" în fiecare server/mediu particular.
 */

/* Dezactivează plugin-uri specificate în mediul de dezvoltare */
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);
}

Implementează acest cod în producție, activează-l, apoi adu baza de date pe mașina ta locală de dezvoltare.

Sursa

26 sept. 2017 12:48:06
0

Dacă dorești să dezactivezi temporar un plugin în funcție de o anumită condiție, fără a-l dezactiva permanent pentru toți clienții (așa cum face deactivate_plugins()), ar trebui să utilizezi filtrul option_active_plugins într-un plugin din directorul mu-plugins, conform exemplului de mai jos:

# fișier: wp-content/mu-plugins/disable-plugins.php

add_filter( 'option_active_plugins', function( $plugins ){
    if ( $my_condition ) {
        $plugins= array_diff($plugins, array('plugin_to_rm_1.php', 'plugin_to_rm_2.php'));    
    }
    return $plugins;
});
20 dec. 2023 15:35:01