Cum pot găsi slug-ul plugin-urilor?

25 oct. 2013, 01:19:01
Vizualizări: 25.6K
Voturi: 18

Mă întreb cum pot găsi slug-ul plugin-urilor (slug = numele intern folosit de WordPress pentru actualizări și pentru a determina care plugin-uri sunt active în prezent)? De obicei este numele directorului plugin-ului, dar dacă un plugin nu are director, este numele fișierului său (precum hello.php). Există și alte excepții?

  1. Contează caracterele cu majuscule și minuscule?
  2. Poate un plugin să aibă un slug diferit față de numele directorului său? Ce se întâmplă dacă există un plugin numit hello.php și un altul /hello.php/hello.php?
2
Comentarii

Foarte bună întrebare, păcat că nu putem acorda recompense pentru întrebări, dar presupun că răspunsul este recompensa ;)

brasofilo brasofilo
25 oct. 2013 03:00:33

TL;DR pentru a obține slug-ul pentru plugin-urile oficiale WP, vizitează plugins.svn.wordpress.org și încearcă numele directorului listat. Testează-l cu WP CLI pentru a fi sigur. Altfel, citește răspunsurile de mai jos.

vhs vhs
3 ian. 2021 06:04:06
Toate răspunsurile la întrebare 9
0
13

Diferența dintre fișierul principal al pluginului (main) și slug-ul pluginului este un loc unde WordPress Codex ar putea face mult mai bine. Înțeleg confuzia ta, deoarece am simțit-o și eu recent (amestecată cu frustrare).

Iată ce am învățat făcând niște "muncă de detectiv" pe codul de bază al WordPress.

Fișierul pluginului

Acesta este modul unic prin care WordPress identifică și înregistrează un plugin. Este format din directorul pluginului ȘI fișierul principal al pluginului (cel care conține antetul cu diverse detalii precum versiunea, autorul etc.).

Ar arăta cam așa: directorul-tau-plugin/fisierul-principal.php

Dacă te uiți la datele pluginurilor active (returnate de get_option( 'active_plugins' )), vei vedea că WordPress are nevoie doar de acest fișier de plugin pentru a identifica corect pluginurile.

Poți să te gândești la el ca la calea relativă a fișierului principal al pluginului tău (relativ la directorul wp-content/plugins/). Poți "construi" calea absolută a fișierului principal al pluginului cu ceva de genul: trailingslashit( WP_PLUGIN_DIR ) . $plugin_main_file

Nucleul WordPress generează fișierul pluginului astfel:

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

Slug-ul pluginului

Te-ai aștepta ca "slug-ul" pluginului să fie un fel de ID standardizat pentru plugin, așa cum slug-ul postării este pentru postări - astfel încât să poți folosi acest "slug" pentru a-l furniza funcțiilor de bază ale WordPress și să obții rezultate.

Nu chiar. După ce am căutat în nucleu referințe la slug-urile pluginurilor (sau temelor) și am găsit aproape nimic, cred că am înțeles.

Singurele slug-uri reale sunt cele pentru lucruri accesibile printr-un URL unic: postări, pagini, taxonomii etc. Acesta este scopul principal al luării numelui unui lucru (cum ar fi titlul unei postări) și generării unei versiuni prietenoase pentru URL: să-l folosești într-un URL.

Dar unde folosim "slug-uri" de teme/pluginuri în URL-uri?

Nu facem asta pe instalările individuale WordPress - nici în administrarea WP, nici pe frontend.

Cu toate acestea, există un loc foarte legat de codul WordPress, site-ul WordPress.org. Oamenii au dificultăți în a distinge între cele două, inclusiv faptul că a devenit cumva comun între dezvoltatori să considere că slug-urile de teme sau pluginuri de pe WordPress.org ar trebui să funcționeze la fel ca un slug de postare sau pagină.

