Aktivujte php. Použití knihovny aktivace pluginů TGM ve vašich motivech WordPress

Dnes se podíváme na zneužití kritické 1denní zranitelnosti v populárním CMS Joomla, která se koncem října prohnala internetem. Budeme mluvit o zranitelnostech s čísly CVE-2016-8869, CVE-2016-8870 a CVE-2016-9081... Všechny tři pocházejí z jednoho kusu kódu, který se v útrobách frameworku potýkal dlouhých pět let a čekal na svou hodinu, aby se osvobodil a přinesl s sebou chaos, hacknuté stránky a slzy nevinných uživatelů této Joomly. Jen ti nejstatečnější a nejodvážnější vývojáři, jejichž oči jsou červené od světla monitorů a klávesnice poseté drobky chleba, dokázali vyzvat zuřící zlé duchy a položit hlavu na oltář oprav.

VAROVÁNÍ

Veškeré informace jsou poskytovány pouze pro informační účely. Redakční rada ani autor nenesou odpovědnost za případné škody způsobené materiály tohoto článku.

Jak to vše začalo

6. října 2016 vytvořil Demis Palma téma na Stack Exchange, ve kterém se zeptal: proč vlastně v Joomle verze 3.6 existují dvě metody pro registraci uživatelů se stejným jmenným registrem ()? První je v UsersControllerRegistration a druhý je v UsersControllerUser. Damis chtěl vědět, jestli se někde používá metoda UsersControllerUser :: register (), nebo jestli je to jen evoluční anachronismus, který zbyl ze staré logiky. Obával se toho, že i když tuto metodu nepoužívá žádný pohled, stále ji lze vyvolat s vygenerovaným požadavkem. Na což jsem dostal odpověď od vývojáře pod přezdívkou itoctopus, který potvrdil, že problém skutečně existuje. A poslal zprávu vývojářům Joomla.

Další události se vyvíjely nejrychlejším způsobem. 18. října vývojáři Joomly přijímají zprávu od Damise, který do té doby načrtl PoC, aby umožnil registraci uživatele. Na svých webových stránkách zveřejnil poznámku, kde nastínil problém, který našel, a své myšlenky na tuto záležitost. Ve stejný den je vydána nová verze Joomla 3.6.3, která stále obsahuje zranitelný kód.

Poté Davide Tampellini odstraní chybu do stavu registrace nikoli jednoduchého uživatele, ale správce. A již 21. října dorazí do bezpečnostního týmu Joomla nový případ. Už se mluví o eskalaci privilegií. Ve stejný den se na stránkách Joomla objevuje oznámení, že v úterý 25. října vyjde další verze se sériovým číslem 3.6.3, která opravuje kritickou zranitelnost v jádru systému.

25. října tým Joomla Security Strike Team najde poslední problém, který je vytvořen kouskem kódu, který objevil Damis. Poté je do hlavní větve oficiálního úložiště Joomla podstrčen commit z 21. října s nenápadným názvem Prepare 3.6.4 Stable Release, který nešťastnou chybu opravuje.

Po tomto come-outu jsou četní zainteresovaní jednotlivci připojeni k setkání vývojářů - začnou odhalovat zranitelnost a připravovat exploity.

27. října výzkumník Harry Roberts nahraje do repozitáře Xiphos Research hotový exploit, který dokáže nahrát soubor PHP na server se zranitelným CMS.

Podrobnosti

S pozadím jsme hotovi, přejděme k nejzajímavější části – analýze zranitelnosti. Jako testovací verzi jsem nainstaloval Joomla 3.6.3, takže všechna čísla řádků budou relevantní pro tuto konkrétní verzi. A všechny cesty k souborům, které vidíte níže, budou uvedeny vzhledem ke kořenovému adresáři nainstalovaného CMS.

