Come posso trovare lo slug dei plugin?
Mi chiedo come posso trovare lo slug dei plugin (slug = nome interno utilizzato da WordPress per gli aggiornamenti dei plugin e per determinare quali plugin sono attualmente attivi)? Di solito è il nome della cartella del plugin ma se un plugin non ha una cartella, è il nome del suo file (come hello.php). Ci sono altre eccezioni?
- I caratteri minuscoli e maiuscoli sono importanti?
- Un plugin può avere uno slug diverso dal nome della sua cartella? Cosa succede se c'è un plugin chiamato hello.php e un altro /hello.php/hello.php?

La differenza tra il file principale del plugin e lo slug del plugin è un punto in cui il Codex di WordPress potrebbe fare molto meglio. Capisco la tua confusione perché l'ho provata anch'io recentemente (mescolata a frustrazione).
Ecco cosa ho imparato facendo un po' di "lavoro investigativo" sul codice core di WordPress.
Il file del plugin
Questo è il modo univoco con cui WordPress identifica e registra un plugin. È composto dalla directory del plugin E dal file principale del plugin (quello con l'intestazione che contiene vari dettagli come versione, autore, ecc.).
Sembrerà qualcosa del genere: your-plugin-directory/main-file.php
Se osservi i dati dei plugin attivi (restituiti da get_option( 'active_plugins' )
), vedrai che WordPress ha bisogno solo di questo file del plugin per identificare correttamente i plugin.
Puoi pensarlo come il percorso relativo del file principale del tuo plugin (relativo alla directory wp-content/plugins/
). Puoi "comporre" il percorso assoluto del file principale del plugin con qualcosa del genere: trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file
Il core stesso genera il file del plugin in questo modo:
$plugin_main_file = plugin_basename( trim( $plugin_main_file_absolute_path ) );
Lo slug del plugin
Ci si aspetterebbe che lo "slug" del plugin sia una sorta di ID standardizzato per il plugin, proprio come lo slug del post lo è per i post - in modo da poter usare questo "slug" per fornirlo alle funzioni core di WordPress e far partire le cose.
Non proprio. Dopo aver cercato nel core riferimenti agli slug di plugin (o temi, per quel che vale) e trovato quasi nulla, credo di aver capito.
Gli unici slug reali sono quelli per elementi accessibili tramite un URL univoco: post, pagine, tassonomie, ecc. Questo è lo scopo principale di prendere il nome di qualcosa (come un titolo di post) e generarne una versione adatta per gli URL: usarla in un URL.
Ma dove usiamo gli "slug" di temi/plugin negli URL?
Non lo facciamo sulle installazioni singole di WordPress - né nell'admin né nel frontend.
Tuttavia, c'è un posto molto legato al codice WordPress, il sito WordPress.org. Le persone hanno difficoltà a distinguere tra i due, incluso il fatto che sia diventato comune tra gli sviluppatori considerare che gli slug di temi o plugin su WordPress.org dovrebbero funzionare come uno slug di post o pagina.
Svolgono lo stesso scopo ma su siti web separati. Su WordPress.org vengono usati per identificare univocamente un tema dagli altri e un plugin dal resto (in URL come https://wordpress.org/plugins/akismet/
).
Ma quando si tratta di installazioni WordPress singole, la stessa unicità non può essere garantita perché non c'è un'autorità che la imponga (come su WordPress.org). Potrebbe funzionare se tutti i plugin e i temi provenissero da WordPress.org, ma per fortuna non è così.
Cosa fa il codice di WordPress con gli slug di temi/plugin?
Il codice core di WordPress non si affida agli slug di temi/plugin per fare cose come installare, attivare, aggiornare o eliminare temi o plugin.
Per i temi, si affida alla directory del tema poiché il punto di ingresso principale in un tema è il file style.css
(non puoi usare un altro file CSS per l'intestazione con i dettagli del tema).
Per i plugin, si affida alla directory del plugin E al file principale del plugin, poiché i plugin possono chiamare il loro file principale come preferiscono.
L'unica cosa per cui il core usa gli slug di temi/plugin è quando gestisce temi e plugin dalla directory di WordPress.org: recuperare liste di plugin, controllare aggiornamenti, segnalare dati di utilizzo alla directory, e così via.
Per riassumere riguardo agli slug di plugin: ogni volta che trovi dati di plugin con la voce slug
, il 99% delle volte si riferirà allo slug del plugin su WordPress.org.
Come possiamo identificare i plugin?
Se vuoi attivare, aggiornare, disattivare o eliminare un certo plugin a livello di codice in un'installazione WordPress, devi usare il file del plugin. Puoi ottenerlo così dal file principale del tuo plugin:
$plugin_file = plugin_basename( __FILE__ );
Se vuoi indirizzare un certo plugin da un altro plugin, le cose si fanno più complicate poiché devi affidarti a un po' di "indovinelli".
Potresti hardcodare il nome del plugin, cercare il plugin nella lista di tutti i plugin (vedi get_plugins()) e ottenere il file del plugin da lì.
Se conosci una classe o funzione definita da quel plugin, potresti usare la reflection (vedi questa risposta per le classi e questa per le funzioni).
Spero che questo ti aiuti e aiuti altri che potrebbero avere difficoltà con gli "slug di plugin". Avrebbe potuto farmi risparmiare un paio d'ore :)

La stringa utilizzata in WordPress per identificare il plugin è:
plugin_basename($file);
... dove $file
è un file con gli header del plugin.
Quindi, se sei all'interno del tuo plugin, ottieni lo slug con:
$slug = plugin_basename( __FILE__ );

plugin_basename($file); Non è lo slug a partire dalla versione 3.8.1. Questo è il percorso cartella/plugin_main_file.php. Ad esempio, lo "slug" del plugin Akismet non è "akismet/akismet.php" ma è semplicemente "akismet".

Se installi WP-CLI puoi ottenere l'elenco dei plugin con il loro slug e versione direttamente dalla riga di comando:
> wp plugin list
So che probabilmente non è esattamente quello che cerchi, se hai bisogno di trovare lo slug nel codice, ma mi è stato utile mentre lavoravo con il plugin TGM-Plugin-Activation.
Personalmente trovo difficile lavorare con WordPress senza WP-CLI, in generale è uno strumento molto utile per molte operazioni comuni legate a WordPress.

Sfortunatamente lo slug viene restituito tramite l'API di aggiornamento, la risposta a questa domanda non è così ovvia a meno che non si interroghi direttamente l'API stessa. Tuttavia, se vuoi vedere una lista degli slug dei tuoi plugin attuali e i relativi dati dei plugin puoi semplicemente fare:
print_r(get_site_transient('update_plugins'));
Ma, questo non avrà informazioni su un plugin appena installato per altre 12 ore, dovresti fare qualcosa di diverso per questi, ad esempio usare una versione modificata del codice da wp_update_plugins
in wp-includes/update.php
...
Avendo fatto questo per testarlo, sembra confermare che, indipendentemente dal nome del file del plugin o dalla sua posizione o dalle maiuscole, è in realtà il Plugin Name
che genera lo slug di aggiornamento, molto probabilmente tramite sanitize_title
. Quindi credo che la risposta corretta dovrebbe essere:
// se hai il basename del plugin:
// $pluginfile = WP_PLUGIN_DIR.'/'.$pluginbasename;
// altrimenti se hai già il percorso assoluto:
$plugin = get_plugin_data($pluginfile);
$pluginslug = sanitize_title($plugin['Name']);

+1 e una nota aggiuntiva è che questo potrebbe cambiare nel tempo, poiché il team di wordpress.org ha chiarito che la metodologia di calcolo degli slug non è ancora completamente definitiva

Non sono sicuro che sia accurato, stavo cercando di farlo per un plugin ma fallisce: il nome del plugin restituito è "Responsive WordPress Slider - Soliloquy Lite" e lo slug è: soliloquy-lite

Sospetto che ciò accada perché lo slug viene generato al momento dell'invio del plugin al repository e non cambia con il nome successivamente... nella maggior parte dei casi corrisponde al nome della directory, ma se ci sono eccezioni per entrambi, potrebbe essere uno o l'altro. Non è l'ideale :-/

Per chiarire rispetto al post originale.
Il modo in cui ho trovato lo slug del plugin è navigando prima nella cartella del tuo plugin, poi aprendo la cartella associata al plugin e infine trovando il file che contiene il codice qui sotto. Una volta trovato questo file, il nome del file senza estensione dovrebbe essere lo slug del tuo plugin.
Ad esempio, se ho trovato il codice qui sotto in un file chiamato advanced-plugin-awesomeness.php, il mio slug sarebbe advanced-plugin-awesomeness.
Spero sia utile!
/*
Plugin Name: Nome del plugin qui
Version: 2.4.6
Description: descrizione del plugin qui
Author: autore del plugin qui

-1 poiché sebbene la maggior parte dei nomi dei file e delle directory corrispondano, questo non è un metodo affidabile poiché lo slug dell'aggiornamento è in realtà la directory - non il nome del file (a meno che non ci sia una directory).

Prova questo:
function get_slugname(){
$tmp = array();
$plugins_all = get_plugins(); // Ottiene tutti i plugin installati
$plugin_slug = explode('/', dirname(plugin_basename(__FILE__))); // Ottiene lo slug del plugin corrente
foreach ($plugins_all as $key=>$value) {
if ($plugin_slug[0] == explode('/', $key)[0]) {
$tmp = $value;
$tmp['slug'] = explode('/', $key)[0]; // Imposta lo slug del plugin
$tmp['file'] = explode('/', $key)[1]; // Imposta il file del plugin
}
}
return $tmp; // Restituisce l'array con le informazioni del plugin
}

Per favore modifica la tua risposta e aggiungi una spiegazione di cosa fa questo codice.
