J'ai essayé d'utiliser deactivate_plugins
function pour désactiver un plugin uniquement pour les appareils mobiles.
Cela a fonctionné: lorsque j'entre sur un site mobile, le plugin est désactivé, mais lorsque j'entre un site sur PC, le plugin est également désactivé.
Y at-il un moyen de ne pas désactiver un plugin, mais seulement disable it pour les mobiles?
function deactivate_plugin_conditional() {
if ( wp_is_mobile() ) {
deactivate_plugins( array('/first-plugin/first.php', '/second-plugin/second.php') );
}
}
add_action( 'admin_init', 'deactivate_plugin_conditional' );
Si vous désactivez un plug-in, la modification est stockée dans une base de données. Ainsi, lors de tout accès ultérieur, le plug-in est désactivé, quel que soit le périphérique utilisé pour accéder au site.
Les plugins actifs dans WordPress sont récupérés avec la fonction wp_get_active_and_valid_plugins()
.
Il utilise l'option "active_plugins"
pour obtenir le plugin actuellement actif. Toutes les options de WordPress peuvent être filtrées à l’aide du crochet "option_{$option}"
filter, qui dans ce cas est "option_active_plugins"
.
Vous pouvez penser à utiliser un plugin pour filtrer cette option, mais le problème est qu'il est possible que les plugins que vous souhaitez exclure soient chargés avant votre plugin, car vous ne pouvez jamais être sûr que le plugin est chargé en premier.
La solution consiste à utiliser un plugin MU pour le scope.
Les plugins MU fonctionnent très tôt dans WordPress, ce qui vous donne la possibilité de filtrer l'option "option_active_plugins"
.
Un autre problème est que les plug-ins MU se chargent très tôt, même avant que le fichier wp-includes/vars.php
contenant la fonction wp_is_mobile()
ne soit chargé. Par conséquent, si vous utilisez cette fonction dans un plug-in MU, vous obtenez une erreur fatale.
Charger le fichier "manuellement" est not une option, car WordPress chargera ce fichier en utilisant require
et pas require_once
. Ainsi, si vous chargez le fichier, lorsque WordPress le charge à nouveau, vous obtenez une erreur fatale pour la fonction déjà définie. .
La seule solution est d'écrire encore _ wp_is_mobile()
, il suffit de gérer le noyau et d'utiliser un nom différent.
Créez le fichier PHP et enregistrez-le dans le dossier wp-content/mu-plugins
.
Tout d’abord, écrivez-y une fonction qui renvoie tous les plug-ins à désactiver pour les appareils mobiles:
function my_non_mobile_plugins() {
return array(
// an array of all the plugins you want to exclude for mobile
'plugin-folder/plugin-file.php',
'another-plugin-folder/another-plugin-file.php',
'no-folder-plugin-file.php'
);
}
Après cela, écrivez un clone} _ fonction wp_is_mobile()
, avec un autre nom:
function my_is_mobile() {
$is_mobile = false;
if ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false
) {
$is_mobile = true;
}
return $is_mobile;
}
Enfin, filtrez 'option_active_plugins'
en utilisant la fonction précédente pour vérifier si supprimer des plugins ou non
add_filter( 'option_active_plugins', 'my_disable_plugins_for_mobiles' );
function my_disable_plugins_for_mobiles( $plugins ) {
if ( ! my_is_mobile() ) {
return $plugins; // for non-mobile device do nothing
}
$not_allowed = my_non_mobile_plugins(); // get non allowed plugins
return array_values( array_diff( $plugins, $not_allowed ) );
}