Díky nálezu Damise Palmy víme, že existují dvě metody, které provádějí registraci uživatele do systému. První z nich používá CMS a nachází se v souboru /components/com_users/controllers/registration.php:108. Druhý (ten, který potřebujeme zavolat) žije v /components/com_users/controllers/user.php:293. Pojďme se na to podívat blíže.

286: / ** 287: * Způsob registrace uživatele. 288: * 289: * @return boolean 290: * 291: * @od 1.6 292: * / 293: registr veřejných funkcí () 294: (295: JSession :: checkToken ("post") nebo jexit (JText :: _ ("JINVALID_TOKEN")); ... 300: // Získání dat formuláře. 301: $ data = $ this-> input-> post-> get ("user", array (), "array");. .. 315: $ return = $ model-> validate ($ form, $ data); 316: 317: // Kontrola chyb. 318: if ($ return === false) 319: (... 345: / / Dokončete registraci.346: $ return = $ model-> register ($ data);

Zde jsem nechal jen zajímavé řádky. Plnou verzi zranitelné metody si můžete prohlédnout v úložišti Joomla.

Pojďme zjistit, co se děje při běžné registraci uživatele: jaké údaje jsou odesílány a jak jsou zpracovávány. Pokud je v nastavení povolena registrace uživatele, pak formulář najdete na http: //joomla.local/index.php/component/users/? Zobrazit = registrace.


Legitimní žádost o registraci uživatele vypadá jako na následujícím snímku obrazovky.


Komponenta com_users je zodpovědná za práci s uživateli. Věnujte pozornost parametru úlohy v požadavku. Je ve formátu $ controller.$ Method. Pojďme se podívat na strukturu souborů.

Názvy skriptů ve složce ovladače odpovídají názvům volaných ovladačů. Protože náš požadavek nyní obsahuje $ controller = "registrace", bude soubor volán registrace.php a jeho metoda registru ().

Pozor, otázka: jak předat zpracování registrace zranitelnosti v kódu? Asi už tušíte. Názvy zranitelných a skutečných metod jsou stejné (registrovat), takže stačí změnit název volaného řadiče. Kde se nachází zranitelný ovladač? Přesně tak, v souboru user.php... Ukázalo se, že $ controller = "uživatel". Dát to všechno dohromady a získat task = user.register. Nyní je žádost o registraci zpracována metodou, kterou potřebujeme.


Druhá věc, kterou musíme udělat, je odeslat data ve správném formátu. Všechno je zde jednoduché. Legitimní registr () od nás očekává pole s názvem jform, ve kterém předáme údaje pro registraci - jméno, login, heslo, mail (viz screenshot s požadavkem).

  • /components/com_users/controllers/registration.php: 124: // Získejte uživatelská data. 125: $ requestData = $ this-> input-> post-> get ("jform", array (), "array");

Naše oddělení získává tato data z pole s názvem uživatel.

  • /components/com_users/controllers/user.php: 301: // Získání dat formuláře. 302: $ data = $ this-> input-> post-> get ("user", array (), "array");

Změníme proto názvy všech parametrů v požadavku z jfrom na user.

Naším třetím krokem je nalezení platného CSRF tokenu, protože bez něj nebude registrace.

  • /components/com_users/controllers/user.php: 296: JSession :: checkToken ("post") nebo jexit (JText :: _ ("JINVALID_TOKEN"));

Vypadá to jako hash MD5 a můžete si to vzít například z autorizačního formuláře na webu /index.php/component/users/?view=login.


Nyní můžete vytvářet uživatele požadovanou metodou. Pokud vše klaplo, pak gratuluji - právě jste zneužili zranitelnost CVE-2016-8870"Chybí kontrola oprávnění k registraci nových uživatelů."

Takto to vypadá v metodě "pracovního" registru () z řadiče UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // Pokud je registrace zakázána - Přesměrování na přihlašovací stránku. 114: if (JComponentHelper :: getParams ("com_users") -> get ("allowUserRegistration") == 0) 115: (116: $ this-> setRedirect (JRoute :: _ ("index.php? Option = com_users & view = login ", false)); 117: 118: return false; 119 :)

A tak ve zranitelných:

  • /components/com_users/controllers/user.php:

Jo, v žádném případě.

Abychom porozuměli druhému, mnohem závažnějšímu problému, odešleme požadavek, který jsme vytvořili, a vystopujme, jak se provádí v různých částech kódu. Zde je blok, který je zodpovědný za ověření dat odeslaných uživatelem v pracovní metodě:

Pokračování je dostupné pouze pro účastníky

Možnost 1. Připojte se ke komunitě „stránky“ a přečtěte si všechny materiály na stránce

Členství v komunitě ve stanoveném období vám otevře přístup ke VŠEM Hackerovým materiálům, zvýší vaši osobní kumulativní slevu a umožní vám nasbírat profesionální skóre Xakep!

Jednorázové odkazy lze použít v různých situacích: k poskytnutí dočasného přístupu k souboru nebo stránce nebo k potvrzení registrace. V tomto tutoriálu vám ukážeme, jak generovat a vkládat jednorázové adresy URL.

vytvoření URL

Předpokládejme, že na našem webu máme systém ověřování uživatelů. Po registraci požádáme uživatele, aby prošel procedurou ověření e-mailu. K vytvoření takových odkazů můžeme použít speciální parametr token. Příklad takového odkazu:

Http: //example.com/activate? Token = ee97780 ...

Bez databáze se zde neobejdeme, pojďme se tedy podívat na tabulku, se kterou budeme pracovat.

CREATE TABLE čekající_uživatelé (token CHAR (40) NOT NULL, uživatelské jméno VARCHAR (45) NOT NULL, tstamp INTEGER UNSIGNED NOT NULL, PRIMÁRNÍ KLÍČ (token));

Do tabulky uložíme 3 pole: token, uživatelské jméno a čas. Pro vygenerování tokenu použijeme funkci sha1 (), která vygeneruje 40znakový řetězec. Pole tstamp bude uchovávat čas vygenerování tokenu, abychom mohli sledovat odkazy, jejichž platnost vypršela.

Existuje mnoho způsobů, jak vygenerovat token, nicméně v tomto tutoriálu použijeme funkce uniqid () a sha1 (). Bez ohledu na to, jak je token generován, ujistěte se, že generované hodnoty jsou odlišné a že pravděpodobnost duplikátů je minimální.

$ token = sha1 (uniqid ($ uživatelské jméno, true));

Funkce uniqid () bere jako parametr řetězec a vydává jedinečný identifikátor založený na předaném argumentu a aktuálním čase. Také jako druhý argument tato funkce přebírá booleovskou hodnotu, která signalizuje uniqid, aby přidal nějaké další znaky, aby se zvýšila pravděpodobnost, že hodnota je jedinečná. Funkce sha1 vezme jedinečný identifikátor a vytvoří hash.

Poté, co tyto dvě funkce fungují, budeme mít jedinečný token, který můžeme použít ke generování url adres. Nyní jej musíme přidat do databáze:

$ dotaz = $ db-> připravit ("INSERT INTO čekajících_uživatelů (uživatelské jméno, token, tstamp) VALUES (?,?,?)"); $ dotaz-> provést (pole ($ uživatelské jméno, $ token, $ _SERVER ["REQUEST_TIME"]));

Abychom věděli, který uživatel má být aktivován, bude v tabulce zaznamenáno i uživatelské jméno. V příkladu více přizpůsobeném pro skutečný web můžete použít ID uživatele.

Nyní, když máme všechny potřebné informace, můžeme vytvořit dočasnou adresu URL:

$ url = "http://example.com/activate.php?token=$token";

$ zpráva =<<

Zkouška

Nyní potřebujeme skript, díky kterému kontrolu provedeme. Vše, co musíme udělat, je porovnat token z adresy URL a token z databáze. Pokud nějaký existuje a jeho životnost nevypršela, pak je vše v pořádku.

// získání tokenu if (isset ($ _ GET ["token"]) && preg_match ("/ ^ (40) $ / i", $ _GET ["token"])) ($ token = $ _GET ["token "] ;) else (hoďte novou výjimku ("token není platný.");) // zkontrolujte token $ dotaz = $ db-> připravit ("SELECT uživatelské jméno, tstamp FROM čekající_uživatelé WHERE token =?"); $ dotaz-> vykonat (pole ($ token)); $ řádek = $ dotaz-> načíst (PDO :: FETCH_ASSOC); $ dotaz-> closeCursor (); if (řádek $) (extrahovat (řádek $);) else (vyhodit novou výjimku ("token není platný.");) // aktivovat uživatelský účet // ... // odebrat token z databáze $ dotaz = $ db- > připravit ("DELETE FROM pending_users WHERE username =? AND token =? AND tstamp =?",); $ dotaz-> spustit (pole ($ uživatelské jméno, $ token, $ tstamp));

Musíme také zajistit ověření tokenů, jejichž životnost vypršela:

// 1 den v sekundách = 60 sekund * 60 minut * 24 hodin $ delta = 86400; // zkontrolujte, zda ($ _SERVER ["REQUEST_TIME"] - $ tstamp> $ delta) (vyhoďte novou výjimku ("platnost tokenu vypršela.");) // aktivujte uživatelský účet // ...

Budeme mít tedy dvě kontroly: jednu na platnost tokenu a druhou na dobu jeho existence.

Výsledek

Tuto metodu lze použít nejen k aktivaci uživatelských účtů, ale také pro jiné potřeby: například poskytnout jednorázový nebo dočasný přístup k nějakému zdroji nebo službě.

K tomu všemu můžete vytvořit skript, který odstraní tokeny, které jste nikdy nepoužili. Tento skript můžete čas od času spustit sami, nebo k tomu můžete použít cron.

Místo standardního wp-signup.php vytváříme vlastní registrační stránku pro multisite.

V typické instalaci WordPressu se na stránce registrace (přihlášení, resetování hesla) zobrazí soubor wp-login.php.

  • /wp-login.php - autorizace
  • /wp-login.php?action=register - registrace
  • /wp-login.php?action=lostpassword - reset hesla

V wp-login.php jsou samostatné podmínky pro multisite. Takže když kliknete na odkaz /wp-login.php?action=register na multisite, WordPress se přesměruje na stránku /wp-signup.php. V mnoha tématech stránka nevypadá moc atraktivně, takže si uděláme vlastní.

Hlavní stránka sítě

Ve výchozím nastavení WordPress otevře registrační stránku (wp-signup.php) na hlavní doméně (stránce) sítě. Můžete však vytvořit samostatnou registrační stránku pro každý web v síti, i když mají různá témata. Budeme uvažovat případ, kdy všechny stránky v síti mají svou vlastní registrační stránku, ale používá se stejné téma a stránky se liší pouze jazykem. Pokud používáte různá témata, budete muset napsat více kódu.

funkce.php?

Ne. Zdá se, že název tohoto souboru je uveden v každém článku WordPress. V našem případě, vzhledem k tomu, že funkce registrace je navržena pro několik stránek, má smysl ji přesunout do zásuvných modulů MU, které se načítají při otevření libovolné stránky.

Lyrická odbočka

Stojí za zmínku, že pluginy MU se načítají dříve než běžné pluginy a dříve, než se plně načte jádro WordPressu, takže volání některých funkcí může vést k fatálním chybám v PHP. Toto "brzké" načítání má také své výhody. Například uvnitř žádného motivu nemůžete lpět na některých akcích, které jsou spuštěny ještě před načtením souboru functions.php z motivu. Příkladem toho jsou akce z pluginu Jetpack ve tvaru jetpack_module_loaded_related-posts (related-posts - název modulu), pomocí kterých je možné sledovat aktivitu modulů v Jetpacku. Na tuto akci ze souboru motivu nelze „ulpět“, protože akce již byla spuštěna před načtením motivu – pluginy se načítají před motivy. Na obecný obrázek pořadí načítání WordPressu se můžete podívat na stránce Action Reference v kodexu.

Pořadí souborů

Pluginy MU mohou obsahovat libovolný počet souborů a libovolnou strukturu, která vám připadá logická. Držím se něčeho jako je tato hierarchie:

| -mu-plugins | - | -load.php | - | - | -selena-network | - | - | - | -registrace | - | - | - | - | -plugin.php | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | -plugin.php

Všechny potřebné "pluginy" pro naši síť jsou připojeny v souboru load.php:

// Načtení Traslates pro všechny doplňky load_muplugin_textdomain ("selena_network", "/ selena-network / languages ​​​​/"); // Registrace sítě vyžaduje WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // Jiné pluginy // vyžadují WPMU_PLUGIN_DIR ...

Složky pluginů jsou uloženy ve složce selena-network, každá má svůj plugin.php, který zahrneme do load.php. To vám dává flexibilitu a možnost rychle věci vypnout a zapnout.

Adresa registrační stránky

K zadání adresy registrační stránky se používá filtr wp_signup_location. Lze jej nalézt v souboru wp-login.php a je zodpovědný za přesměrování na wp-signup.php.

Případ "register": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); exit;

