Persisted WordPress Admin Notices Del 3

Välkommen tillbaka till vår serie om uthållna WordPress-administrativa meddelanden. Vi har nu ett bra ställe att kunna utöka vår funktionalitet och kontroll av admin när de visas på sidan.

Därefter fortsätter vi vidare till fortlöpande administrativa meddelanden och ser hur du kan se till att de avvisas på ett sådant sätt att de inte återkommer när administratorsidor laddas om. 

Detta är särskilt viktigt eftersom anpassade adminmeddelanden som implementeras i plugins och teman är bara mycket användbara när du permanent kan avfärda dem. Det räcker inte att helt enkelt lägga till är-dismissible CSS klass.

Kontrollerar när administrativa meddelanden visas

Hittills har alla administrativa meddelanden visats så snart sidan laddas. Det kan finnas tillfällen då det här är obekvämt och du vill att adminmeddelandet ska visas efter en viss händelse har utlösts istället.

Vad sägs om om vi ville ha ett anpassat adminmeddelande som ska visas på pluginalternativssidan vi skapade tidigare, men endast efter Spara ändringar knappen klickades?

Vi vet redan från del två hur man begränsar ett administrativ meddelande till pluginalternativssidan. Låt oss ta reda på hur vi kan utlösa det att visas efter att pluginalternativ har sparats.

Börja med att kommentera add_action funktionskall för plugin_admin_notice. Lägg sedan till en fjärde add_action inkalla i det som följer:

add_action ('admin_notices', array ($ this, 'conditional_plugin_admin_notice'));

När pluginalternativ sparas, a inställningar uppdaterade värdet av Sann läggs till super globalt $ _GET array variabeln. Vi kan använda detta för att avgöra om vi behöver visa vårt administrativa meddelande.

Lägg till en ny conditional_plugin_admin_notice metod till Gwyer_Admin_Notices som matar ut värdet av $ _GET till skärmen.

/ ** * Utför ett administrativ meddelande på pluginalternativsidan när inställningarna har sparats. * / allmän funktion conditional_plugin_admin_notice () echo "
"; print_r ($ _ GET); echo"
";

När pluginalternativsidan laddas normalt ser vi inte ett värde för inställningar uppdaterat.

Ange nu lite text i Ange lite text fält och klicka Spara ändringar. Den här gången ser vi inställningar uppdaterade satt till Sann, som vi kan lägga till bra användning.

Ersätt conditional_plugin_admin_notice med:

/ ** * Utför ett administrativ meddelande på pluginalternativsidan när inställningarna har sparats. * / allmän funktion conditional_plugin_admin_notice () $ whitelist_admin_pages = array ('settings_page_admin-notices / plugin-options'); $ admin_page = get_current_screen (); $ current_user = wp_get_current_user (); om (in_array ($ admin_page-> bas, $ whitelist_admin_pages) && isset ($ _GET ['settings-updated']) && $ _GET ['settings-updated']) 

Insticksalternativen sparas bara. DISPLAY_NAME; ?>, du är bara så fantastisk!

Vid den här koden bör du se dig bekant. Ett par nya funktioner har dock lagts till. För det första har det villkorliga uttrycket utvidgats till test för närvaron av inställningar-uppdatering. Nu visas adminmeddelandet bara om vi finns på pluginalternativssidan och om inställningar uppdaterade är satt till Sann.

Det nuvarande användarnamnet visas också för att göra adminmeddelandet lite mer personligt.

De wp_get_current_user () Funktionen returnerar information om den inloggade användaren. Detta objekt är lagrat i $ CURRENT_USER och innehåller detaljer som användarnamn, ID, förnamn, efternamn och visningsnamn, vilket är den specifika egenskapen vi är intresserade av.

Slutligen, för lite extra polsk, har vi förhindrat att standardbehandlingsmeddelandet visas så att vår anpassade är den enda som är synlig för användaren. För att uppnå detta har vi bara lagt till en enda kod kod till conditional_plugin_admin_notice () att skriva ut CSS för att dölja det oönskade adminmeddelandet.

