Uitbreidbare plug-ins schrijven met acties en filters

Een van de vele dingen die u zult ontdekken bij het onderzoeken van de broncode van een goede plugin-ontwikkelaar, zijn aangepaste hooks en filters die de ontwikkelaar gedurende de hele plug-in heeft geplaatst. De aanwezigheid van deze actiehaken en filters maakt de plug-in "uitbreidbaar", wat betekent dat andere plug-ins en thema's het gedrag van de plug-in kunnen manipuleren of toevoegen.

Het schrijven van uitbreidbare plug-ins wil ik graag sterk aanmoedigen. Er zijn een lot van grote redenen waarom u het zou moeten doen, maar zeer weinig (of geen) redenen waarom u deze praktijk zou moeten vermijden.

We gaan kijken naar verschillende elementen van uitbreidbare plug-ins:

  • Een uitleg van wat uitbreidbare plug-ins zijn
  • Redenen waarom u uitbreidbare plug-ins moet schrijven
  • De basishulpmiddelen die u nodig hebt
  • Hoe u uw plug-ins moet schrijven om ze uitbreidbaar te maken
  • Simpele voorbeelden van haken en filters om te illustreren hoe u ze zou kunnen gebruiken

Een belangrijke opmerking: deze tutorial gebruikt zuiver procedureel gebaseerde programmeertechnieken. Alles waar ik het hier over heb, is nog steeds van toepassing bij het gebruik van Object Oriented Programming (OOP), maar het is eenvoudiger om deze technieken eerst in een procedurele omgeving te leren.


Wat is een uitbreidbare plugin?

