Računalniki Windows Internet

Frenzy do php action. PHP in obrazci. Slabe točke, povezane s spremenljivko PHP _SELF

"Ne uporabljaj goto stavka"- tako so nam povedali učitelji na akademiji in res, ta operater spremeni kodo v popolno zmešnjavo. Razvijalci php so težavo korenito rešili - v php3 in php4 preprosto ne obstaja. Kaj so jih sprva vodili? Morda so nam vsem želeli vcepiti pravilen slog programiranja? No, lahko rečemo, da jim je kar dobro uspelo - tega smo že vsi vajeni, se pravi, natančneje je reči, da smo povsem izgubili navado tega operaterja, morda je na bolje, saj sem nekoč imel najti logično strukturo, ki bi to najbolj nesrečno popolnoma nadomestila Pojdi do.
Ne vem, kako kdo, toda še posebej pogosto sem imel željo uporabiti goto pri ustvarjanju upravljalnika obrazcev html, ko se od uporabnika na strežnik pošlje veliko podatkov, kar mora skript php preveriti korak za korakom. Ta postopek praviloma poteka v več fazah: tiskanje samega obrazca, preverjanje prejetih podatkov, predhodni prikaz in na primer shranjevanje. Poleg tega se lahko nekatere stopnje ponovijo: če preverjanje podatkov ni uspešno opravljeno, gremo natisniti obrazec, ali če predogled uporabniku ne ustreza, se lahko vrne k vnosu podatkov. Skratka, nekatere kode je mogoče uporabiti večkrat. Prav tako ni zelo priročno uporabljati funkcij v teh pogojih - obstaja veliko vhodnih in izhodnih spremenljivk, funkcija mora izvajati preveč zapletena dejanja, na splošno se izkaže za okorno in berljivost kode močno pade.
In jaz sem prišel do take zasnove.