eko "";

Det slutliga resultatet när pluginalternativ sparas visas nedan.

Även om detta fungerar bra för demonstrationsändamål skulle ett bättre (och renare) tillvägagångssätt vara att lägga till stilar till ett separat stilark i stället och endast ange det på pluginalternativsidan.

Vårt anpassade adminmeddelande kan förlängas ytterligare på flera sätt. En möjlighet kan vara att behålla en logg som lagrade aktuellt datum / tid tillsammans med användarinformation varje gång pluginalternativen sparades.

Eller hur är det med att få administrationsmeddelandet att visa hur många gånger pluginalternativen har sparats den dagen, veckan, månaden etc.? Jag är säker på att du kan tänka på fler exempel också!

Avvisa förvarade administrativa meddelanden effektivt

Det är dags att få våra händer smutsiga nu och gräva in i mer fördjupad kod, så vi uppmärksammar att avvisa vidhållna administrativa meddelanden. Fram till nu är det enda sättet vi har sett hur vi gör det här att lägga till .är-dismissible CSS-klass till vår administrativa meddelande div container. Detta avvisar adminmeddelandet för den aktuella sidan, men det används inte i praktiken eftersom det visas igen när en admin sida laddas om.

Så hur kan vi fixa det här? Vi tittar på flera olika sätt att avvisa vidhållna administrativa meddelanden, inklusive:

  • Enstaka administrativ meddelande som försvinner efter en vy.
  • En adminmeddelande räknare som försvinner efter ett visst antal visningar.
  • Klibbigt administrativ meddelande som förblir avskedad vid sidauppdatering.
  • Anpassad åtgärdsavsättning (administrativ meddelande borttagen efter att specifik åtgärd har slutförts).

Innan vi börjar implementera var och en av dessa exempel, se till att alla add_action () samtal in Gwyer_Admin_Notices :: init () har kommenterats. Lägg sedan till en ny dismissible-admin-notices.php fil till admin_notices plugin mapp. Öppna den här nya filen och lägg till en ny klassdefinition:

i det();

I admin_notices.php, Lägg till en till require_once () Ring för att importera vår nya klass:

require_once (dirname (__ FILE__). '/ dismissible-admin-notices.php');

De Gwyer_Dismissible_Admin_Notices klassen kommer att innehålla all kod relaterad till uppsägning av fortlöpande administrativa meddelanden.

One-Off Admin Notice

Den första metoden vi tittar på är hur man visar ett administrativ meddelande bara en gång så att den inte återkommer på sidan. Du kan använda den här metoden för att meddela en användare när ett plugin eller tema just har aktiverats.

Låt oss göra det här för plugin-programmet Admin Notices. Vi börjar genom att registrera ett WordPress-övergående alternativ vid pluginaktivering som är inställd att upphöra med nästan omedelbart.

I Gwyer_Dismissible_Admin_Notices klass, lägg till ett samtal till register_activation_hook ():

register_activation_hook (plugin_dir_path (__FILE__). 'admin-notices.php', array ($ this, 'set_admin_notice_transient'));

De register_activation_hook () funktionen kräver att du anger sökvägen till huvud pluginfilen, men vi är för närvarande in dismissible-admin-notices.php. Så vi kan inte bara använda PHP magisk konstanten __FIL__ Vi använde tidigare eftersom det alltid pekar på den aktuella PHP-filen.

I stället måste vi bygga vägen till huvud pluginfilen själva plugin_dir_path (__FILE__). 'Admin-notices.php'.

När plugin-modulen Admin-meddelanden är aktiverad körs koden till en set_admin_notice_transient klassmetod, som vi definierar nästa.

allmän funktion set_admin_notice_transient () set_transient ('admin-notice-transient', true, 5); 

Denna metod skapar en ny övergående kallad 'Admin-meddelande-transient' med ett värde av Sann, och är inställd att upphöra efter fem sekunder.