Acestea servesc același scop, dar pe site-uri separate. Pe WordPress.org sunt folosite pentru a identifica unic o temă față de altele și un plugin față de restul (în URL-uri precum https://wordpress.org/plugins/akismet/).

Dar când vine vorba de instalări individuale WordPress, aceeași unicitate nu poate fi garantată deoarece nu există o autoritate care să o impună (ca pe WordPress.org). Ar putea funcționa dacă toate pluginurile și temele ar veni de pe WordPress.org, dar din fericire nu este cazul.

Ce face codul WordPress cu slug-urile de teme/pluginuri?

Codul de bază WordPress nu se bazează pe slug-urile de teme/pluginuri pentru a face lucruri precum instalarea, activarea, actualizarea sau ștergerea temelor sau pluginurilor.

Pentru teme, se bazează pe directorul temei, deoarece punctul principal de intrare într-o temă este fișierul style.css (nu poți folosi un alt fișier CSS pentru a conține antetul cu detalii despre temă).

Pentru pluginuri, se bazează pe directorul pluginului ȘI fișierul principal al pluginului, deoarece pluginurile pot denumi fișierul principal cum doresc.

Singurul lucru pentru care nucleul folosește slug-urile de teme/pluginuri este când gestionează teme și pluginuri din directorul WordPress.org: preluarea listelor de pluginuri, verificarea actualizărilor, raportarea datelor de utilizare către director și așa mai departe.


Pentru a rezuma despre slug-urile pluginurilor: ori de câte ori găsești date despre un plugin cu intrarea slug, 99% din cazuri se va referi la slug-ul WordPress.org al pluginului.

Cum identificăm pluginurile?

Dacă vrei să activezi, actualizezi, dezactivezi sau să ștergi un anumit plugin programatic pe o instalare WordPress, trebuie să folosești fișierul pluginului. Îl poți obține astfel din fișierul principal al pluginului tău:

$plugin_file = plugin_basename( __FILE__ );

Dacă vrei să țintești un anumit plugin dintr-un alt plugin, lucrurile devin puțin mai complicate, deoarece trebuie să te bazezi pe puțină "ghicire".

Ai putea să hardcodezi numele pluginului, să cauți pluginul în lista tuturor pluginurilor (vezi get_plugins()) și să obții fișierul pluginului de acolo.

Dacă știi o clasă sau o funcție definită de acel plugin, ai putea folosi reflexia (vezi acest răspuns pentru clase și acesta pentru funcții).


Sper că acest lucru te ajută și pe alții care ar putea avea probleme cu "slug-urile pluginurilor". Mi-ar fi economisit câteva ore :)

7 ian. 2018 19:25:28
4
10

Șirul folosit în WordPress pentru a identifica pluginul este:

plugin_basename($file);

… unde $file este un fișier cu antetele pluginului.

Deci, dacă ești în pluginul tău, obține slug-ul cu:

$slug = plugin_basename( __FILE__ );
25 oct. 2013 03:47:11
Comentarii

plugin_basename($file); Nu mai este slug-ul din versiunea 3.8.1. Acesta este calea folder/plugin_main_file.php. De exemplu, "slug"-ul plugin-ului Akismet nu este "akismet/akismet.php" ci este "akismet".

Jeff Mattson Jeff Mattson
29 sept. 2015 16:46:13

acesta nu mai este răspunsul corect în niciun caz.

majick majick
7 feb. 2016 09:15:53

@majick corect, pentru WordPress 4.7.4 acesta nu este răspunsul

Marecky Marecky
25 apr. 2017 02:54:31

Un alt mod de a genera slug-ul plugin-ului este prin utilizarea dirname(plugin_basename(__FILE__)).

ilanco ilanco
28 iun. 2017 15:53:38
0

Dacă instalezi WP-CLI atunci poți obține lista de plugin-uri împreună cu slug-ul și versiunea lor din linia de comandă:

> wp plugin list

Știu că probabil nu asta dorești, dacă ai nevoie să găsești slug-ul în cod, dar m-a ajutat în timp ce lucram cu plugin-ul TGM-Plugin-Activation.

Mi se pare dificil să lucrez cu WordPress fără WP-CLI, în general este un instrument foarte util pentru multe sarcini comune legate de WordPress.

18 mai 2017 15:32:48
0

Pentru majoritatea plugin-urilor, "slug-ul" va fi același cu numele directorului. Deși echipa de la .org poate seta numele directorului la orice doresc.

$slug = (dirname(plugin_basename(__FILE__)));
18 feb. 2020 20:50:25
3

Din păcate, slug-ul este returnat prin intermediul API-ului de actualizare, iar răspunsul la această întrebare nu este atât de evident decât dacă interogăm API-ul în sine. Totuși, dacă doriți să vedeți o listă cu slug-urile curente ale plugin-urilor și datele asociate, puteți face pur și simplu:

print_r(get_site_transient('update_plugins'));

Cu toate acestea, acest lucru nu va afișa informații despre un plugin nou instalat pentru încă 12 ore. Pentru acele cazuri, ar trebui să faceți altceva, de exemplu să utilizați o versiune modificată a codului din wp_update_plugins din wp-includes/update.php...

