Wie finde ich Plugins 'Slug?

11

Ich frage mich, wie ich den Slug von Plugins finden kann (slug = interner Name, der von WordPress verwendet wird, um Plugin-Updates durchzuführen und festzustellen, welche Plugins derzeit aktiv sind). Es ist normalerweise der Ordnername des Plugins, aber wenn ein Plugin keinen Ordner hat, ist es sein Dateiname (wie hello.php). Gibt es noch andere Ausnahmen?

  1. Sind Klein- und Großbuchstaben wichtig?
  2. Kann ein Plugin einen anderen Slug als seinen Ordnernamen haben? Was ist, wenn es ein Plugin namens hello.php und ein anderes /hello.php/hello.php gibt?
Paul
quelle
Sehr gute Frage, schade, dass wir Qs keine Kopfgelder
gewähren können

Antworten:

8

Die in WordPress verwendete Zeichenfolge zur Identifizierung des Plugins lautet:

plugin_basename($file);

... wo $fileist eine Datei mit dem Plugin - Header .

Also, wenn Sie in Ihrem Plugin sind, holen Sie sich den Slug mit:

$slug = plugin_basename( __FILE__ );
Fuxia
quelle
1
plugin_basename ($ file); Ist nicht die Schnecke seit 3.8.1. Dies ist der Ordner / plugin_main_file.php Pfad. Als "Slug" des Plugins ist Akismet nicht "akismet / akismet.php", sondern "akismet".
Jeff Mattson
3
Dies ist in beiden Fällen nicht mehr die richtige Antwort.
Majick
@majick wahr, für Wordpress 4.7.4 ist es nicht die Antwort
Marecky
2
Eine andere Möglichkeit, den Plugin-Slug zu generieren, ist die Verwendung von dirname(plugin_basename(__FILE__)).
Ilanco
2

Wenn Sie WP-CLI installieren , können Sie die Liste der Plugins mit ihrem Slug und ihrer Version über die Befehlszeile abrufen:

> wp plugin list

Ich weiß, dass Sie das wahrscheinlich nicht wollen, wenn Sie den Slug-in-Code finden müssen, aber es hat mir bei der Arbeit mit dem TGM-Plugin-Activation-Plugin geholfen.

Ich finde es schwierig, mit WordPress ohne die WP-CLI zu arbeiten. Im Allgemeinen ist es ein sehr nützliches Werkzeug für viele allgemeine Aufgaben im Zusammenhang mit WordPress.

Thomas Bindzus
quelle
2

Der Unterschied zwischen der Plugin- (Haupt-) Datei und dem Plugin-Slug ist ein Ort, an dem der WordPress-Codex viel besser abschneiden könnte. Ich verstehe Ihre Verwirrung, wie ich sie in letzter Zeit gespürt habe (gemischt mit Frustration).

Dies habe ich gelernt, indem ich einige "Detektivarbeiten" am WordPress-Kerncode durchgeführt habe.

Die Plugin-Datei

Dies ist die einzigartige Art und Weise, wie WordPress ein Plugin identifiziert und aufzeichnet. Es besteht aus dem Verzeichnis des Plugins UND der Haupt-Plugin-Datei (die mit dem Dateikopf, der die verschiedenen Plugin-Details wie Version, Autor usw. enthält).

Es würde ungefähr so ​​aussehen: your-plugin-directory/main-file.php

Wenn Sie sich die aktiven Plugins-Daten ansehen (zurückgegeben von get_option( 'active_plugins' )), werden Sie feststellen, dass WordPress diese Plugin-Datei nur benötigt, um Plugins richtig zu identifizieren.

Sie können sich vorstellen, dass dies der relative Pfad der Hauptdatei Ihres Plugins ist (relativ zum wp-content/plugins/Verzeichnis). Sie könnten den absoluten Pfad der Haupt-Plugin-Datei mit so etwas "komponieren":trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file

Der Kern selbst generiert die Plugin-Datei wie folgt:

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

Der Plugin Slug

Man würde erwarten, dass das Plugin "slug" eine Art standardisierte ID für das Plugin ist, wie der Post-Slug für Posts - also könnten Sie diesen "Slug" verwenden, um es für WordPress-Kernfunktionen bereitzustellen und die Dinge in Gang zu bringen.