naredi (

switch ($ action) (

privzeto:

prekiniti;

primer "PRINT_FORM":

Natisnemo glavni obrazec

prekiniti;

primer "CHECK_FORM":

Preverjanje pravilnosti podatkov

prekiniti;

primer "PREVIEW_FORM":

Predogled

prekiniti;

primer "SAVE_FORM":

Shranjujemo podatke

prekiniti;

) while (res);

Tu je glavni operater z več izbirami stikalo zaprti v neskončno zanko do-while- na ta način razvrstimo potrebna dejanja v odseke primer: prelom; in lahko gremo iz enega odseka v drugega v nedogled. V razdelku privzeto: priročno je narediti predhodno razčlenitev podatkov, na primer, če ni vhodnih podatkov, potem $ action = 'PRINT_FORM' natisnemo obrazec, če obstaja npr $ _POST ['oddati'] nato prejete podatke pošljemo v obdelavo $ action = 'CHECK_FORM'... Prenos krmiljenja med stikalnimi bloki se zgodi s spremembo spremenljivke $ action, no, zapustite zanko z odmor 2; ali izhod;
Tako lahko na primer v tiskalni blok glavne oblike varno vnesete odmor 2; ker izhod obrazca predpostavlja konec skripte.
Zasnova je zelo prilagodljiva in berljiva. Obstaja pa ena pomanjkljivost - če so podatki nepravilno obdelani, lahko pridete v neskončno zanko in skript zamrzne - neprijetno je čakati kar 30 sekund.
Določimo omejitev števila operacijskih ciklov do-while, 20 je dovolj z glavo. Zdaj, če smo kaj dodali, bo skript zavil 20 vrtljajev, ustavil in vrgel opozorilo o ustavitvi v sili.
Odpravljanje napak v takšni strukturi je zelo priročno - dovolj je po operaterju swith natisnite spremenljivko $ action in dobili bomo celotno zaporedje izvedbe bloka.

DO (// na začetku vsakega cikla natisnemo ime // izvedenega odseka, zelo priročno za odpravljanje napak echo $ action. ""; SWITCH ($ action) (privzeto: prelom; velika črka "PRINT_FORM": / * natisnite glavni obrazec * / break; velika črka "CHECK_FORM": / * preverite, ali so podatki pravilni * / break; primer "PREVIEW_FORM": / * predogled * / break; primer "SAVE_FORM": / * shranite podatke * / break;) // končno stikalo) WHILE ((($ i ++)< 20) or die("Принудительный останов цикла"));

DO (

// na začetku vsakega cikla natisnemo ime

// izveden razdelek je zelo primeren za odpravljanje napak

echo $ action. "";< / strong >

SWITCH ($ action) (

privzeto:

prekiniti;

primer "PRINT_FORM":

natisnemo glavni obrazec

prekiniti;

Zadnja posodobitev: 1.11.2015

Eden glavnih načinov prenosa podatkov na spletno mesto je obdelava obrazcev. Obrazci predstavljajo posebne elemente oznake HTML, ki vsebujejo različne vhodne elemente - besedilna polja, gumbe itd. S pomočjo podatkov obrazca lahko vnesemo nekaj podatkov in jih pošljemo na strežnik. Strežnik te podatke že obdeluje.

Oblikovanje obrazca je sestavljeno iz naslednjih vidikov:

    Ustvarjanje elementov

    v oznaki HTML

    Temu elementu dodate eno ali več vnosnih polj

    Nastavitev načina prenosa podatkov: GET ali POST

    Nastavitev naslova, na katerega bodo vneseni podatki poslani

Ustvarimo torej novo obliko. V ta namen bomo opredelili novo datoteko form.php, v katero bomo dali naslednjo vsebino:

Vnesite spletno mesto

Vpiši se:

Geslo:



Atribut action = "login.php" elementa obrazca določa, da bo skript obdelal podatke obrazca login.php ki bo pri datoteki form.php v eni mapi. Atribut method = "POST" označuje, da bo metoda POST uporabljena kot metoda prenosa podatkov.

Zdaj pa ustvarimo datoteko login.php ki bo imel naslednjo vsebino:

Vaše geslo: $ password ";?>

Globalna spremenljivka $ _POST se uporablja za pridobivanje podatkov obrazca. Predstavlja asociativno polje podatkov, predloženih z uporabo metode POST. S tipkami lahko dobimo poslane vrednosti. Ključi v tem nizu so vrednosti imenskih atributov vnosnih polj obrazca.

Ker je atribut imena vnosnega polja za prijavo login ( ), potem bo v polju $ _POST vrednost tega polja predstavljala ključ za prijavo: $ _POST ["prijava"]

In ker obstajajo situacije, ko vnosno polje ne bo nastavljeno, na primer, ko greste neposredno na skript: http: // localhost: 8080 / login.php... V tem primeru je priporočljivo pred obdelavo podatkov preveriti razpoložljivost podatkov s funkcijo isset (). Če je spremenljivka nastavljena, bo funkcija isset () vrnila vrednost true.

Zdaj se lahko obrnemo na obrazec:

S klikom na gumb bodo vneseni podatki po metodi POST poslani v skript login.php:

Podatkov obrazca ni treba poslati drugemu skriptu, podatke obrazca lahko obdelate v isti datoteki obrazca. Če želite to narediti, spremenite datoteko form.php na naslednji način:

Vaše geslo: $ password ";)?>

Vnesite spletno mesto

Vpiši se:

Geslo:



Varnost podatkov

Varnost podatkov je v PHP zelo pomembna. Oglejmo si nekaj preprostih mehanizmov, ki lahko izboljšajo varnost našega spletnega mesta.

Najprej pa vzemimo obrazec iz prejšnje teme in vanj poskusimo vnesti nekaj podatkov. Vnesite na primer v polje za prijavo "", v polju za geslo pa besedilo"

geslo

":

Po pošiljanju podatkov na oznako html bo vstavljena koda javascript, ki prikaže polje s sporočilom.

Da bi se izognili takšnim varnostnim težavam, uporabite funkcijo htmlentities ():

Če (isset ($ _ POST ["login"]) && isset ($ _ POST ["password"])) ($ login = htmlentities ($ _ POST ["login"]); $ password = htmlentities ($ _ POST ["geslo"]); echo "Vaša prijava: $ login
Vaše geslo: $ password ";)

Tudi po vnosu html ali javascript kode bodo vse oznake umaknjene in dobili bomo naslednji izhod:

Druga funkcija, funkcija strip_tags (), vam omogoča, da v celoti odstranite oznake html:

Če (isset ($ _ POST ["login"]) && isset ($ _ POST ["password"])) ($ login = strip_tags ($ _ POST ["login"]); $ password = strip_tags ($ _ POST ["geslo"]); echo "Vaša prijava: $ login
Vaše geslo: $ password ";)

Rezultat njegovega dela z istim vhodom bo naslednji izhod.

24,6 tisoč

Nikomur ni skrivnost, da je najpogostejši način interakcije strani html s spletnim mestom obrazec. Obrazec (torej element html, ki ga tvori oznaka obrazca) uporabljajo tudi brezplačne poštne storitve, e-trgovine in številne druge vrste spletnih mest.

Obdelava preprostih obrazcev s PHP je enostavna. Občasno pa je treba obdelati obrazec, ki vsebuje več polj iste vrste, njihovo število pa se lahko spreminja v širokem razponu in njihovo število ni znano vnaprej. PHP za take primere predvideva obdelavo iste vrste polj kot niz vrednosti.


Oglejmo si podrobneje možnosti za različne vrste polj.

Besedilna polja

Besedilna polja v tem članku se nanašajo na elemente, ustvarjene z vhodnimi oznakami s parametrom tipa besedila in oznako besedilnega območja. Najlažje je organizirati obdelavo obrazca, sestavljenega iz več takih polj. Spodnji seznam prikazuje seznam s html oznakami za tak obrazec.






Kot lahko vidite iz seznama, so imena elementov obrazca z vidika PHP elementi matrike. Zato bo skript PHP, ki bo obdelal ta obrazec, obravnaval celoten niz besedilnih polj na tem obrazcu kot eno samo matriko. Na posamezne elemente se lahko sklicujete z indeksom ali jih naštejete s pomočjo seznama in vsakega ukaza, kot v naslednjem primeru.

n ";?>

Stikala

Potrditvena polja v tem članku so elementi, ustvarjeni z vnosnimi oznakami s parametrom tipa, ki je enak potrditvenemu polju. Obrazec za uporabo spremenljivega števila "stikal" je zgrajen na popolnoma enak način. Upoštevajte, da izbira določene vrednosti izbirnega gumba (to je vrednosti lastnosti vrednosti) ni pomembna. Primer je prikazan na spodnjem seznamu:






Vendar se obdelava take oblike razlikuje od obdelave, opisane za besedilna polja. V tem primeru je treba ugotoviti, ali je obiskovalec mesta vklopil to ali ono stikalo. Če je omogočeno, ustrezen element matrike obstaja, če ne, potem ni. Naslednji seznam prikazuje primer skripta PHP, ki natisne omogočena stikala:

Izbirni gumbi

Preden opišete obdelavo radijskih gumbov, se morate spomniti, kako delujejo. Bistvo izbirnih gumbov (elementi, ki jih ustvarijo vhodne oznake z vrednostjo parametra vrste, ki je enaka radiju) je v tem, da uporabnik z izbiro enega gumba samodejno prekliče izbiro drugega gumba iz istega niza. Gumbe je zelo enostavno združiti v niz: vsi gumbi v nizu imajo isto ime.

Toda vrednosti (to so parametri vrednosti) gumbov v nizu so različne. Vrednost izbranega gumba z imenom nabora bo poslana na spletno mesto. Tako kot pri besedilnih poljih in izbirnih gumbih morajo biti imena izbirnih gumbov oblikovana kot imena elementov matrike v PHP. Primer takega obrazca je prikazan na naslednjem seznamu:

// prvi niz gumbov
// drugi niz gumbov
// tretji niz gumbov

Obdelava izbirnih gumbov združuje ideje z uporabo besedilnih polj in izbirnih gumbov pri obdelavi. Če avtor strani html ni nastavil privzete vrednosti in uporabnik ni izbral določenega gumba v nizu izbirnih gumbov, potem ta element ne bo prisoten v matriki (tako kot pri izbirnih gumbih).

Ustvarili smo temelje za prihodnji vtičnik, ki ga bo sistem WordPress prepoznal. Danes se bomo neposredno lotili spreminjanja osnovne funkcionalnosti sistema.

Pri tem nam bo v pomoč sistem kljuk, dejanj in filtrov. Ti trije koncepti so v središču vsakega vtičnika WordPress.

Kljuke

V WordPressu obstajata dve vrsti kljukic:

  • Akcijski kavelj: označuje mesto v kodi, ki izvede določeno dejanje, na primer morate vnesti nekaj podatkov in jih shraniti v bazo podatkov.
  • Kavelj za filter: označuje filter, ki bo spremenil katero koli vrednost (spremenljivko), tako da bo koda v prihodnje uporabljala spremenjeno vrednost.

Dejanja

Delo z dogodki

Splošna logika upravljanja dogodkov v WordPressu je preprosta:

  1. Označite mesto, kjer je treba dejanje izvesti s kljuko za dejanje z zahtevanimi parametri.
  2. Ustvarite funkcijo, ki bo izvajala zahtevana dejanja z uporabo parametrov, ki jih posreduje kljuka.
  3. Registrirajte dogodek, ki se bo izvedel ob sprožitvi kljuke, s posebno prednostjo.
  4. Ko WordPress naloži stran in najde kljuko, bo sistem izvedel vse funkcije, ki so registrirane na tej kljuki.

Za izvedbo prvega koraka sistem nudi funkcijo 'do_action':

Do_action ($ tag, $ arg_1, $ arg_2, ..., $ arg_n);

Sprejema naslednje argumente: $ tag - ime "kljuke", $ arg_1, $ arg_2,…, $ arg_n - parametri, s katerimi bo funkcija poklicana. Argumentov je lahko poljubno ali 0.

Sam sistem ima že veliko definiranih kljuk:

Do_action ("init");

To je zelo preprost primer brez dodatnih argumentov. Podatkovna kljuka se sproži, ko je večina sistema že konfigurirana in je čas, da ustvarite svoje predmete, kategorije, objave itd.

Do_action ("save_post", $ post_id, $ post);

V tem primeru se kljuka sproži, ko je objava shranjena z dvema argumentoma post_id - ID objave in objava - sama objava.

Ustvarjanje kljuk je na voljo vsakemu razvijalcu za ustvarjanje lastnega vtičnika (ali teme). To nam daje močno orodje za upravljanje vedenja sistema.

Do_action ("my_truly_custom_hook");

Ko smo ustvarili kljuko in napisali funkcijo, moramo funkcijo registrirati z "add_action"

Add_action ($ tag, $ function_to_add, $ priority, $ accept_args_number);

Funkcija „add_action“ ima dva zahtevana parametra: $ tag: ime ustrezne kljuke in $ function_to_add: ime funkcije, ki jo je treba poklicati. Druga dva parametra sta neobvezna: $ priority: celoštevilska spremenljivka, ki določa vrstni red izvajanja funkcije (privzeto je 10), $ accept_args_number: število argumentov, ki jih funkcija sprejme (privzeto je 1).

Poglejmo primer, da razumemo celoten proces. Recimo, da želimo dodati malo obvestila na dnu našega spletnega mesta. Za to lahko uporabimo kljuko „wp_footer“, ker je to obvezen del kode, ki ga uporablja vsaka tema.

Funkcija msp_helloworld_footer_notice () (odmev "

Pozdravljeni, jaz sem vaše obvestilo po meri
";) add_action (" wp_footer "," msp_helloworld_footer_notice ");

V tem primeru smo ustvarili funkcijo, ki preprosto prikaže oznake za opozorilo in jo registrirala v 'wp_footer'. Takoj ko tej datoteki vtičnikov dodamo to kodo (glej prejšnjo), bomo na strani videli rezultat:

Opozorilo o vtičnikih WordPress

Delo s filtri (filtri)

Filtri delujejo enako kot dogodki. Toda filtri ne izvajajo samo določenega koda, ampak spreminjajo vrednosti, ki jim jih posreduje kljuka. To pomeni, da ima vsak filter pridruženo vrednost (spremenljivko), na kateri deluje.

Funkcija filtriranja bo prevzela to vrednost in jo spremenila za kasnejšo uporabo. Kljuke za filtriranje se nekoliko razlikujejo od kljuk za ukrepanje.

Apply_filters ($ tag, $ value_to_filter, $ arg_1, $ arg_2, ..., $ arg_n);

Funkcija „apply_filter“ ustvari kljuko za filter z imenom $ tag in zahtevanim parametrom $ value_to_filter (lahko je prazen, vendar ga je treba navesti). Preostali izbirni argumenti delujejo enako kot za dogodke.

Filter_function ($ value_to_filter, $ arg_1, $ arg_2, ..., $ arg_n) (// filter vrne $ value_to_filter; // vrednost je treba vrniti)

To je okostje filtra, ki dokazuje, da mora filter:

  1. vzemite vsaj 1 argument;
  2. vrne spremenjeno vrednost.
add_filter ($ tag, $ function_to_add, $ priority, $ accept_args);

Funkcija 'add_filter' registrira funkcijo z imenom iz $ function_to_add za kljuko $ tag. Preostali argumenti - $ priority in $ accept_args - delujejo enako kot za kljuke dogodkov.

Na primer, običajna naloga vtičnikov je, da na konec objave dodate nekaj. Če podrobneje pogledamo funkcijo ‘the_content’, ki se uporablja za prikaz vsebine objave, najdemo kavelj, kot je ta:

$ content = apply_filters ("vsebina", $ vsebina);

Z njegovo uporabo lahko na koncu objave enostavno dodamo karkoli.

Funkcija msp_helloworld_post_footer ($ content) ($ content. = "

"; return $ content;) add_filter (" the_content "," msp_helloworld_post_footer ", 100);

Upoštevajte, da za prednostno uporabo uporabljamo veliko število, da se prepričamo, da so bili vsi standardni filtri obdelani, preden izvedemo »msp_helloworld_post_footer«. Po vključitvi kode v naš vtičnik bomo videli rezultat:


Kako najti kljuko

Zdaj nam je jasno, da moramo za izvedbo določenih dejanj poznati obstoječe kljuke.

Kodeks WordPress vsebuje sezname kljukic za filtre in dogodke Reference Reference in Filter Reference.

Dodatna dejanja s kljukami

Poleg dodajanja lahko kljukico odstranimo tudi s podobno skladnjo.

Dogodke, kot je ta, lahko izbrišete:

Remove_action ($ tag, $ function_to_remove, $ priority, $ accept_args); remove_all_actions ($ tag, $ priority);

Kot ste morda uganili, 'remove_action' odstrani določen dogodek, registriran za dano kljuko (pravilno morate določiti prednost in število argumentov, kot je bilo določeno med registracijo), 'remove_all_actions' pa pomaga odstraniti vse dogodke, registrirane za hook (če je prioriteta izpuščena, bo funkcija izbrisala vse dogodke).

Filtri se lahko odstranijo na enak način:

Remove_filter ($ tag, $ function_to_remove, $ priority, $ accept_args); remove_all_filters ($ tag, $ priority);

API vtičnika WordPress ponuja tudi funkcije za preverjanje, ali je funkcija registrirana za določeno kljuko:

Has_action ($ tag, $ function_to_check); has_filter ($ tag, $ function_to_check);

Obe funkciji preverita, ali je ta funkcija registrirana za kljuko, in ob uspehu vrneta vrednost true, sicer pa flase. Znotraj funkcije imamo možnost preveriti, ali jo je kljuka poklicala:

Če ("hook_to_check_name" === current_filter ()) ()

Kljub imenu 'current_filter' ne deluje samo s filtri, ampak tudi z dogodki.

Netrivilen primer

Animirajmo "okostje" našega vtičnika, ki smo ga pripravili v zadnji lekciji.

Izpolnimo datoteko ‘core.php’ (glavni del vtičnika, ki vsebuje glavni del funkcij) s kodo, ki reši problem, ki se lahko dejansko pojavi med delom. Za njegovo rešitev bomo uporabili dejanja in filtre.

Naj vaše spletno mesto WordPress sprejema objave različnih avtorjev od gostov, ne dovolite pa ustvarjanja računov. To pomeni, da sta uporabnik, ki je objavil objavo, in njen pravi avtor različna, zato se moramo prepričati, da je avtor naveden v objavi. To lahko storimo s taksonomijo.

Ustvarimo svojo taksonomijo za obravnavo avtorjevega imena in kratke biografije. Avtorjevo ime bomo lahko uporabili tako kot druge izraze taksonomije (na primer oznake) v objavi. Koda:

/ ** registrirajte filtre in dogodke ** / funkcija msp_helloworld_init () (add_action ("init", "msp_helloworld_taxonomies"); add_filter ("the_content", "msp_helloworld_author_block_filter"); add_filter ("post_class", "add_class", plugins_loaded "," msp_helloworld_init "); / ** taksonomija ** / funkcija msp_helloworld_taxonomies () ($ args = array ("labels" => array ("name" => "Avtorji gostov", "singular_name" => "Avtor gosta"), "show_in_nav_menus" => napačno); register_taxonomy ("gauthor", matrika ("objava"), $ args);) / ** oznaka bloka avtorja ** / funkcija msp_helloworld_author_block () (globalna $ pošta; $ author_terms = wp_get_object_terms ($ post-> ID, "gauthor"); if (empty ($ author_terms)) return; $ name = stripslashes ($ author_terms-> name); $ url = esc_url (get_term_link ($ author_terms)); $ desc = wp_filter_post_kses ($ author_terms-> description) ; $ out = "

"; $ out. ="
To je objava gosta avtorja ($ name)
"; $ out. ="
($ desc)
"; return $ out;) / ** dodajanje oznak na konec objave ** / funkcija msp_helloworld_author_block_filter ($ content) (if (is_single ()) $ content. = msp_helloworld_author_block (); return $ content;) / ** dodajte razred CSS v objavo ** / funkcijo msp_helloworld_post_class ($ post_class) (globalno $ post; $ author_terms = wp_get_object_terms ($ post-> ID, "gauthor"); if (! prazno ($ author_terms)) ($ post_class = " gauthor ";) vrni $ post_class;)

Kot lahko vidite, smo ustvarili funkcijo za registracijo lastne taksonomije in jo povezali z kljuko 'init'. Nato smo ustvarili predlogo za prikaz avtorskega bloka s pomočjo funkcije wp_get_object_terms WordPress. Nato smo s filtrom 'the_content' vstavili blok z informacijami o avtorju na koncu objave. Končno smo dodali lasten razred CSS. Rezultat dela:


Ustvari dogodek (kljuka za poljubno funkcijo). Če želite, da se funkcija sproži v času dogodka, jo morate povezati s tem dogodkom s pomočjo funkcije add_action ().

Poleg dogodkov ima WP filtre, načelo delovanja je enako. Edina razlika je v tem, da mora filter vrniti nastalo spremenljivko, tj. filtrira (spreminja) podatke, dogodek pa omogoča izvajanje uporabniško določene funkcije, ko se ta dogodek sproži. Filtre sproži funkcija apply_filters ()

Time 1 -krat = 0,00007s = zelo hitro| 50.000 krat = 0,03 s = hitrost svetlobe

Ni kljukic.

Vračila

Nič ne vrne.

Uporaba

do_action ($ tag, $ arg_a, $ arg_b, ...); oznaka $ (niz) (obvezno) Ime kljuke za ustvarjanje. $ arg_a Vrednost argumenta, ki ga je treba prenesti.
$ arg_b (niz / niz / število / objekt / logično) Pomen še enega argumenta ...
Privzeto: argument ne obstaja$ arg_с (niz / niz / število / objekt / logično) Funkcij je mogoče posredovati neskončno veliko argumentov ...

Primeri

#1. Primer uporabe

To funkcijo lahko uporabite v vtičnikih, temah itd., Ko morate biti vneseni v postopek izvajanja kode, od nekje drugje. V vtičnik smo na primer namestili "kavelj" (do_action), ki se ga bomo "pripeli" iz datoteke functions.php v trenutku, ko se sproži naš "kavelj".

Recimo, da smo v vtičniku uporabili naslednjo kodo:

Zdaj lahko naredimo nekaj dejanj, ko se sproži funkcija do_action, hkrati pa lahko svoje dejanje opišemo na primer iz datoteke functions.php, tako da vanj vstavimo naslednjo kodo:

Funkcija do_my_hook ($ a, $ b) (// če je spremenjena spremenljivka $ a res, // potem na primer izbrišite vnos 10 if ($ a === true) wp_delete_post (10); // in tukaj prikažemo samo spremenljivko echo "
". $ b; // prikaže vrednost druge spremenljivke) // Registrirajte kljuko prek // add_action ($ tag, $ function_to_add, $ priority, $ accept_args); add_action (" my_hook "," do_my_hook ", 10, 2);

Dejanja se od filtrov razlikujejo po tem, da se podatki, ki jih posreduje dejanje, ne vrnejo nazaj v funkcijo in se tam ne uporabljajo v prihodnosti, ampak se le posredujejo za uporabo v funkciji kljuke.

Koda ukrepaj: wp-includes / plugin.php WP 5.2.2

do_action ($ args); array_pop ($ wp_current_filter); )