Přidejme naši funkci do mu-plugins / selena-network / signup / plugin.php, která vrátí adresu registrační stránky na aktuálním webu:

Funkce selena_network_signup_page ($ url) (return home_url (). "/ Signup /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99);

selena_network je předpona, kterou používám v názvech všech funkcí v zásuvných modulech MU na mém webu, abych se vyhnula kolizím, měla by být nahrazena mým vlastním jedinečným předponou. Filtr má prioritu 99, protože některé pluginy jako bbPress a BuddyPress mohou tuto URL přepsat vlastní (MU pluginy se načítají dříve než běžné pluginy, viz výše). Všimněte si, že home_url () se používá místo network_site_url () k udržení návštěvníka ve stejné doméně. Jako adresu lze použít jakoukoli adresu URL.

Vytvořit stránku

Nyní vytvoříme stránku s adresou site.com/signup/ prostřednictvím běžného rozhraní a ve složce podřízeného motivu je šablona pro naši novou stránku page-signup.php. Místo slova „registrace“ lze použít jedinečné ID.

Uvnitř nové šablony je potřeba zavolat funkci selena_network_signup_main (), která zobrazí registrační formulář.

Je třeba poznamenat, že celý proces se šablonami není vyžadován a místo toho si můžete vytvořit svůj vlastní krátký kód, který bude také volat funkci selena_network_signup_main ().

wp-signup.php a wp-activate.php

Nyní začněme vytvářet funkci, která zobrazí registrační formulář. Chcete-li to provést, zkopírujte soubory wp-signup.php a wp-activate.php z kořenového adresáře WordPress do mu-plugings / selena-network / signup / (a ​​nezapomeňte je připojit uvnitř mu-plugins / selena-network / registrace / plugin.php) ... Další manipulace se soubory jsou extrémně obtížné a časově náročné na popis, takže je budete muset udělat sami. Jen popíšu, co přesně je potřeba udělat, a zveřejním zdrojové soubory mého projektu:

  1. Na začátku souboru odstraňte všechny požadované funkce, volání funkcí a další kód mimo funkce.
  2. Přejmenujte všechny funkce přidáním jedinečných předpon k názvům.
  3. Zabalte spodní část kódu wp-signup.php do funkce selena_network_signup_main a hned na začátek napište globální $ active_signup; ...
  4. Vyměňte rozvržení za vlastní na správných místech.

Uvnitř wp-activate.php musíte udělat přibližně totéž:

  1. Odstraňte veškerý kód mimo funkce, zabalte rozložení do samostatné funkce.
  2. V případě potřeby změňte rozvržení.

Soubor wp-activate.php je zodpovědný za stránku aktivace účtu. Stejně jako u registrační stránky je pro ni potřeba vytvořit samostatnou šablonu, uvnitř které zavoláte funkci ze souboru wp-activate.php.

Zasíláme aktivační dopisy

Registrační stránka zašle návštěvníkovi e-mail s odkazem na aktivaci účtu. Standardně to dělá funkce wpmu_signup_user_notification () ze souboru ms-functions.php. Jeho funkčnost si můžete zapůjčit pro svou funkci. Důvodem, proč přestat používat tuto funkci, je to, že odesílá odkaz na aktivaci účtu z wp-activate.php. Tuto funkci můžete „zakázat“ pomocí filtru wpmu_signup_user_notification a uvést na ni false (pokud to neuděláte, aktivační dopis bude zaslán dvakrát, dobře, ve skutečnosti dvě různá písmena).

Funkce armyofselenagomez_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta = array ()) (// ... // Kód z funkce wpmu_signup_user_notification () wp_mail ($ user_email, wp_specialchars_decode ($ message_headers), $ message), $ ; return false;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

Výsledkem je, že registrační stránka v tématu Selena vypadá mnohem čistěji a přesněji.

Závěr

Existuje mnoho dalších nepříliš správných způsobů, jak totéž udělat na internetu - přesměrování Apache, formuláře AJAX, které nebudou fungovat bez Java Scriptu atd. vlastní web.

Všimněte si, že byste měli soubory upravovat opatrně a snažit se příliš neodchýlit od originálu, takže v budoucnu, pokud WordPress změní soubory wp-signup.php a wp-activate.php, bude snazší je porovnat a najít Změny.

Nezapomeňte se podívat do zdrojového kódu všech výše popsaných funkcí, abyste plně pochopili, co a jak se uvnitř kódu děje.

bonus. Ochrana proti spammerům

Dokonce i ty nejmenší weby WordPress podléhají častým registracím spamu. Pro filtrování botů se dají psát nekonečné podmínky, často spíš pokusy o vytvoření umělé inteligence 🙂 V případě multisite mi hodně pomohlo obvyklé přesměrování v Apache, se kterým při otevření /wp-signup.php a /wp- acitvate.php, požádal jsem o 404 (nejsem odborník na konfiguraci Apache, takže moje pravidla nemusí být příliš správná).

RewriteEngine On RewriteBase / RewriteRule ^ wp-signup \ .php - RewriteRule ^ wp-activate \ .php - # ZAČÁTEK WordPress # Ve výchozím nastavení se nedotýkejte pravidel WordPressu :) # ... # KONEC WordPress

P. S. Některé věci třetích stran se snažím popsat co nejpodrobněji, protože když jsem začínal, občas nebyl nikdo, kdo by spoustu věcí popohnal a vysvětlil. Věřím také, že takové drobné tipy na další materiály někoho popostrčí k tomu, aby se naučil něco nového a rozšíří si pole znalostí. Regulární výrazy se používají v položkách RewriteRule, nejsou nijak složité, například znak ^ znamená začátek řádku.

Motivy obvykle nejsou funkční, ale někdy potřebujeme my, vývojáři, implementovat některé funkce do našeho motivu, aby bylo o něco lepší a uživatelsky přívětivější.

V tomto tutoriálu prozkoumáme pojem území zásuvných modulů a také se naučíme, jak používat fantastický nástroj napsaný Thomasem Griffinem: knihovnu aktivace zásuvných modulů TGM.

Funkčnost tématu: invaze na území pluginu

Témata jsou určena ke změně designu webu WordPress. V ideálním případě by se téma mělo dotýkat pouze vizuální stránky. V našem zlatém věku WordPressu však vývojáři pluginů často zahrnují funkce do svých témat, aby zůstali konkurenceschopní na trhu.

Toto je invaze na území pluginu. Můžeme si představit „teritorium pluginů“ jako nějaký funkční kus kódu. Jakýkoli kód, který mění funkcionalitu vašeho webu, by měl být poskytnut jako plugin, pokud není specifikovaný kód vložen do jádra WordPress.

Již dříve jsem v jednom ze svých článků formuloval základní pravidlo pro „území pluginů:

Pokud funkce souvisí s vizuální prezentací webu, měla by být zahrnuta do tématu; pokud souvisí s funkčností, měl by být prezentován jako samostatný plugin.

Poměrně jednoduché pravidlo. Lidé se stále snaží kódovat funkční úryvky do svých motivů, ale adresáře témat (jako WordPress.org nebo ThemeForest) nepřijímají motivy, které napadají území pluginů. Nabídka funkcí v tématech se tedy stala jednoznačnou výzvou.

Naštěstí existuje jednoduché řešení, které není v rozporu s pravidlem území pluginu.

Úvod do aktivační knihovny zásuvných modulů TGM

Konfigurace aktivace pluginu TGM

Všimněte si funkce tgmpa () se dvěma parametry na samém konci kódu. Druhým parametrem je proměnná $ config, což je také pole jako $ plugins. Jak název napovídá, pomocí tohoto pole můžete upravit knihovnu aktivace zásuvných modulů TGM. Proměnná také přijímá vlastní sadu možností:

  • id (řetězec) – jedinečné ID pro knihovnu aktivace zásuvných modulů TGM ve vašem motivu. To je velmi důležité: pokud i jiné pluginy používají aktivaci pluginu TGM, různá ID zabrání možným konfliktům.
  • default_path (string) – Výchozí absolutní cesta pro pluginy ve vašem motivu. Při instalaci můžete název souboru zip použít jako hodnotu parametru zdroje pro váš plugin.
  • menu (řetězec) - zásuvka nabídky pro stránku instalace pluginu.
  • has_notices (boolean) – pokud je nastaveno na hodnotu true, budou pro požadované / doporučené pluginy vydána upozornění správce.
  • dismissible (boolean) – pokud je nastaveno na true, uživatel může „zamítnout“ upozornění.
  • dismiss_msg (řetězec) - pokud je možnost dismissible nastavena na false, tato zpráva se zobrazí nad upozorněním správce.
  • is_automatic (boolean) – pokud je nastaveno na true, pluginy se aktivují poté, co uživatel souhlasí s jejich instalací.
  • zpráva (řetězec) - další HTML zobrazené před tabulkou pluginu.
  • strings (array) - pole, které obsahuje zprávy, které se mají zobrazit. Můžete je definovat jako přeložitelné řetězce. Podívejte se na soubor example.php, kde najdete úplný seznam všech příspěvků.
"mytheme-tgmpa", // vaše jedinečné ID TGMPA "default_path" => get_stylesheet_directory (). "/ lib / plugins /", // výchozí absolutní cesta "menu" => "mytheme-install-required-plugins", // slug menu "has_notices" => true, // Zobrazit upozornění správce "dismissable" => false , // upozornění NENÍ možné zavřít "dismiss_msg" => "Opravdu, opravdu potřebuji, abyste si nainstalovali tyto pluginy, dobře?", // tato zpráva se zobrazí v horní části nag "is_automatic" => true, // automaticky aktivovat pluginy po instalaci "zpráva" => "", // zpráva na výstup přímo před tabulkou pluginů" strings "=> pole (); // Pole řetězců zpráv, které používá TGM Plugin Activation);?>

Závěr

Jak vidíte, je možné nabídnout funkčnost v tématech WordPress - musíte nejprve myslet na uživatele, kteří by mohli přecházet z jednoho tématu na druhé. Knihovna TGM Plugin Activation nabízí opravdu chytrý způsob, jak toho dosáhnout.

Co si myslíte o tomto nástroji? Už jste ji někdy použili, plánujete ji použít v budoucnu? Sdílej svoje myšlenky!