Nicht wirklich. Nachdem ich den Kern nach Verweisen auf Plugin-Slugs (oder Themen für das Wesentliche) durchsucht und fast nichts gefunden habe, denke ich, dass ich es verstanden habe.

Die einzigen echten Slugs sind solche für Dinge, auf die über eine eindeutige URL zugegriffen werden kann: Posts, Seiten, Taxonomien usw. Das ist der springende Punkt, wenn Sie den Namen von etwas (wie einen Post-Titel) nehmen und eine URL-freundliche Version davon generieren: verwenden es in einer URL.

Aber wo verwenden wir Theme / Plugins "Slugs" in URLs?

Wir machen das nicht bei einzelnen WordPress-Installationen - weder im WP-Admin noch im Frontend.

Es gibt jedoch einen Ort, der sehr stark mit dem WordPress-Code verstrickt ist, die WordPress.org-Site. Es fällt den Leuten schwer, zwischen den beiden zu unterscheiden, einschließlich der Tatsache , dass es unter Entwicklern irgendwie üblich wurde, zu berücksichtigen, dass das WordPress.org-Thema oder Plugin-Slugs genauso funktionieren sollten wie ein Post- oder Page-Slug.

Sie dienen demselben Zweck, jedoch auf separaten Websites. Auf WordPress.org werden sie verwendet, um ein Thema von anderen und ein Plugin von den anderen eindeutig zu identifizieren (in URLs wie https://wordpress.org/plugins/akismet/).

Bei einzelnen WordPress-Installationen kann jedoch nicht die gleiche Einzigartigkeit garantiert werden, da keine Berechtigung zur Durchsetzung besteht (wie bei WordPress.org). Es könnte funktionieren, wenn alle Plugins und Themes von WordPress.org stammen, aber zum Glück ist das nicht der Fall.

Was macht der WordPress-Code mit Theme / Plugin-Slugs?

Der WordPress-Kerncode basiert nicht auf Themen- / Plugin-Slugs , um beispielsweise Themen oder Plugins zu installieren, zu aktivieren, zu aktualisieren, zu löschen.

Bei Themen hängt es vom Themenverzeichnis ab, da der Haupteinstiegspunkt in ein Thema die style.cssDatei ist (Sie können keine andere CSS-Datei verwenden, um Ihren Kopf für Themendetails zu speichern).

Für Plugins wird das Plugin-Verzeichnis UND die Haupt-Plugin-Datei verwendet , da Plugins ihre Hauptdatei nach Belieben aufrufen können.

Das einzige, wofür der Kern Theme / Plugins-Slugs verwendet, ist, wenn er Themes und Plugins aus dem WordPress.org-Verzeichnis verarbeitet: Abrufen von Plugin-Listen, Suchen nach Updates, Zurückmelden an die Verzeichnisnutzungsdaten usw.


Um alles über Plugin-Slugs zusammenzufassen: Wenn Sie Plugin-Daten mit dem slugEintrag finden, wird in 99% der Fälle auf den WordPress.org-Slug des Plugins verwiesen.

Wie identifizieren wir Plugins?

Wenn Sie ein bestimmtes Plugin in einer WordPress-Installation programmgesteuert aktivieren, aktualisieren, deaktivieren oder löschen möchten, müssen Sie die Plugin-Datei verwenden. Sie können es so aus der Hauptdatei Ihres Plugins herunterladen:

$plugin_file = plugin_basename( __FILE__ );

Wenn Sie ein bestimmtes Plugin von einem anderen Plugin aus anvisieren möchten, wird es etwas schwieriger, da Sie sich auf ein bisschen "Rätselraten" verlassen müssen.

Sie können den Plugin-Namen fest codieren, das Plugin in der Liste aller Plugins durchsuchen ( siehe get_plugins () ) und die Plugin-Datei von dort abrufen .

Wenn Sie eine Klasse oder Funktion kennen, die von diesem Plugin definiert wird, können Sie Reflection verwenden (siehe diese Antwort für Klassen und diese für Funktionen).


Ich hoffe, dies hilft Ihnen und anderen, die Schwierigkeiten haben könnten, mit "Plugin-Slugs" umzugehen. Es hätte mir ein paar Stunden ersparen können :)

