Comment trouver le slug des plugins?


11

Je me demande comment puis-je trouver le slug des plugins (slug = nom interne utilisé par WordPress pour faire les mises à jour des plugins et déterminer quels plugins sont actuellement actifs)? Il s'agit généralement du nom de dossier du plugin mais si un plugin n'a pas de dossier, c'est son nom de fichier (comme hello.php). Y a-t-il d'autres exceptions?

  1. Les caractères minuscules et majuscules sont-ils importants?
  2. Un plugin peut-il avoir un slug différent de son nom de dossier? Et s'il y a un plugin appelé hello.php et un autre /hello.php/hello.php?

Très bonne question, dommage que nous ne puissions pas attribuer de primes aux Q, mais je suppose que le A est le prix;)
brasofilo

Réponses:


8

La chaîne utilisée dans WordPress pour identifier le plugin est:

plugin_basename($file);

… Où $fileest un fichier avec les en-têtes du plugin .

Donc, si vous êtes dans votre plugin, récupérez le slug avec:

$slug = plugin_basename( __FILE__ );

1
plugin_basename ($ file); N'est pas la limace depuis 3.8.1. Il s'agit du chemin du dossier / plugin_main_file.php. Comme le "slug" du plugin Akismet n'est pas "akismet / akismet.php" mais c'est "akismet".
Jeff Mattson

3
ce n'est plus la bonne réponse dans les deux cas.
majick

@majick true, pour Wordpress 4.7.4 ce n'est pas la réponse
Marecky

2
Une autre façon de générer le plugin plugin est d'utiliser dirname(plugin_basename(__FILE__)).
ilanco

2

Si vous installez WP-CLI, vous pouvez obtenir la liste des plugins avec leur slug et leur version depuis la ligne de commande:

> wp plugin list

Je sais que ce n'est probablement pas ce que vous voulez, si vous avez besoin de trouver le slug dans le code, mais cela m'a aidé tout en travaillant avec le plugin TGM-Plugin-Activation.

Je trouve difficile de travailler avec WordPress sans WP-CLI, en général c'est un outil très utile pour de nombreuses tâches courantes liées à WordPress.


2

La différence entre le fichier du plugin (principal) et le slug du plugin est un endroit où le Codex WordPress pourrait faire beaucoup mieux. Je comprends votre confusion telle que je l'ai ressentie trop récemment (mêlée de frustration).

C'est ce que j'ai appris en faisant un "travail de détective" sur le code principal de WordPress.

Le fichier du plugin

C'est la façon unique dont WordPress identifie et enregistre un plugin. Il est composé du répertoire du plugin ET du fichier de plugin principal (celui avec l'en-tête du fichier contenant les différents détails du plugin comme la version, l'auteur, etc.).

Cela ressemblerait à quelque chose comme ceci: your-plugin-directory/main-file.php

Si vous regardez les données des plugins actifs (retournés par get_option( 'active_plugins' )), vous verrez que WordPress n'a besoin que de ce fichier de plugin pour identifier correctement les plugins.

Vous pouvez choisir de le considérer comme le chemin relatif du fichier principal de votre plugin (par rapport au wp-content/plugins/répertoire qui est). Vous pouvez "composer" le chemin absolu du fichier plugin principal avec quelque chose comme ceci:trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file

Le noyau lui-même génère le fichier du plugin comme ceci:

$plugin_main_file = plugin_basename( trim( $plugin_main_file_absolute_path ) );

Le plugin slug

On pourrait s'attendre à ce que le plugin "slug" soit une sorte d' ID standardisé pour le plugin comme le post slug est pour les publications - vous pouvez donc utiliser ce "slug" pour le fournir aux fonctions principales de WordPress et faire avancer les choses.

Pas vraiment. Après avoir cherché dans le noyau des références à des plugins de plugins (ou des thèmes pour ce qui compte) et trouvé presque rien, je pense que je l'ai compris.

Les seules véritables limaces sont ceux pour des choses accessibles via une URL unique: messages, pages, taxonomies, etc. C'est le point entier de prendre le nom de quelque chose (comme un titre de poste) et générer une version conviviale URL de cette: à l' utilisation dans une URL.

Mais où utilisons-nous le thème / plugins "slugs" dans les URL?

Nous ne le faisons pas sur des installations WordPress individuelles - ni dans l'admin WP ni dans le frontend.

Cependant, il existe un endroit très enchevêtré avec le code WordPress, le site WordPress.org. Les gens ont du mal à faire la distinction entre les deux, y compris le fait qu'il est devenu courant chez les développeurs de considérer le thème WordPress.org ou les plugins de plugins devraient fonctionner de la même manière qu'un slug de publication ou de page.