După ce am testat acest lucru, se pare că indiferent de numele fișierului plugin-ului, locația sau folosirea literelor mari, de fapt Plugin Name este cel care generează slug-ul de actualizare, cel mai probabil prin intermediul sanitize_title. Așadar, cred că răspunsul corect ar trebui să fie:

// dacă aveți numele de bază al plugin-ului:
// $pluginfile = WP_PLUGIN_DIR.'/'.$pluginbasename;

// altfel, dacă aveți deja calea absolută:
$plugin = get_plugin_data($pluginfile);
$pluginslug = sanitize_title($plugin['Name']);
7 feb. 2016 09:14:12
Comentarii

+1 și o observație suplimentară este că acest lucru s-ar putea schimba în timp, deoarece echipa wordpress.org a făcut explicit faptul că metodologia de calcul a slug-ului nu este încă complet finalizată

Mark Kaplun Mark Kaplun
15 iul. 2016 08:27:56

Nu sunt sigur că această informație este corectă, am încercat să o aplic pentru un plugin dar nu funcționează: numel plugin-ului returnat este "Responsive WordPress Slider - Soliloquy Lite" iar slug-ul este: soliloquy-lite

Chris Chris
27 iul. 2016 17:29:46

Bănuiesc că acest lucru se întâmplă deoarece slug-ul este generat în momentul în care plugin-ul este trimis în repository și nu se schimbă odată cu numele ulterior... în majoritatea cazurilor se potrivește cu numele directorului, dar dacă există excepții la ambele, ar putea fi unul sau altul. Nu este ideal :-/

majick majick
28 iul. 2016 05:04:18
2

Doar pentru a clarifica postarea originală.

Modul în care am găsit slug-ul plugin-ului este prin navigarea mai întâi în folderul tău de plugin-uri, apoi deschiderea folderului asociat plugin-ului și, în final, găsirea fișierului care conține codul de mai jos. După ce ai găsit acest fișier, numele fișierului fără extensie ar trebui să fie slug-ul tău de plugin.

De exemplu, dacă am găsit codul de mai jos într-un fișier numit advanced-plugin-awesomeness.php, slug-ul meu ar fi advanced-plugin-awesomeness.

Sper că te ajută!

/*
Plugin Name: Numele plugin-ului aici
Version: 2.4.6
Description: descrierea plugin-ului aici  
Author: autorul plugin-ului aici
29 sept. 2015 21:40:48
Comentarii

-1 deoarece, deși majoritatea numelor de fișiere și directoarelor se potrivesc, aceasta nu este o metodă fiabilă, deoarece slug-ul de actualizare este de fapt directorul - nu numele fișierului (cu excepția cazului în care nu există director).

majick majick
7 feb. 2016 07:58:59

sau nici măcar directorul! vezi răspunsul meu actualizat, de fapt vine din Plugin Name.

majick majick
7 feb. 2016 09:15:19
0

Puteți obține numele folderului pluginului (PHP5.3+) prin transmiterea DIR către plugin_basename(), astfel:

$plugin_foldername = plugin_basename( __DIR__ );
5 ian. 2018 02:17:18
0

Folosind get_plugins(), nu ar fi cea mai ușoară metodă de a găsi slug-ul unui plugin utilizând proprietatea TextDomain din tabloul returnat de get_plugins()?

14 feb. 2024 11:56:29
1
-1

Încearcă asta:

function get_slugname(){
    $tmp = array();
    $plugins_all = get_plugins(); // Obține toate plugin-urile instalate
    $plugin_slug = explode('/',dirname(plugin_basename(__FILE__))); // Extrage slug-ul plugin-ului curent
    
    foreach ($plugins_all as $key=>$value) {
        // Compară slug-ul plugin-ului curent cu cele din lista de plugin-uri
        if ($plugin_slug[0] == explode('/',$key)[0]) {
            $tmp = $value;
            $tmp['slug'] = explode('/',$key)[0]; // Adaugă slug-ul în array-ul temporar
            $tmp['file'] = explode('/',$key)[1]; // Adaugă numele fișierului în array-ul temporar
        }
    }
    return $tmp; // Returnează array-ul cu informațiile despre plugin
}
27 feb. 2018 21:08:45
Comentarii

Te rog să editezi răspunsul tău și să adaugi o explicație a ceea ce face acest cod.

Nathan Johnson Nathan Johnson
27 feb. 2018 21:33:57