Det finns ingen anledning att fråga varför någon skulle vilja skriva ett plugin för WordPress. Det är en av de främsta funktioner som gör WordPress så flexibelt och bra för ett stort antal projekt. I den första delen av vår serie Vi skapade basen för ett WordPress-plugin som kan identifieras av kärnan. Sedan i den andra delen Vi lärde oss hur vi ändrar kärnans standardfunktionalitet. Idag ska vi titta på pluginalternativ. Det här är en av de vanligaste uppgifterna som plugins behöver utföra.

Vanligtvis behöver du skapa en uppsättning parametrar (alternativ) och ge användaren möjlighet att tilldela lämpliga värden till dem. Värden lagras i databasen och kan hämtas på begäran. Plugin kommer normalt att utföra olika åtgärder baserat på dessa värden, till exempel producera olika utdata.

Vilka verktyg ger WordPress oss för att göra detta scenario möjligt? Det tillåter oss att registrera alternativ med systemet och hämta dem med tilldelat ID - Options API är ansvarig för det. WordPress tillhandahåller också ett inställnings API för att skapa en administratörsguiden för alternativdialoger. Bortsett från det tillåter vi oss att lägga till anpassade objekt i adminmenyn så att plugin kan ha sin egen inställningssida. Slutligen tar WordPress hand om pluginsäkerhet och ger en uppsättning funktioner och rengöringsmetoder för att hantera användarinmatningen på ett säkert sätt.

Låt oss ta en detaljerad titt på varje del.

Alternativ API

De Alternativ API är ett standardiserat sätt att lagra anpassade data i databasen. Alla data sparas i wp_options-tabellen under ett visst anpassat namn och kan nås från någonstans i koden. API: s viktigaste funktioner är:

Get_option-funktionen extraherar enkelt från databasen alla uppgifter som lagras under ett visst namn och returnerar det. Funktionen update_option tar ett alternativnamn och dess värde och uppdaterar motsvarande post i databasen. Om det inte finns någon sådan post kommer den att skapas automatiskt. Båda funktionerna kan fungera med arrayer samt enskilda värden. Det betyder att du kan lagra matrisdata under ett enda namn i databasen och API: n kommer att hantera serialiserings- och mineraliseringsåtgärder för dig. Det är en rekommenderad övning för plugins: lagra alla pluginalternativ som en array under ett enda namn.

Plugin Options 'sida

Du kan skapa en inställningssida eller en grupp sidor för ditt plugin i administratörsmenyn. Om du skapar en grupp sidor bör du först lägga till en högsta sida:

Parametervärdena är självförklarande men du kan referera till källa för detaljer. Nu måste du lägga till interna sidor en efter en på följande sätt:

Som parameter parent_slug måste du använda ID på toppnivånssidan - vid en anpassad toppnivå sida är det det värde du angav som $ menu_slug vid registrering. Om du inte behöver flera sidor kan du skapa en enda inställningssida under en av befintliga sektioner på toppnivå - vanligen under "Inställningar" (alternativ-general.php ska användas som $ parent_slug). Alternativt finns det genvägsfunktioner för att lägga till delsidor under vissa administrativa menyalternativ, i fallet "Inställningar" är det add_options_page () .

Inställningar API

De Inställningar API kan du skapa ett gränssnitt för att hantera pluginens inställningar; markera en sida som en inställningssida (för att automatiskt bearbeta inmatning) och utmatningssektioner på den sidan och fält i varje avsnitt för att acceptera användarinmatning. För att uppnå detta är ditt första mål att registrera inställningar med systemet och skapa sektionsfältstruktur för dem:

Referera till Kodex för en detaljerad beskrivning av parametrarna, men logiken är ganska enkel. Först och främst registrerar vi vårt alternativnamn (om det finns många alternativ kan de ordnas i grupper); då registrerar vi avsnitt (er) med ett internt ID och en uppsättning fält för varje sektion; API ger oss möjlighet att ange anpassade återuppringningar för inmatningsvalidering och för att visa varje fält och avsnitt.

Efter registrering av våra alternativ och motsvarande fält måste vi visa dem på inställningssidan - följande funktioner måste ringas inuti

märka:

Settings_fields-funktionen tar hand om obligatoriska dolda fält för den inbyggda WordPress-alternativmekanismen för att fungera. Do_settings_sections producerar faktiskt tidigare registrerade sektioner och fält.

Säkerhetshänsyn

Den grundläggande säkerhetsregeln när det gäller hantering av alternativ är väldigt enkel: rengör inmatningen, undvik produktionen och ta hand om kapaciteten. Med andra ord, om du accepterar inmatning från en användare måste du kontrollera att formatet är korrekt och inte innehåller skadligt innehåll (det vill säga validering), därefter kan du vidarebefordra data för vidare bearbetning. När du visar data som extraheras från databasen, ska den släppas för att skriva ut specialtecken (särskilt HTML) korrekt. För båda uppgifterna tillhandahåller WordPress inbyggda funktioner som kan användas i olika sammanhang (läs mer om ämnet här ).

En annan anledning till oro är användarnas behörigheter. WordPress har inbyggd mekanism som styr användarnas roller och funktioner som blockerar åtkomst till vissa administrativa områden för användare med otillräckliga behörigheter. Endast administratörer är tillåtna överallt. När du skapar alternativsidor måste du tilldela rätt funktioner till dem (normalt är det 'manage_options') och tillåter inte att användare med låga rättigheter har tillgång till sidan (för mer information om WordPress-roller och -funktioner, se Kodex ).

Sätt allt i jobbet

Låt oss se hela scenariot i aktion.

Vi fortsätter att utveckla vårt "Hello World" -exempel (startat i de tidigare delarna av serien) som visar gästförfattarens information under ett inlägg med hjälp av anpassad taxonomi.