Ils servent le même objectif mais sur des sites Web distincts . Sur WordPress.org, ils sont utilisés pour identifier de manière unique un thème parmi les autres et un plugin parmi les autres (dans des URL comme https://wordpress.org/plugins/akismet/).

Mais en ce qui concerne les installations individuelles de WordPress, la même unicité ne peut pas être garantie car il n'y a aucune autorité pour l'appliquer (comme sur WordPress.org). Cela pourrait fonctionner si tous les plugins et thèmes venaient de WordPress.org, mais heureusement, ce n'est pas le cas.

Que fait le code WordPress avec les slugs de thème / plugin?

Le code de base de WordPress ne repose pas sur des slugs de thème / plugin pour faire des choses comme installer, activer, mettre à jour, supprimer des thèmes ou des plugins.

Pour les thèmes, il s'appuie sur le répertoire du thème car le point d'entrée principal dans un thème est le style.cssfichier (vous ne pouvez pas utiliser un autre fichier CSS pour contenir l'en-tête des détails de votre thème).

Pour les plugins, il s'appuie sur le répertoire des plugins ET sur le fichier de plugin principal , car les plugins peuvent appeler leur fichier principal comme ils le souhaitent.

La seule chose pour laquelle le noyau utilise des slugs theme / plugins est quand il gère les thèmes et les plugins du répertoire WordPress.org: récupérer les listes de plugins, rechercher les mises à jour, rapporter les données d'utilisation du répertoire, etc.


Pour en savoir plus sur les plugins de plugin: chaque fois que vous trouvez des données de plugin avec l' slugentrée, 99% du temps, il se référera au slug WordPress.org du plugin.

Comment identifier les plugins?

Si vous souhaitez activer, mettre à jour, désactiver ou supprimer par programme un certain plug-in sur une installation WordPress, vous devez utiliser le fichier du plug-in. Vous pouvez l'obtenir comme ceci à partir du fichier principal de votre plugin:

$plugin_file = plugin_basename( __FILE__ );

Si vous souhaitez cibler un certain plugin à partir d'un autre plugin, les choses deviennent un peu plus délicates car vous devez vous fier à un peu de "conjectures".

Vous pouvez coder en dur le nom du plugin, rechercher le plugin dans la liste de tous les plugins (voir get_plugins () ) et obtenir le fichier du plugin à partir de là.

Si vous connaissez une classe ou une fonction définie par ce plugin, vous pouvez utiliser la réflexion (voir cette réponse pour les classes et celle-ci pour les fonctions).


J'espère que cela vous aide, vous et d'autres qui pourraient avoir du mal à gérer les "plugins slugs". Cela aurait pu me faire gagner quelques heures :)


0

Juste pour clarifier depuis le message d'origine.

La façon dont j'ai trouvé le plugin de plugin est d'abord de naviguer vers votre dossier de plugin, puis d'ouvrir le dossier associé au plugin, et enfin de trouver le fichier qui contient le code ci-dessous. Une fois que vous avez trouvé ce fichier, le nom du fichier moins l'extension doit être votre plugin plugin.

Par exemple, si j'ai trouvé le code ci-dessous dans un fichier nommé advanced-plugin-awesomeness.php, mon slug serait advanced-plugin-awesomeness.

J'espère que cela t'aides!

/*
Plugin Name: Name of plugin here
Version: 2.4.6
Description: plugin description here
Author: plugin author here

-1 car alors que la plupart des noms de fichiers et des répertoires correspondent, ce n'est pas une méthode fiable car le slug de mise à jour est en fait le répertoire - pas le nom de fichier (sauf s'il n'y a pas de répertoire.)
majick

ou même pas l'annuaire! voir ma réponse mise à jour, elle vient en fait du nom du plugin.
majick

0

Malheureusement, le slug est renvoyé via l'API de mise à jour, la réponse à cette question n'est pas si évidente sauf si vous interrogez l'API elle-même. Cependant, si vous voulez voir une liste de vos plugins de plugins actuels et des données de plugins associées, vous pouvez simplement faire:

print_r(get_site_transient('update_plugins'));

Mais, cela n'aura pas d'informations sur un plugin nouvellement installé pendant encore 12 heures, vous devrez faire quelque chose de différent pour ceux-ci, par exemple. utiliser une version modifiée du code de wp_update_pluginsdans wp-includes/update.php...

Après avoir fait cela pour le tester, il semble confirmer que, quel que soit le nom de fichier du plugin, l'emplacement ou les majuscules, c'est en fait le Plugin Namequi génère le slug de mise à jour, très probablement via sanitize_title. Je pense donc que la bonne réponse devrait être:

// if you have the plugin basename:
// $pluginfile = WP_PLUGIN_DIR.'/'.$pluginbasename;

// otherwise if you have the absolute path already:
$plugin = get_plugin_data($pluginfile);
$pluginslug = sanitize_title($plugin['Name']);

+1 et une note supplémentaire est que cela pourrait aussi bien changer avec le temps car il a été explicité par l'équipe wordpress.org que la méthodologie de calcul des limaces n'est pas encore totalement définitive
Mark Kaplun

Je ne suis pas sûr que ce soit exact, j'essayais de le faire pour un plugin mais cela échoue: le nom du plugin tel que renvoyé est "Responsive WordPress Slider - Soliloquy Lite" et le slug est: soliloquy-lite
Chris

Je soupçonne que c'est parce que le slug est généré au moment où le plugin est soumis au référentiel et ne change pas avec le nom plus tard ... dans la plupart des cas, il correspond au nom du répertoire, mais s'il y a des exceptions aux deux, il pourrait être l'un ou l'autre. ce n'est pas idéal: - /
majick

0

Vous pouvez obtenir le nom du dossier du plugin (PHP5.3 +) en passant DIR à plugin_basename (), comme ceci:

$plugin_foldername = plugin_basename( __DIR__ );

0

Essaye ça:

function get_slugname(){
    $tmp = array();
    $plugins_all = get_plugins() ;
    $plugin_slug = explode('/',dirname(plugin_basename(__FILE__)));
    foreach ($plugins_all as $key=>$value) {
        if ($plugin_slug[0] == explode('/',$key)[0] ) {
        $tmp = $value;
        $tmp['slug'] = explode('/',$key)[0];
        $tmp['file'] = explode('/',$key)[1];
        }
    }
return $tmp;
}

1
Veuillez modifier votre réponse et ajouter une explication de ce que fait ce code.
Nathan Johnson

0

Pour la plupart des plugins, le "slug" sera le même que le nom du répertoire. Bien que les utilisateurs de .org puissent définir le nom du répertoire comme ils le souhaitent.

$slug = (dirname(plugin_basename(__FILE__)));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.