Mitä ovat WordPress-koukut? Hyödyllisiä vinkkejä WordPress-koukkujen kanssa työskentelemiseen. Johdatus alustuskoukkuihin

Jos olet uusi koukkujen käytössä, tämä artikkeli auttaa sinua. Tässä artikkelissa esitetyt esimerkit on otettu WordPress-ytimestä sekä omasta monivuotisesta kokemuksestani laajennuskehittäjänä.


WordPress-koukut ovat ominaisuus, jonka avulla voit laajentaa lisäosien ja teemojen ominaisuuksia ilman riskiä niiden rikkoutumisesta. Mitä ovat koukut?

"Tee"-koukkua kutsutaan "toiminnaksi". Missä tahansa toiminto on määritetty, voit suorittaa oman koodisi. Tässä on joitain esimerkkejä:

"Muokkaa"-koukkua kutsutaan "suodattimeksi". Suodattimen avulla voit muuttaa tai mukauttaa arvoa ja palauttaa sen uusi muoto. Tässä on joitain esimerkkejä:

  • viestien otsikoiden näyttäminen isoilla kirjaimilla;
  • linkin liittäminen asiaan liittyviin viesteihin pääsisällön alle;
  • tietokannasta haetun parametrin muuttaminen.

Suodattimelle ei vain sijainti ole tärkeä, vaan myös palautetut arvot. WordPressissä on suodatin lähes jokaiselle sen käsittelemälle arvolle.

Koukkumenettelyn elementit

Käytetään koukkua wp_head esimerkkinä toiminnosta ja the_content koukkua esimerkkinä suodattimesta.

koukku (substantiivi)

Koukku itsessään on osoitus siitä, milloin ja missä taika tapahtuu. Kuvittele, että tämä on koukku, jonka kiipeilijä on lyönyt kiven pintaan. Koukulla on tietty asento. Jos muut kiipeilijät haluavat mennä tähän suuntaan, he voivat käyttää sitä.
Toimintakoukkuja kutsutaan do_action-funktiolla:

do_action("wp_head");

Koukut kutsutaan koukulla apply_filters() :

$sisältö=apply_filters("the_content",$content);

Kuten näet, meidän on siepattava tiedot suodattimesta.

Toiminnot ja suodattimet

Seuraava elementti koukkumenettelyssä on toiminto tai suodatin. Tämä on funktio, jonka määrität tekemään tai suodattamaan jotain. Tämä on kiipeilijä, joka on valmis käyttämään mitä tahansa koukkua kiivetäkseen hieman korkeammalle.
Toiminto, joka suoritetaan wp_headissa, on noindex() .

