web-dev-qa-db-fra.com

Charger le plugin de manière sélective pour les pages ou les publications, etc.

Il est possible de sélectionner le chargement du plug-in par page ou par publication, car j'ai 35 plug-ins et beaucoup d'entre eux ne sont pas nécessaires dans de nombreuses pages ou publications et uniquement pour certaines pages. Comment faire?

J'ai testé le plug-in bêta pour cela, mais cela ne fonctionne pas correctement et je veux savoir s'il existe du code dans Wordpress pour désactiver le plug-in dans certaines pages ou publications que je peux utiliser pour créer mon plug-in.

3
user2501504

Il est possible de choisir quel plugin charger par page ou par poste [...]?

Réponse courte: Pas avec un plugin (ni avec du code dans un thème) .

Normalement, dans WordPress, vous utilisez des balises conditionnelles pour comprendre dans quel message ou quelle page vous êtes, par exemple. vous pouvez utiliser is_page('my-page') ou is_post(12) et ainsi de suite.

Le problème est que ces balises conditionnelles sont disponibles après la requête pour l'URL actuelle est analysée, et lorsque cela se produit, tous les plugins et le thème sont déjà chargés, il n'y a donc aucune chance (une API de machine à remonter le temps n'est pas disponible dans WordPress pour le moment).

Même si vous regardez directement la requête url (au lieu de la requête via des balises conditionnelles), il n’ya aucun moyen de vous assurer que votre plugin s’exécute avant les plugins qu’il est destiné à désactiver.

La seule solution possible consiste à utiliser un plugin MU , qui examine les URL de requête et désactive sélectivement les plugins. Cela est possible car les plugins MU sont chargés avant plugins réguliers.

Pour ce faire, vous pouvez filtrer 'option_active_plugins'. Une modification du résultat de get_option(), comme expliqué dans cette réponse @toscho .

Donc, créez un plugin MU et mettez-y quelque chose comme (le code n'est qu'un exemple):

<?php
add_filter( 'option_active_plugins', 'enable_plugins_selectively' );

function enable_plugins_selectively( $plugins ) {
  $current_page = add_query_arg( array() );

  switch ($current_page) {
      case '/' : // enable specific plugins for home page
        $plugins = array(
          'plugin_dir/plugin_file.php',
          'third_plugin_dir/third_plugin_file.php',
        );
        break;

      case '/a-page/' : // enable specific plugins for this page
        $plugins = array(
          'plugin_dir/plugin_file.php',
          'third_plugin_dir/third_plugin_file.php',
        );
        break;

      case '/2013/09/hello-world/' : // disable specific plugin for this post
        if (array_key_exists('plugin_dir/plugin_file.php', $plugins) ) {
           unset( $plugins[ array_search('plugin_dir/plugin_file.php', $plugins) ] );
        }
        break;
  }
  return $plugins;
}

Même si vous pouvez utiliser des expressions régulières pour vérifier certaines URL, vous devriez vous demander si cela en vaut la peine: toutes ces codées en dur URL sont pénibles à maintenir.

Comprendre le problème

Au lieu de faire l'hypothèse qu'un plugin ralentit le chargement de la page, la meilleure chose à faire est de faire des tests et de voir efficacement l'impact sur les performances. Il existe des outils genericc PHP pour la portée et même des plugins WordPress, tels que Query Monitor ou Laps .

Une approche différente

Normalement, les plugins font leur travail en utilisant des hooks: en appelant une série de add_action/add_filter pour associer un comportement à des hooks.

En utilisant spéculaire remove_action/remove_filter, vous pouvez empêcher les plug-in de faire des actions coûteuses lorsque vous n'en avez pas besoin. Cela n’empêche pas WordPress d’exiger que le fichier de plug-in soit réellement requis, mais dans l’ordre de 30 plug-ins, cela ne devrait pas poser de problème (et avec les versions modernes de PHP l'impact sur les performances sera très faible) .

5
gmazzap