Je me demande comment puis-je trouver le slug des plugins (slug = nom interne utilisé par WordPress pour faire les mises à jour de plugins et déterminer quels plugins sont actuellement actifs)? C'est généralement le nom du 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?
La chaîne utilisée dans WordPress pour identifier le plugin est la suivante:
plugin_basename($file);
… Où $file
est un fichier avec les en-têtes du plugin .
Donc, si vous êtes dans votre plugin, obtenez le slug avec:
$slug = plugin_basename( __FILE__ );
Si vous installez WP-CLI alors vous pouvez obtenir la liste des plugins avec leur slug et version à partir de 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 code 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.
La différence entre le fichier 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 sentie trop récemment (avec frustration).
C’est ce que j’ai appris en effectuant du "travail de détective" sur le code principal de WordPress.
C'est la manière unique dont WordPress identifie et enregistre un plugin. Il se compose du répertoire du plugin ET du fichier de plugin principal (celui avec l'en-tête de fichier contenant les différents détails du plugin tels que la version, l'auteur, etc.).
Cela ressemblerait à quelque chose comme ceci: your-plugin-directory/main-file.php
Si vous consultez les données des plugins actifs (renvoyées 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 répertoire wp-content/plugins/
). Vous pouvez "composer" le chemin absolu du fichier de plugin principal avec quelque chose comme: trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file
Le noyau lui-même génère le fichier plugin comme ceci:
$plugin_main_file = plugin_basename( trim( $plugin_main_file_absolute_path ) );
On pourrait s’attendre à ce que le plugin "slug" soit une sorte de identifiant standardisé du plugin comme le slug de publication est destiné aux publications - vous pouvez donc utiliser ce "slug" pour le fournir aux fonctions principales de WordPress et obtenir des résultats Aller.
Pas vraiment. Après avoir cherché dans le noyau des références pour y insérer des slugs (ou des thèmes pour ce qui compte) et ne rien trouvé, je pense bien comprendre.
Les seuls vrais slugs sont ceux qui sont accessibles via une URL unique: posts, pages, taxonomies, etc. C’est l’intérêt de prendre le nom de quelque chose (comme un titre de post) et de générer une URL amicale version de cela: pour l'utiliser dans une URL.
Nous ne le faisons pas sur des installations WordPress individuelles - ni dans l'admin WP, ni dans l'interface.
Cependant, il y a un endroit très enchevêtré dans le code WordPress, le site WordPress.org. Les gens ont du mal à faire la distinction entre les deux, y compris le fait qu'il soit devenu assez commun parmi les développeurs de considérer le Thème WordPress.org ou plugin slugs devrait fonctionner de la même manière qu'un message ou un slug de page.
Ils ont le même objectif mais sur des sites Web {séparés}. Sur WordPress.org, ils sont utilisés pour identifier de manière unique un thème parmi les autres et un plugin parmi le reste (dans des URL comme https://wordpress.org/plugins/akismet/
).
Mais en ce qui concerne les installations individuelles WordPress, la même unicité ne peut être garantie car il n’existe aucune autorité pour l’appliquer (comme sur WordPress.org). Cela pourrait fonctionner si tous les plugins et les thèmes venaient de WordPress.org, mais heureusement ce n’est pas le cas.
Le code principal de WordPress ne repose pas sur des slugs de plug-ins thème/plugin pour effectuer des tâches telles que l’installation, l’activation, la mise à jour, la suppression de thèmes ou de plugins.
Pour les thèmes, il s’appuie sur le répertoire theme car le point d’entrée principal d’un thème est le fichier style.css
(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 plugin ET sur le fichier plugin principal , car les plugins peuvent appeler leur fichier principal comme ils le souhaitent.
La seule chose pour laquelle le noyau utilise theme/plugins slugs est: quand il gère les thèmes et les plugins à partir du répertoire WordPress.org: rechercher des listes de plugins, rechercher des mises à jour, générer des rapports sur les données d’utilisation du répertoire, etc. sur.
Pour conclure, à propos de plugins slugs: chaque fois que vous trouvez des données de plug-in avec l'entrée slug
, 99% du temps, il fera référence au slug de WordPress.org du plug-in.
Si vous souhaitez activer, mettre à jour, désactiver ou supprimer par programmation un plugin sur une installation WordPress, vous devez utiliser le fichier du plugin. Vous pouvez l'obtenir comme ceci à partir de le fichier principal de votre plugin:
$plugin_file = plugin_basename( __FILE__ );
Si vous voulez cibler un certain plugin depuis un autre plugin,} _ les choses deviennent un peu plus compliquées, car vous devez vous fier à un peu de "devinette".
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 de plugin à partir de là.
Si vous connaissez une classe ou une fonction définie par ce plugin, vous pouvez utiliser la réflexion (voir this answer pour les classes et celui-ci pour les fonctions).
J'espère que cela vous aidera, vous et les autres, à avoir du mal à gérer les "plugins" Cela aurait pu me faire gagner quelques heures :)
Juste pour clarifier depuis le post original.
La façon dont j'ai trouvé le plugin slug est d'abord de naviguer dans votre dossier de plugins, 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 slug de 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
Malheureusement, le slug est renvoyé via l'API de mise à jour, la réponse à cette question n'est pas si évidente à moins que vous interrogiez l'API elle-même. Toutefois, si vous souhaitez voir une liste de vos slugs de plug-in actuels et des données de plug-in 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 12 heures supplémentaires, vous devrez faire quelque chose de différent pour ceux, par exemple. utilisez une version modifiée du code à partir de wp_update_plugins
dans wp-includes/update.php
...
Après avoir fait cela pour le tester, il semble confirmer que, quel que soit le nom du fichier, l’emplacement ou la majuscule du plugin, c’est le Plugin Name
qui génère le slug de mise à jour, probablement via sanitize_title
. Donc, je crois 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']);
Vous pouvez obtenir le nom du dossier du plugin (PHP 5.3 +) en passantDIRà plugin_basename (), comme suit:
$plugin_foldername = plugin_basename( __DIR__ );
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;
}