functionnoindex())( // Jos blogi ei ole julkinen, käske robotteja ohittaa. if("0"==get_option("blog_public")) wp_no_robots(); )

Koukku tarkistaa, onko hakukoneen näkyvyysasetus poistettu käytöstä. Jos näin on, wp_no_robots() lisää robots-sisällönkuvauskentän osoittaen hakukoneetälä indeksoi sivustoa.
Esimerkki sisällölle suodattimesta on wpautop() . Se vastaa kappaleiden käärimisestä tunnisteeseen

Ja käyttämällä tagia
rivinvaihtoa varten.

functionwpautop($pissa,$br=true)( // … return$pissa; )

Toisin kuin toiminto, suodatintoiminto vaatii vähintään yhden argumentin. Se on palautettava.

koukku (verbi)

Menettelyssä WordPress koukku sinun on määritettävä, mihin koukku tarkalleen on tarkoitettu. Tämä tarkoittaa, että meidän täytyy sitoa funktio (verbi) koukkuun (substantiivi). Tämä tehdään käyttämällä toimintoa, jota kutsutaan usein väärin "koukkuksi".
Wp_head-koukun ja noindex()-toiminnon yhteydessä yhteys muodostetaan käyttämällä tätä koodiriviä:

add_action("wp_head","noindex",1);

Kolmas parametri on prioriteetti. Katsomme sitä alla.
wpautop() sisällytetään sisältöön_content tällä rivillä:

add_filter("the_content","wpautop");

Nämä ovat koukkumenettelyn perusperiaatteet. Tarkastelemme niitä tarkemmin seuraavissa osioissa.

Käytätkö jo näitä koukkuja?

Vaikka "vain" muuttaisit teemaa tai lisäät koodia functions.php-tiedostoosi, käytät jo toimintoja ja suodattimia.

WP_HEAD

Katsotaanpa Twenty Fifteen -teeman otsikkoosaa, joka löytyy tiedostosta wp-content/themes/twentyfifteen/header.php.

Aloitus- ja sulkemistunnisteen välissä ei ole paljon koodia, mutta katso lähde sivuja selaimessa. Näet siellä erilaisia ​​metaelementtejä, mukaan lukien .
Elementit, joita ei välttämättä ole header.php-tiedostossa, lisätään wp_head()-funktiolla. Jos käytät kehitysympäristöä, tarkista sen sisältö.

/** * Käynnistä wp_head-toiminto * * @alkaen versiosta 1.2.0 */ functionwp_head())( /** * Tuo komentosarja tai data head-tunnisteeseen käyttöliittymän kautta. * * @alkaen 1.5.0 */ do_action("wp_head" ; )

Ainoa asia, mitä wp_head()-funktio tekee, on tulostaa wp_head-koukku. Tämä tarkoittaa, että teema voi käyttää do_action('wp_head') -funktiota wp_head(:n) sijaan.
Ydin on jo käyttänyt tätä koukkua. Tässä on joitain toimintoja, jotka WordPress yhdistää tähän koukkuun oletusarvoisesti:

add_action("wp_head","_wp_render_title_tag",1); add_action("wp_head","wp_enqueue_scripts",1); add_action("wp_head","syötelinkit",2); add_action("wp_head","feed_links_extra",3); add_action("wp_head","rsd_link"); add_action("wp_head","wlwmanifest_link"); add_action("wp_head","adjacent_posts_rel_link_wp_head",10,0); add_action("wp_head","locale_stylesheet"); add_action("wp_head","noindex",1); add_action("wp_head","print_emoji_detection_script",7); add_action("wp_head","wp_print_styles",8); add_action("wp_head","wp_print_head_scripts",9); add_action("wp_head","wp_generator"); add_action("wp_head","rel_canonical"); add_action("wp_head","wp_shortlink_wp_head",10,0); add_action("wp_head","wp_site_icon",99);

Näitä ovat noindex()-toiminto sekä (alkaen WordPress-versiot 4.1) kutsu _wp_render_title_tag(), joka luo otsikkotunniste.

Sisältö

Esimerkki suodatinkoukusta, jota olet käyttänyt tietämättäsi, on the_content .
Se on piilotettu_content()-funktion taakse, jota käytetään viestien tai sivun sisällön näyttämiseen. Se sisältää kutsun the_content hookiin.

functionthe_content($lisälinkin_teksti=null,$strippi_tiisinti=false)( $content=get_the_content($more_link_text,$strip_teaser); // … $content=apply_filters("the_content",$content); $content=str_replace("]> ","]]>",$content); echo$content; )

Oletuksena_content-funktioon on jo liitetty useita suodattimia.

add_filter("the_content","wptexturize"); add_filter("sisältö","muunna_hymiöt"); add_filter("sisältö","muuntaa_merkit"); add_filter("the_content","wpautop"); add_filter("the_content","shortcode_unautop"); add_filter("sisältö","prepend_attachment");

Nämä suodattimet vastaavat muodosta ja rivistä erikoismerkit tekstissä. Laajennukset käyttävät niitä myös laajalti elementtien, kuten kuvakkeiden, liittämiseen sosiaaliset verkostot tai niihin liittyviä merkintöjä.

Oppitunteja sisällön_sisällön käyttämisestä

Tässä on kaksi esimerkkiä siitä, kuinka koukun käyttäminen virheellisesti aiheuttaa toiminnon epäonnistumisen.
Funktion_content() runko sisältää myös kutsun get_the_content() . Olen nähnyt useissa ketjuissa toista käytetyn ensimmäisen sijasta. Mutta tällä tavalla itse koukku poistetaan käytöstä, ja monet toiminnot eivät toimi.
Jos muodostat yhteyden the_content -palveluun, muista, että sitä ei käytetä vain sisältösivuilla vaan myös listaussivuilla. Esimerkiksi arkistossa sekä pääsivulla.

Parametrit koukkumenettelyssä

Tärkeimmät tarvittavat parametrit ovat koukun nimi, funktion nimi, prioriteetti ja sille välitettävät argumentit.
Add_filter-kutsu näyttää tältä:

add_filter($tunniste,$funktio,$prioriteetti,$hyväksytyt_argumentit);

Koukkujen nimet ($tag)

Et voi tehdä mitään koukkujen nimillä, joita käytetään WordPressin ytimessä, laajennuksissa tai teemoissa. Mutta kun asetat omia nimiäsi, sinun on noudatettava useita periaatteita.
Toiminnon nimen on sisällettävä sijainti, ja suodattimen on sisällettävä muutettava sijainti ja arvo.
Esimerkkejä toiminnoista ovat wp_head ja wp_footer, jotka on nimetty sijaintinsa mukaan. Usein käytetään myös etuliitteitä tai jälkiliitteitä. Esimerkiksi: ennen, ennen, alku, jälkeen ja loppu.

Viestin poistamisesta vastaava wp_delete_post()-funktio sisältää seuraavat koukut:

  • ennen_poista_postausta;
  • delete_post;
  • poistettu_viesti;
  • after_delete_post.
Koukun nimen etuliitteet

Sijainnin ja arvon lisäksi sinun on asetettava etuliite koukkuetuliite. Esimerkiksi:

  • wpseo_ Yoast SEO;
  • genesis_ Genesis-kehyksestä;
  • advanced_ads_ Advanced Ads -laajennuksestani.

Tämä estää ristiriidat muiden laajennusten tai teemojen koukkujen kanssa.

Dynaamiset koukkunimet

Oletetaan, että laajennuksella on monia parametreja ja haluat muiden kehittäjien pystyvän käyttämään suodatinta jokaiselle niistä. Tätä varten sinun on kutsuttava apply_filters() jokaiselle parametrille. On myös mahdollista käyttää dynaamista koukun nimeä, kuten WordPress tekee get_options()-funktiollaan.

Tämä toiminto sisältää seuraavat koukut:

  • 'pre_option_' . $optio;
  • 'default_option_' . $optio;
  • 'optio_' . $optio.

Kun tiedät tämän, voit kytkeä vaihtoehdon option_blogname tai option_blogdescription muuttaaksesi blogin otsikkoa tai kuvausta dynaamisesti.

Taika "kaikki"

Kun kutsut add_action() ja add_filter(), voit käyttää erityistä tunnistetta koukun nimenä. Jonka mukaan liittyvää toimintoa käytetään joka koukkuun.

Toimintojen nimet

Kun kutsut yksinkertaista funktiota, lisää etuliite. Tämä estää konflikteja muiden kanssa aputoiminnot jotka tunnistavat hänet.
Foorumeilla näet funktioiden nimet, jotka alkavat kirjaimella my_ . Muuta tämä etuliite omaksesi.

add_filter("sisältö","bestpluginever_capitalize_all_words");

Luokassa on myös mahdollista liittää staattinen funktio:

add_filter("the_content",array("paras liitännäinen","isot_kaikki_sanat"));

Sen kutsu tämän luokan esiintymässä näyttää tältä:

add_filter("the_content",array($bestpluginever,"isot_all_words"));

Voit myös kutsua metodia saman luokan esiintymästä, esimerkiksi:

add_filter("the_content",array($this,"isot_all_words"));

Varmista myös, että toiminnot ovat julkisia.

PHP-oletustoimintojen käyttäminen

SISÄÄN tietyissä tapauksissa ei tarvitse luoda omaa toimintoa. Tämä koukkumenettely kirjoittaa isolla viestin otsikon ensimmäisellä kirjaimella:

functionbestpluginever_capitalize_title($nimi)( returnucwords($otsikko); ) add_filter("nimi","paras lisäosien_kirjain_nimi");

Koska ucwords() on vakiotoiminto PHP, joka ottaa ja palauttaa arvon, voidaan pienentää yhdelle riville:

add_filter("nimi","ucwords");

Prioriteetit

Kolmas parametri parametreissa add_action() ja add_filter() on prioriteetti. Se määrittää järjestyksen, jossa koukkuun liittyvät toiminnot kutsutaan.
Tämä parametri on valinnainen ja oletusarvo on 10, ellei sitä ole erikseen määritetty. Useita toimintoja, joilla on sama prioriteetti, kutsutaan siinä järjestyksessä, jossa ne rekisteröitiin koukkuun.
Advanced Ads -laajennus käyttää the_content lisäyksessä mainoksia ennen sisältöä tai sen jälkeen. Sen kolmas parametri määrittää, lisätäänkö mainos vai muu sisältö ensin. Välttääkseni elementtien "väärää" järjestystä koskevat tukipyynnöt annoin käyttäjille mahdollisuuden valita suodattimen prioriteetin vaihtoehdoksi.

Toiminnon valmistumisen tarkistaminen

Voit tarkistaa, onko tietty toiminto suoritettu, käyttämällä did_action() .
Funktio _wp_render_title_tag on kytketty wp_headiin. Tämä on esimerkki siitä, kuinka WordPress-ydin tarkistaa, että otsikkotunniste todella luodaan vain täällä.

function_wp_render_title_tag())( if(!current_theme_supports("title-tag"))( return; ) // Tämä voi toimia vain sisällä wp_head. if(!did_action("wp_head")&&!doing_action("wp_head"))( return ; ) echo"".wp_title("|",false"oikea")."n";

did_action($hook) palauttaa tiedot siitä, kuinka monta kertaa toiminto suoritettiin, mukaan lukien nykyinen kutsu. Funktio palauttaa arvon 1, jos _wp_render_title_tag() suoritetaan tiedostossa wp_head. do_action('wp_head') tarkistaa, olemmeko tällä hetkellä wp_head-toiminnossa. Itse asiassa yllä oleva koodi on kaksinkertainen tarkistus. Tämän vuoksi se poistetaan WordPress 4.4.0:sta.
Do_action()-funktio tarkistaa, tapahtuuko toiminto todella.

Suodattimen käyttöä tarkistetaan

Did_action()- ja do_action()-suodattimille ei ole aliaksia. Sen sijaan sinun on käytettävä parametria has_filter($hook, $function) . Kun vain $hook on määritetty, palautetaan totta jos jokin toiminto on rekisteröity koukkuun. Väärin muuten.
Jos myös funktio $funktio välitetään, tämän funktion prioriteetti palautetaan tai arvo on epätosi, jos kyseistä funktiota ei ole liitetty koukkuun.
Kun lisäät mainoksia tietyn kappaleen jälkeen, Advanced Ads -laajennuksen on varmistettava, että wpautop() kutsutaan ennen sen käyttöönottoa. mukautettu toiminto suodattaa.

$wpautop_priority=has_filter("the_content","wpautop"); if($wpautop_priority&&$advads_content_injection_priority() 1 ) :

  • echo "\n" ;
  • kaiku"
  • echo get_permalink( $post -> ID );
  • echo "" />\n " ;
  • loppu Jos ;
  • add_action("wp_head" , "canonical_for_comments" ) ;
  • Koodin selitys. Ensin luomme funktion, joka lisää linkkitunnisteen rel="canonical"-attribuutilla jokaiselle kommenttisivulle ensimmäistä lukuun ottamatta. Sitten liitetään tämä funktio Wordpress-funktioon wp_head() .8. VIESTIN TAI SIVUN VASTAANOTTO PHP-MUUTTUJANA Ongelma. Mahdollisuus saada nykyinen postaus tai koko sivu nimellä PHP-muuttuja– tosi siisti juttu. Oletetaan, että voit korvata osan sisällöstä str_replace()-funktiolla tai tehdä sillä jotain muuta. Jälleen, ei mitään monimutkaista. Teemme saman: liitä seuraava koodi tiedostoon Functions.php.
  • funktion takaisinsoitto($puskuri) (
  • // muokkaa puskuria täällä ja palauta sitten päivitetty koodi
  • palauttaa $puskuri ;
  • funktio buffer_start() (
  • ob_start("takaisinsoitto");
  • funktio buffer_end() (
  • ob_end_flush();
  • add_action("wp_head" , "puskurin_aloitus" ) ;
  • add_action("wp_footer" , "puskurin_pää") ;
  • Koodin selitys. Jotta tämä hakkeri toimisi, tarvitaan kolme toimintoa:
    • callback(): Tämä funktio palauttaa koko sivun $puskurimuuttujana. Voit muokata sitä haluamallasi tavalla, esimerkiksi käyttämällä säännöllisiä lausekkeita;
    • buffer_start() : Tämä funktio aloittaa puskuroinnin. Liitämme sen wp_head()-funktioon;
    • buffer_end() : Tämä toiminto tyhjentää puskurin. Liitämme sen wp_footer()-funktioon.
    9. KOUKKUJEN JA CRONIN KÄYTTÄMINEN AIKAISET TAPAHTUMATOngelma. Luultavasti tiedät jo, että Wordpress voi käyttää ajoitettuja tapahtumia. Voit esimerkiksi julkaista viestejä tiettyyn ennalta määrättyyn aikaan. Koukkujen ja wp-cronin avulla voimme helposti ajoittaa meidän oma tapahtuma. Seuraavassa esimerkissä pakotamme blogin lähettämään meille sähköpostin kerran tunnissa. Liitä tiedostoon seuraava koodi Functions.php.
  • if (! wp_next_scheduled("my_task_hook" ) ) (
  • wp_schedule_event( time () , "hourly" , "my_task_hook" ) ;
  • add_action( "oma_tehtävän_koukku" , "tehtäväni_funktio" ) ;
  • funktio my_task_function() (
  • wp_mail(" [sähköposti suojattu]" , "Automaattinen sähköposti" , "Hei, tämä on automaattisesti ajoitettu sähköposti WordPressistä." ) ;
  • Koodin selitys. Ensimmäinen asia, jonka teemme, on tietysti luoda toiminto, joka suorittaa vaaditun toiminnon. Tässä esimerkissä tätä funktiota kutsutaan nimellä my_task_function() ja se yksinkertaisesti lähettää sähköpostin osoitteeseen määritetty sähköpostiosoite osoite.
    Tämän funktion ajoittamiseen käytämme wp_schedule_event()-funktiota. Viimeinen sille välitetty argumentti on koukkumme, joten liitämme funktion my_task_function() funktioon my_task_hook .10. LUETTELO KAIKISTA ”KOUKKUTUISTA” TOIMINTOISTA Ongelma. Kun jokin menee pieleen, luettelo kaikista "koukussa olevista" toiminnoista voi olla erittäin hyödyllinen. Kuten kaikki aiemmat koodinpalat, myös seuraavat on lisättävä tiedostoon Functions.php. Muista vain poistaa se käytön jälkeen. Jos et tee tätä, viestit tulevat näkyviin virheenkorjauksen jälkeen.
  • function list_hooked_functions($tag = false ) (
  • globaali $wp_filter ;
  • jos ($tag) (
  • $koukku [ $tag ] = $wp_filter [ $tag ] ;
  • if (! is_array ($koukku [ $tag ] ) ) (
  • trigger_error ("Mitään ei löytynyt kohteelle "$tag " hook" , E_USER_WARNING ) ;
  • paluu;
  • muu(
  • $koukku = $wp_filter ;
  • ksort($koukku);
  • kaiku "" ;
  • foreach ($hook as $tag => $priority ) (
  • kaiku"
    >>>>>\t $tag
    " ;
  • ksort($priority);
  • foreach ($priority as $priority => $function ) (
  • echo $priority ;
  • foreach ($funktio muodossa $nimi => $ominaisuudet ) echo "\t $nimi
    " ;
  • kaiku "" ;
  • paluu;
  • Kun olet liittänyt tämän koodin tiedostoon Functions.php, kutsu lista_hooked_functions()-funktiota. Se näyttää sinulle luettelon kaikista "koukussa olevista" toiminnoista.

    Koodin selitys. Tämä koodi tarkistaa, välitetäänkö koukun nimi argumenttina funktiolle. Jos se on hyväksytty, koukun nimi näkyy näytöllä. Voit myös tarkastella vain tietyn toiminnon koukkuja:

    Käynnistyy ennen valitun teemamallitiedoston sisällyttämistä, esimerkiksi: single.php , page.php , search.php , 404.php jne. Tätä suodatinta käytetään muuttamaan polkua tällaiseen tiedostoon.

    Suodatin käynnistyy template_redirect-tapahtuman jälkeen ja sen jälkeen, kun WordPress on valinnut mallitiedostona käytettävän tiedoston. Jokaiselle sivutyypille tiedosto on erilainen: katso Teematiedostohierarkia. Esimerkiksi menimme pysyvälle sivulle, WordPress valitsee, mikä mallitiedosto näytetään - tämä on page.php-tiedosto: home/site.ru/wp-content/themes/mytheme/page.php. Tämän suodattimen avulla voit muuttaa tällaisen tiedoston polkua.

    Tämän suodattimen aikana ehdollisia tunnisteita voidaan jo käyttää ja $post-muuttuja on jo määritetty.

    Käyttämällä add_filter("template_include", "filter_function_name_11"); funktio filter_function_name_11($template) ( // Suodatin... return $template; ) $malli (linja) Täydellinen polku tiedostoon, joka sisällytetään mallina. Pr: home/wptest.ru/wp-content/themes/publisher/page.php. Esimerkit #1 Tiedosto teemahakemistossa

    Näyte pysyvä sivu voit asettaa sen luomalla tiedoston teemahakemistoon ja määrittämällä sen tiedoston alussa PHP kommentti:

    Otsikko

    Jotain tekstiä