Författarens blockmarkering har tidigare varit hårdkodad i plugin. Nu ska vi ge användaren möjlighet att ange en mall för den markeringen med platsinnehavare för författarspecifika data (namn, webbadress och beskrivning). Vårt plugin har redan två inkluderande PHP-filer: core.php (innehåller huvudkoden) och admin.php (innehåller administratörsrelaterad kod).

Vilka förändringar behöver vi göra?

1. Skapa en plugin-options sida (i admin.php)

/* register menu item */function msp_helloworld_admin_menu_setup(){add_submenu_page('options-general.php','Helloworld Settings','Helloworld','manage_options','msp_helloworld','msp_helloworld_admin_page_screen');}add_action('admin_menu', 'msp_helloworld_admin_menu_setup'); //menu setup/* display page content */function msp_helloworld_admin_page_screen() {global $submenu;// access page settings$page_data = array();foreach($submenu['options-general.php'] as $i => $menu_item) {if($submenu['options-general.php'][$i][2] == 'msp_helloworld')$page_data = $submenu['options-general.php'][$i];}// output?>

'; return $ actions;} add_filter (' plugin_action_links ',' msp_helloworld_settings_link ', 2, 2);

I detta stycke skapar msp_helloworld_admin_menu_setup en undersida under menyn "Inställningar" (den ska köras på handskakan "admin_menu" för att fungera korrekt). Då matar vi in ​​formuläret med msp_helloworld_admin_page_screen. Den använder inställningarna API-funktioner för fält och förbyggda WordPress-funktioner för andra delar av gränssnittet (som inmatningsknappen). Notera åtgärdsattributet för

tagg: det borde peka på "options.php" för att bearbeta alternativ på rätt sätt. Slutligen skapar msp_helloworld_settings_link filter en genvägslänk till alternativsidan på skärmen för plugin management.

2. Registrera pluginalternativ med systemet och skapa fält och regler för dem

/* register settings */function msp_helloworld_settings_init(){register_setting('msp_helloworld_options','msp_helloworld_options','msp_helloworld_options_validate');add_settings_section('msp_helloworld_authorbox','Author's box','msp_helloworld_authorbox_desc','msp_helloworld');add_settings_field('msp_helloworld_authorbox_template','Template','msp_helloworld_authorbox_field','msp_helloworld','msp_helloworld_authorbox');}add_action('admin_init', 'msp_helloworld_settings_init');/* validate input */function msp_helloworld_options_validate($input){global $allowedposttags, $allowedrichhtml;if(isset($input['authorbox_template']))$input['authorbox_template'] = wp_kses_post($input['authorbox_template']);return $input;}/* description text */function msp_helloworld_authorbox_desc(){echo "

Enter the template markup for author box using placeholders: [gauthor_name], [gauthor_url], [gauthor_desc] for name, URL and description of author correspondingly.

";}/* filed output */function msp_helloworld_authorbox_field() {$options = get_option('msp_helloworld_options');$authorbox = (isset($options['authorbox_template'])) ? $options['authorbox_template'] : '';$authorbox = esc_textarea($authorbox); //sanitise output?>

Jag bör påpeka att alla pluginalternativ ska lagras som en array. Trots att vi bara har ett alternativ (authorbox_template), inkluderar vi det i en array och motsvarande fält i avsnittet för demonstrationsändamål. Registreringsfunktionen msp_helloworld_settings_init ska utföras på "admin_init" -kroken. Funktionen msp_helloworld_options_validate tar hand om användarinmatning genom att rengöra den med den infödda wp_kses_post filter som bygger på KSES-biblioteket. Funktionen msp_helloworld_authorbox_desc skapar en beskrivning för formulärets avsnitt och msp_helloworld_authorbox_field matar ut en textarea för att hantera inmatad markup. Observera att vi tilldelar CSS-klasserna "stortextkod" till den så att den inbyggda adminstyling tillämpas.

Allt detta skapar följande skärm i WordPress admin panel.

3. Ändra funktionen som matar ut författarens ruta (i core.php)

Vi gör det så att det får mallen från databasen och ersätter platshållardata ([gauthor_name], [gauthor_url], [gauthor_desc]) med motsvarande värden.

/* Create author's box markup */function msp_helloworld_author_block(){global $post;$author_terms = wp_get_object_terms($post->ID, 'gauthor');if(empty($author_terms))return;$name = stripslashes($author_terms[0]->name);$url = esc_url(get_term_link($author_terms[0]));$desc = wp_filter_post_kses($author_terms[0]->description);//get template from option$options = get_option('msp_helloworld_options');$out = (isset($options['authorbox_template'])) ? $options['authorbox_template'] : '';$out = str_replace(array('[gauthor_url]', '[gauthor_name]', '[gauthor_desc]'),array($url, $name, $desc),$out);return $out;}

Slutligen producerar vårt plugin (efter att ha tillämpat några stilar) en bra gästförfattares låda under inläggsinnehåll.

Slutsats

Att lagra och komma åt alternativdata är en mycket vanlig uppgift, som många plugins behöver utföra. Genom alternativmekanismen kan du ge dina användare möjligheten att ställa in plugin till deras behov (vilket de säkert kommer att uppskatta). Även utveckla för dig själv kan du behöva ett sätt att lagra detaljer för en viss installation. Att förlita sig på inbyggda WordPress API och funktioner när du löser sådana uppgifter är ett bra sätt att skapa en hållbar, säker och framtidsskyddad kod.

Vilken typ av plugins vill du se tillgänglig för WordPress? Har du byggt din egen med den här serien? Låt oss veta i kommentarerna nedan.

Utvalda bildanvändningar modulbild via Shutterstock