Vlad Olaru
quelle
0

Nur um das seit dem ursprünglichen Beitrag zu verdeutlichen.

Ich habe den Plugin-Slug gefunden, indem ich zuerst zu Ihrem Plugin-Ordner navigiert, dann den mit dem Plugin verknüpften Ordner geöffnet und schließlich die Datei gefunden habe, die den folgenden Code enthält. Sobald Sie diese Datei gefunden haben, sollte der Dateiname abzüglich der Erweiterung Ihr Plugin-Slug sein.

Wenn ich zum Beispiel den folgenden Code in einer Datei mit dem Namen advanced-plugin-awesomeness.php gefunden habe, wäre mein Slug advanced-plugin-awesomeness.

Hoffe das hilft!

/*
Plugin Name: Name of plugin here
Version: 2.4.6
Description: plugin description here
Author: plugin author here
Hackbraten4
quelle
-1 wie die meisten Dateinamen und Verzeichnisse übereinstimmen, ist dies keine zuverlässige Methode, da der Update-Slug tatsächlich das Verzeichnis ist - nicht der Dateiname (es sei denn, es gibt kein Verzeichnis.)
Majick
oder nicht einmal das Verzeichnis! siehe meine aktualisierte Antwort, es kommt tatsächlich vom Plugin-Namen.
Majick
0

Leider wird der Slug über die Update-API zurückgegeben. Die Antwort auf diese Frage ist nur dann so offensichtlich, wenn Sie die API selbst abfragen. Wenn Sie jedoch eine Liste Ihrer aktuellen Plugin-Slugs und zugehöriger Plugin-Daten anzeigen möchten, können Sie einfach Folgendes tun:

print_r(get_site_transient('update_plugins'));

Da dies jedoch für weitere 12 Stunden keine Informationen zu einem neu installierten Plugin enthält, müssten Sie für diese etwas anderes tun, z. Verwenden Sie eine modifizierte Version des Codes von wp_update_pluginsin wp-includes/update.php...

Nachdem dies getan wurde, um es zu testen, scheint es zu bestätigen, dass es unabhängig vom Dateinamen oder Speicherort oder Großbuchstaben des Plugins tatsächlich Plugin Namederjenige ist , der den Update-Slug generiert, höchstwahrscheinlich über sanitize_title. Daher glaube ich, dass die richtige Antwort lauten sollte:

// 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']);
Majick
quelle
+1 und eine zusätzliche Anmerkung ist, dass sich dies genauso gut mit der Zeit ändern könnte, wie es vom wordpress.org-Team explizit gemacht wurde, dass die Slug-Berechnungsmethode noch nicht vollständig endgültig ist
Mark Kaplun
Ich bin nicht sicher, ob dies korrekt ist. Ich habe versucht, dies für ein Plugin zu tun, aber dies schlägt fehl: Der zurückgegebene Plugin-Name lautet "Responsive WordPress Slider - Soliloquy Lite" und der Slug lautet: soliloquy-lite
Chris
Ich vermute, dies liegt daran, dass der Slug zum Zeitpunkt der Übermittlung des Plugins an das Repository generiert wird und sich später nicht mit dem Namen ändert. In den meisten Fällen stimmt er mit dem Verzeichnisnamen überein, aber wenn es Ausnahmen zu beiden gibt, könnte dies der Fall sein sei der eine oder andere. es ist nicht ideal: - /
Majick
0

Sie können den Ordnernamen des Plugins (PHP5.3 +) erhalten, indem Sie DIR an plugin_basename () übergeben, wie folgt:

$plugin_foldername = plugin_basename( __DIR__ );
jb510
quelle
0

Versuche dies:

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;
}
beschäftigt
quelle
1
Bitte bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu, was dieser Code bewirkt.
Nathan Johnson
0

Bei den meisten Plugins entspricht der "Slug" dem Verzeichnisnamen. Obwohl die .org-Leute den Verzeichnisnamen auf alles setzen können, was sie wollen.

$slug = (dirname(plugin_basename(__FILE__)));
John Dee
quelle