Låt oss utnyttja denna övergående genom att skickligt visa ett administrativ meddelande om vi är på höger admin sida och vår övergående finns fortfarande.

Lägg till en ny add_action () ring till i det().

add_action ('admin_notices', array (& $ this, 'display_admin_notice'));

Lägg sedan till display_admin_notice återuppringningsfunktion som en ny klassmetod:

 allmän funktion display_admin_notice () $ current_user = wp_get_current_user (); $ whitelist_admin_pages = array ('plugins'); $ admin_page = get_current_screen (); om (in_array ($ admin_page-> bas, $ whitelist_admin_pages) && get_transient ('admin-notice-transient')):?> 

De Adminmeddelanden plugin aktiverades bara. Tack för ditt stöd DISPLAY_NAME; ?>!

På samma sätt som tidigare exempel visar adminmeddelandet endast om vi är på en specifik sida, i det här fallet, den huvudsakliga admin-pluginsidan. Men vi har ett ytterligare villkor att 'Admin-meddelande-transient' måste också existera, annars visas inte adminmeddelandet.

När administrationsmeddelandet är utmatat, övergår den övergående omedelbart, även om vi ursprungligen ställde in den för att löpa ut efter endast fem sekunder. Detta garanterar bara att det inte kommer att visas igen. Det här kan eventuellt hända om en användare försökte uppdatera sidan med plugins mycket snabbt. Men genom att avsiktligt radera transienten kan vi vara säkra på att det aldrig kommer att bli fallet.

För att testa koden som vi just lagt till, gå vidare till huvud plugin-sidan och avaktivera, återaktivera sedan, plug-in för administrativa meddelanden.

Nyckeln här är 'Admin-meddelande-transient' övergående inställning. Utan detta skulle adminmeddelandet visas varje gång pluginsidan laddades (efter att plugin-programmet var aktiverat), vilket inte är vad vi vill.

Admin Notice Counter

Nästa upp är ett administrativ meddelande som bara visar ett visst antal gånger, varefter det inte kommer att synas längre. Också den här gången kommer den inte att begränsas till någon viss administratörssida.

Innan vi börjar, i Gwyer_Dismissible_Admin_Notices klass, kommentera register_activation_hook () och add_action () funktionssamtal. Låt oss nu skapa ett grundläggande administrativ meddelande som vi snart kommer att utvidga funktionaliteten till.

Lägg till en ny add_action () inkalla i det():

add_action ('admin_notices', array (& $ this, 'display_admin_notice_counter'));

Och krossa sedan återuppringningsfunktionen display_admin_notice_counter ():

offentlig funktion display_admin_notice_counter () ?> 

Counter admin meddelande.

Detta kommer att visa ett vanligt administrativ meddelande som kommer att visas på varje WordPress-administratörssida.

Låt oss tänka på vad vi behöver göra. Vårt administrativ meddelande bör visa ett visst antal gånger, och varje gång det visas en intern räknare ökar med en. När räknegränsen har uppnåtts, bör administrationsmeddelandet inte visas igen.

Vi vill att adminmeddelandet ska visas på vilken administratörssida som helst, så motvärdet måste kvarstå mellan sidladdningar. Ett bra sätt att göra detta är att använda ett databasalternativ för att lagra räknevärdet.

Lägg till en räknarklassegenskap för att lagra räknegränsvärdet:

offentliga $ counter_limit = 5;

Detta kommer snart användas för att hantera hur många gånger administrationsmeddelandet visas. Inuti display_admin_notice_counter (), uppdatera koden enligt följande:

 offentlig funktion display_admin_notice_counter () $ counter = get_option ('admin_notice_counter', 1); ?> 

Detta administrativ meddelande har visats tid (s).

Innan adminmeddelandet visas, hämtar vi räknevärdet och ett standardvärde returneras om det inte finns. Efter administrationsmeddelandet görs, räknaralternativet ökar med en och uppdateras. Om det inte finns kommer ett nytt alternativ att skapas för att lagra det aktuella värdet.

Vi har också uppdaterat CSS-klassen som ett informationshanteringsmeddelande.