Een uitbreidbare plug-in is er een die kan worden aangepast en uitgebreid tot voorbij het oorspronkelijke doel door een andere plug-in of thema. Wanneer een plug-in uitbreidbaar is, kunnen andere plug-ins (of thema's) het gedrag of de uitvoer van de plug-in veranderen. Met e-commerce plug-ins kunnen add-on betalingsgateways bijvoorbeeld toestaan ​​dat aankopen via extra betalingssystemen kunnen worden verwerkt. Deze betalingsgateways zijn afzonderlijke plug-ins die eenvoudig verbinding maken met de kerninvoegtoepassing en de functionaliteit ervan uitbreiden.

Alle plug-ins kunnen worden uitgebreid, maar slechts een kleine minderheid van gepubliceerde plug-ins zijn. Om uitbreidbaar of modulair (een andere term voor hetzelfde) te zijn, moet de ontwikkelaar van een plug-in een bewuste beslissing nemen om het op die manier te maken door de noodzakelijke elementen te implementeren die het mogelijk maken dat andere plug-ins en thema's aansluiten op de kernplug-ins. gedrag.


Waarom extensible invoegtoepassingen schrijven??

Er zijn veel goede redenen om uitbreidbare plug-ins te schrijven, maar een van de belangrijkste redenen is dat er gewoon geen goede reden is niet om je plug-ins op deze manier te schrijven, vooral niet wanneer je plug-ins worden vrijgegeven voor de WordPress-community, als gratis of betaalde plug-ins.

Wanneer u uitbreidbare plug-ins schrijft, maakt u het voor andere ontwikkelaars mogelijk om uw plug-in uit te breiden en nog beter te maken, maar zonder ooit de broncode van de bron te wijzigen. U maakt het ook voor ontwikkelaars en gebruikers aanzienlijk eenvoudiger om de plug-in beter aan te passen aan hun behoeften. Ik zal u een voorbeeld geven: in mijn Easy Digital Downloads-plug-in is er een kortingscode-systeem. Kortingscodes zijn beperkt tot één gebruik per gebruiker, dus als een gebruiker dezelfde korting probeert toe te passen op twee verschillende aankopen, ontvangt deze een foutmelding. Een van mijn real-world gebruikers ontdekte dat ze de kortingen niet wilde beperken tot een enkel gebruik per gebruiker, dus gaf ik haar een eenvoudige functie die ze liet vallen in een nieuwe aangepaste plug-in en de beperking werd verwijderd, zonder een plug-in code aan te raken.

Uitbreidbare code maakt andere ontwikkelaars ook erg blij wanneer ze het vinden, omdat hun taak om je code aan te passen gewoon veel, veel gemakkelijker is geworden.


De basisfuncties / functies

Er zijn verschillende belangrijke hulpmiddelen die u nodig hebt om uitbreidbare plug-ins te schrijven. Als je plug-ins of thema's hebt geschreven voordat je dit leest, ben je waarschijnlijk enigszins bekend met deze functies, zelfs als dat alleen maar is omdat je ze hebt gebruikt.

Voordat ik u de functies laat zien die u gaat gebruiken, laten we eerst twee hoofdconcepten bespreken: haken en filters.

Een actiehaak is een plaats in uw plug-in die kan worden "gehaakt" door functies (zowel in uw plug-in als andere plug-ins) om hun code op dat moment te laten uitvoeren. Wanneer een actiehaak wordt uitgevoerd, zullen alle functies die zijn verbonden of "verslaafd", ook worden uitgevoerd.

Een filterhaak is ook een plaats in je plug-in waar andere functies aan kunnen worden gekoppeld, maar ze werken iets anders dan acties. Met filters kunnen gegevens worden gemanipuleerd of gewijzigd voordat deze worden gebruikt.

Het belangrijkste verschil tussen acties en filters is dat acties meestal worden gebruikt voor het uitvoeren van functies en dat filters meestal worden gebruikt voor het manipuleren van gegevens.

Tenzij je al bekend bent met acties en filters, raad ik je ten zeerste aan om het Codex-bericht erop te lezen.

Voor acties zijn er vier hoofdfuncties:

  • do_action () - dit definieert een haakbare locatie voor acties
  • add_action () - dit koppelt een functie aan een haak gemaakt met do_action ()
  • has_action () - dit controleert of een actie geregistreerd is do_action ()
  • remove_action () - Hiermee wordt een actie verwijderd waarmee werd ingesteld add_action ()

Van deze vier gebruik je do_action () en add_action () het meest.

Voor filters zijn er ook vier hoofdfuncties:

  • apply_filters () - hierdoor wordt een ophangbare locatie gecreëerd waarop aangepaste filters kunnen worden aangesloten
  • add_filter () - dit koppelt een aangepast filter aan een haak gemaakt met apply_filters ()
  • has_filter () - dit controleert of er een filter is geregistreerd bij apply_filters ()
  • Verwijder filter () - Hiermee wordt een eerder verbonden filter verwijderd apply_filters ()

Zoals met acties, apply_filters () en add_filter () zijn de twee die je het meest zult gebruiken.

Als je op dit punt in de war bent, maak je geen zorgen, we gaan bekijken hoe je deze in het volgende gedeelte daadwerkelijk kunt gebruiken.


Implementatie in uw eigen plug-ins

Om uw plug-in echt uitbreidbaar te maken, moet u de belangrijkste functies gebruiken die hierboven zijn genoemd in de gehele plug-in. In het begin kun je het moeilijk, omslachtig, irritant of vele andere toepasselijke bijvoeglijke naamwoorden vinden om voortdurend deze extra functies overal in je code te plaatsen, vooral als je geen onmiddellijk voordeel ziet of voor hen gebruikt..

Wat je echter zult vinden, is dat als je eenmaal de gewoonte hebt om je plug-ins met al deze functies in gedachten te schrijven, het een tweede natuur wordt om ze op te nemen.

Er zijn enkele hoofdscenario's waarbij u filters in uw plug-ins gebruikt:

  • Wanneer arrays zijn ingesteld. Filters zullen hier worden toegevoegd, zodat andere plug-ins de gegevens kunnen wijzigen voordat deze worden gebruikt.
  • Wanneer gegevensobjecten zijn ingesteld. Net als bij arrays, gebruikt u een filter op objecten zodat andere ontwikkelaars het object kunnen wijzigen voordat het wordt gebruikt.
  • Wanneer gegevensreeksen zijn ingesteld. Met een filter beschikbaar op een tekenreeks kunnen andere ontwikkelaars de hele reeks wijzigen, delen ervan wijzigen of eraan toevoegen.

Van de bovenstaande scenario's is het het meest gebruikelijk om filters te gebruiken wanneer gegevens worden geretourneerd of net voordat het wordt gebruikt. Als u bijvoorbeeld een plug-in hebt die een query voor een bericht uitvoert, kunt u de array met queryargumenten het beste eerst door een filter halen voordat ze worden doorgegeven aan get_posts () of WP_Query zodat anderen de query kunnen manipuleren voordat deze wordt gemaakt.

Als het gaat om acties, zijn er ook verschillende hoofdinstanties waarin u ze plaatst:

  • Voordat een taak wordt uitgevoerd.
  • Nadat een taak is uitgevoerd.
  • Binnen uw markup om extra markup toe te voegen.

Laten we nu een paar voorbeelden bekijken.

1. HTML weergeven met een shortcode

Shortcodes die HTML uitvoeren zijn extreem gebruikelijk (eigenlijk zijn ze waarschijnlijk de meest voorkomende van alle shortcodes), en een van de manieren waarop we de shortcodes van onze plug-ins vriendelijker kunnen maken voor andere ontwikkelaars, is door hen een manier te bieden om de inhoud van de shortcodes te wijzigen. shortcode, maar zonder dat het wordt uitgeschreven en opnieuw geregistreerd.

Alle shortcodes keren terug in plaats van een echo van hun inhoud, wat betekent dat de gegevens die naar het scherm worden uitgevoerd, de vorm van een tekenreeks zullen hebben voordat deze wordt geretourneerd. Omdat de volledige HTML-uitvoer de vorm heeft van een tekenreeks, kunt u de tekenreeks door een filter leiden voordat u deze retourneert. Als u dit doet, kunnen andere ontwikkelaars de HTML van uw shortcode wijzigen.

Een ontwikkelaar wil mogelijk extra markeringen toevoegen voor en na de standaard HTML: met het filter op zijn plaats, kunnen ze dat doen.

Uw shortcode kan er ongeveer zo uitzien:

 functie wptp_sample_shortcode (atts, $ content = null) $ html = '
'; $ html. = '

Inhoud van de voorbeeldcode van het monster

'; $ html. = '
'; return $ html;

We kunnen dit verbeteren door een filter toe te voegen aan de retour, zoals:

 functie wptp_sample_shortcode (atts, $ content = null) $ html = '
'; $ html. = '

Inhoud van de voorbeeldcode van het monster

'; $ html. = '
'; return apply_filters ('wptp_shortcode_html', $ html);

De HTML in onze shortcode kan nu als volgt worden gewijzigd:

 functie wptp_modify_html ($ html) ga terug '
'. $ html. '
'; add_filter ('wptp_shortcode_html', 'wptp_modify_html');

Dit zal ertoe leiden dat de originele HTML gemaakt in de shortcode wordt ingepakt met een andere div label.

2. Berichten opvragen

Het uitvoeren van aangepaste query's in plug-ins is een gangbare praktijk. Laten we even aannemen dat je een plug-in hebt geschreven die een aangepast berichttype registreert, "boeken" genaamd, en in je plug-in is een functie om gemaakte boeken te tonen. Uw functie om de boeken te doorzoeken kan er ongeveer zo uitzien:

 function wptp_show_books () $ query_args = array ('post_type' => 'books', 'posts_per_page' => 5); $ books = new WP_Query ($ query_args); if ($ books-> have_posts ()): while ($ books-> have_posts ()): $ books-> the_post () // toon hier in de tussentijd informatie over elk boek; stop als; wp_reset_postdata (); 

Maar wat als een gebruiker de soorten boeken die werden geretourneerd wilde wijzigen en misschien alleen boeken uit een specifieke categorie selecteerde? Je kunt dit veel gemakkelijker voor hen maken door dit te doen:

 function wptp_show_books () $ query_args = array ('post_type' => 'books', 'posts_per_page' => 5, 'auteur' => 3); $ books = new WP_Query (apply_filters ('wptp_books_query', $ query_args)); if ($ books-> have_posts ()): while ($ books-> have_posts ()): $ books-> the_post () // toon hier in de tussentijd informatie over elk boek; stop als; wp_reset_postdata (); 

De enige verandering die ik heb aangebracht was om een ​​filter toe te voegen rond de $ query_args, wat betekent dat andere ontwikkelaars (of gebruikers) de queryargumenten kunnen wijzigen voordat ze daadwerkelijk worden doorgegeven WP_Query. We kunnen bijvoorbeeld de zoekopdracht zo instellen dat alleen boeken van auteur 3 als volgt worden weergegeven:

 functie wptp_alter_books_query ($ args) $ args ['author'] = 3; $ args teruggeven;  add_filter ('wptp_books_query', 'wptp_alter_books_query');

3. Uitbreiding van markup

Laten we nu nummer 2 uitbreiden en het nog beter maken. We hebben al een filter toegevoegd waarmee gebruikers de query kunnen aanpassen. Laten we nu een paar hooks toevoegen om de HTML die is gemaakt te wijzigen.

Eerst zullen we onze originele HTML een beetje aanpassen:

 function wptp_show_books () $ query_args = array ('post_type' => 'books', 'posts_per_page' => 5, 'auteur' => 3); $ books = new WP_Query (apply_filters ('wptp_books_query', $ query_args); if ($ books-> have_posts ()): echo '
'; while ($ books-> have_posts ()): $ books-> the_post () echo '
'; echo '

'. get_the_title (). '

'; echo '
'; endwhile; echo '
'; stop als; wp_reset_postdata ();

We willen nu het voor ontwikkelaars mogelijk maken om extra opmaak toe te voegen op verschillende punten, zoals het volgende:

  • Voordat een HTML wordt uitgevoerd
  • Na de einde HTML
  • Voor de titel van elk boek
  • Na de titel van elk boek

U kunt zich een scenario voorstellen waarbij een gebruiker een miniatuur voor of na de titel van het boek zou willen toevoegen. Om dit mogelijk te maken, gebruiken we do_action () om ophangbare locaties te maken, zoals deze:

 function wptp_show_books () $ query_args = array ('post_type' => 'books', 'posts_per_page' => 5, 'auteur' => 3); $ books = new WP_Query (apply_filters ('wptp_books_query', $ query_args)); if ($ books-> have_posts ()): do_action ('wptp_books_before'); echo '
'; while ($ books-> have_posts ()): $ books-> the_post () echo '
'; do_action ('wptp_before_book_title', get_the_ID ()); echo '

'. get_the_title (). '

'; do_action ('wptp_after_book_title', get_the_ID ()); echo '
'; endwhile; echo '
'; do_action ('wptp_books_after'); stop als; wp_reset_postdata ();

Merk op dat de twee binnenhaken (die de titel omringen) een tweede parameter van hebben get_the_ID (). Deze variabele, die de ID van het boek zal zijn, zal beschikbaar zijn als een parameter voor elke gekoppelde functie. Om bijvoorbeeld een boekminiatuur toe te voegen, kunnen we dit doen:

 functie wptp_show_book_image ($ book_id) echo get_the_post_thumbnail ($ book_id, 'thumbnail');  add_action ('wptp_before_book_title', 'wptp_show_book_image');

Echte wereldvoorbeelden

Ik wil u nu een aantal voorbeelden uit de echte wereld laten zien van plug-ins die uitbreidbaar zijn, inclusief voorbeelden van enkele van hun uitbreidbare functies.

1. Soliloquy

Soliloquy is een krachtige op WordPress reagerende beeldschuifregelaar die het maken en onderhouden van responsieve, efficiënte, veilige en SEO-vriendelijke afbeeldingschuifregelaars een eitje maakt..

Bijna alles in deze plug-in is uitbreidbaar. Hier is slechts een voorbeeld:

 $ labels = apply_filters ('tgmsp_post_type_labels', array ('name' => __ ('Soliloquy', 'moniloquy'), 'singular_name' => __ ('Soliloquy', 'moniloquy'), 'add_new' => __ ( 'Add New', 'soliloquy'), 'add_new_item' => __ ('Voeg nieuwe Soliloquy Slider toe', 'soliloquy'), 'edit_item' => __ ('Edit Soliloquy Slider', 'moniloquy'), 'new_item' => __ ('New Soliloquy Slider', 'soliloquy'), 'view_item' => __ ('View Soliloquy Slider', 'soliloquy'), 'search_items' => __ ('Zoeken Soliloquy Sliders', 'soliloquy') , 'not_found' => __ ('Geen Soliloquy Sliders gevonden', 'soliloquy'), 'not_found_in_trash' => __ ('Geen Soliloquy Sliders gevonden in de prullenbak', 'soliloquy'), 'parent_item_colon' => ", 'menu_name '=> __ (' Soliloquy ',' soliloquy '))); $ args = apply_filters (' tgmsp_post_type_args ', array (' labels '=> $ labels,' public '=> true,' exclude_from_search '=> true,' show_ui '=> true,' show_in_admin_bar '=> false,' rewrite '=> false,' query_var '=> false,' menu_position '=> 100,' menu_icon '=> plugins_url (' css / images / menu-icon.png ', dirname (__FILE__)),' ondersteunt '=> array (' title ')));

Dit is hoe Thomas Griffin (de ontwikkelaar van de plug-in) de argumenten instelt voor zowel de aangepaste labels en attributen van het posttype. De aanwezigheid van zijn twee filters, tgmsp_post_type_labels en tgmsp_post_type_args, maak het heel eenvoudig voor andere ontwikkelaars om het schuifpaal-berichttype te hernoemen of te veranderen wat het berichttype ondersteunt.

2. bbPress

Veruit een van mijn persoonlijke favoriete plug-ins aller tijden, bbPress is een volledig functionele forum-plug-in voor WordPress. De volledige plug-in is een perfect voorbeeld van hoe u uw plug-ins uitbreidbaar kunt maken, omdat deze letterlijk overal acties en filters bevat. Het heeft één bepaald filter dat wordt toegepast bij het ophalen van de inhoud van een forum:

 function bbp_get_forum_content ($ forum_id = 0) $ forum_id = bbp_get_forum_id ($ forum_id); // Controleer of een wachtwoord vereist is als (post_password_required ($ forum_id)) get_the_password_form () retourneert; $ content = get_post_field ('post_content', $ forum_id); return apply_filters ('bbp_get_forum_content', $ content, $ forum_id); 

Voordat de inhoud van het forum wordt geretourneerd, wordt deze door een filter geleid bbp_get_forum_content dat maakt het voor een ontwikkelaar mogelijk om de inhoud aan te passen voordat deze ooit wordt weergegeven.

3. Eenvoudige digitale downloads

Easy Digital Downloads, of EDD, is een van mijn plug-ins die is gebouwd om het uitzonderlijk eenvoudig te maken om digitale producten te verkopen via WordPress. Zoals met de meeste e-commerce plug-ins, heeft EDD een betaalproces dat de koper doorloopt, zodat zij hun persoonlijke en betalingsgegevens kunnen invoeren. Nadat al die informatie is verzameld, gaat alles naar een betalingsgateway (een systeem voor het verwerken van de betaling), maar voordat deze naar de gateway gaat, wordt een filter toegepast waarmee de gegevens kunnen worden gemanipuleerd voordat het door de betaling wordt gebruikt systeem:

 $ purchase_data = apply_filters ('edd_purchase_data_before_gateway', $ purchase_data, $ valid_data);

De aanwezigheid van dit filter maakt het mogelijk om aankoopbedragen aan te passen (misschien voor speciale kortingen), belastingen toe te voegen, misschien producten toe te voegen of te verwijderen van de aankoop, en nog veel, veel meer.


Conclusie

Uitbreidbare plug-ins komen iedereen ten goede: de oorspronkelijke ontwikkelaar, andere ontwikkelaars en de gebruikers zelf.

Er zijn zoveel redenen waarom u uw plug-ins met uitbreidbare code in gedachten moet schrijven, dus waarom niet?

De tools die hier worden gepresenteerd, zijn alles wat u nodig hebt om te beginnen. Vragen hebben? Vraag maar raak!