Prova att besöka olika admin sidor och se räknaren öka varje gång.

De ++$ räknare kod är ett exempel på en pre-increment operatör. Det lägger till ett värde till $ räknare innan Den sparas i databasen. Om vi ​​använde en postoperatör (dvs.. $ räknare++) då värdet av $ räknare skulle lagras först och sedan ökat, vilket inte skulle fungera.

Låt oss införliva $ counter_limit nu för att förhindra att adminmeddelandet visas för många gånger. Lägg till detta till display_admin_notice_counter () under deklarationen för $ räknare:

om ($ counter> $ this-> counter_limit) return; 

Nu, när adminmeddelandet har visats fem gånger, kommer det inte att synas på efterföljande administratörssidor. Det kan dock vara trevligt att visa ett meddelande sista gången adminmeddelandet visas så att användaren vet att den inte kommer att visas igen. Förläng det villkorliga uttrycket och skriv ut ett extra meddelande:

 offentlig funktion display_admin_notice_counter () $ counter = get_option ('admin_notice_counter', 1); om ($ counter> $ this-> counter_limit) return;  annars om ($ counter == $ this-> counter_limit) $ extra_message = "Det är dags att säga adjö nu."; ?> 

Detta administrativ meddelande har visats tid (s).

Du kommer emellertid inte se meddelandet om du redan har gått över diskgränsen. Du kan tillfälligt lösa det här genom att öka $ counter_limit variabel.

För teständamål skulle det vara bättre att kunna återställa motgränsen. Om du vet hur du redigerar databasen kan du gå in och ändra alternativet direkt, men det kan vara tråkigt att göra flera gånger. Så låt oss implementera vår egen återställningsfunktion.

Först, ändra $ counter_limit tillbaka till 5 och lägg till en ny klassegenskap:

offentlig $ counter_reset = false;

Sedan inuti i det() byta ut

add_action ('admin_notices', array (& $ this, 'display_admin_notice_counter'));

med

$ This-> reset_counter_check ();

Återställningsfunktionen ska antingen visa vår röstadministrativa meddelande eller radera admin_notice_counter databasalternativ och visa ett varningsmeddelande i stället.

 allmän funktion reset_counter_check () if (! $ this-> counter_reset) add_action ('admin_notices', array (& $ this, 'display_admin_notice_counter'));  annat delete_option ('admin_notice_counter'); ?> 

Administrationsdisken har återställts! Byta $ counter_reset till falsk för att starta adminmeddelandeträknaren igen.

För att använda den nya nollställningsfunktionen ändras helt enkelt $ counter_reset till Sann och ladda alla administratörer.

Ändra sedan tillbaka till falsk igen.

Obs! Den här metoden kan enkelt användas för att visa ett administrativ meddelande bara en gång, som vi gjorde i föregående exempel, men det är lite mer komplicerat att konfigurera. Det beror verkligen på dina krav.

Om allt du behöver behöver är en enda användarmanual, då kommer den tidigare metoden troligtvis att passa dina behov bättre och är snabbare att genomföra. Men diskmetoden är mer flexibel, och när den är inrättad är den lika lätt att använda i dina egna projekt.

Slutsats

Vi har täckt en hel del mark i del tre i denna tutorial-serien. Vi har sett hur du kontrollerar när administrativa meddelanden visas snarare än att de bara visas så fort en administratörs sida har laddats. Det här är användbart på många sätt, men vårt exempel visar hur man visar ett anpassat administrativt meddelande efter att pluginalternativen har sparats.

Sedan flyttade vi vidare till två distinkta exempel på att avvisa vidhållna administrativa meddelanden. Detta ger dig mycket flexibilitet i hur du presenterar administrativa meddelanden till användaren. Och i nästa och sista delen av denna handledningsserie ser vi på fler sätt att avvisa vidhållna administrativa meddelanden.

Och för lite roligt skapar vi våra egna anpassade administrativ meddelandetyper och lägger till ikondekorationer.