Det här är den andra delen av serien om att utveckla en multipelvalsquiz-plugin för WordPress. I första delen skapade vi backenden av vårt plugin för att fånga nödvändiga data för att lagra i databasen.
I den här sista delen skapar vi pluginens främre del där användarna kan ta frågesport och utvärdera deras kunskaper.
Följande ämnen kommer att omfattas av denna del av att fylla i vårt plugin:
Vi behöver en stor mängd frågor i backend för att skapa slumpmässiga frågesporter. Jag hoppas att du redan arbetat med backend och lagrade tillräckligt med frågor för frågesport.
Så låt oss börja.
Först bör vi ha ett inlägg eller en sida som laddar quizens visningselement. Detta kan uppnås genom att använda antingen en kortkod eller sidmall. I denna plugin används en kortnummer för att göra den oberoende av temat.
Kortkoder låter oss använda plugin som en självständig komponent medan sidmallar beror på temat. Å andra sidan är en sidmall mycket säkrare än kortnummer, eftersom det finns möjlighet att ta bort kortnummer på sidorna av misstag.Ursprungligen bör kortkoden mata ut de tillgängliga frågesportkategorierna så att användarna kan välja en kategori för att skapa frågesporten. En kortnummer läggs till i konstruktören med hjälp av add_shortcode
funktion som anges i följande kod.
add_shortcode ('wpq_show_quiz', array ($ this, 'wpq_show_quiz'));
Låt oss nu titta på implementeringen för kortkoden genom att hämta tillgängliga frågekategorier från databasen.
funktion wpq_show_quiz ($ atts) global $ post; $ html = '';
Den angivna koden ska ingå i Genomförande av formulärinsändning delen av föregående kod.
När formuläret skickats kontrollerar vi om formuläret innehåller den nödvändiga åtgärden med det dolda fältet vi genererade tidigare. Då får vi den valda quizkategorin från $ _POST
array.
Då frågar vi databasen för wptuts_quiz
inlägg med den valda quizkategorin.
Det är viktigt att ställa in sortera efter
som rand
att generera slumpmässiga frågor för frågesporter, vilket annars kommer att generera samma uppsättning frågor varje gång. Se också till att ställa in posts_per_page
för att ställa in det maximala antalet frågor per valfri frågesport.
När resultaten alstras måste vi lägga till frågorna i de nödvändiga HTML-elementen och vi kommer att implementera det i nästa avsnitt.
Quizzer kan genereras som en skärm som innehåller alla frågor på en gång, eller skärm som innehåller en fråga i taget med navigeringskontroller. Jag tror att den senare tekniken är favorit bland de flesta. Därför kommer vi att visa denna frågesport med en enda fråga och navigering för att gå vidare till tidigare och nästa frågor.
Att generera denna funktionalitet från grunden kan vara en tidskrävande uppgift samt att återuppfinna hjulet. En jQuery-reglaget är den perfekta lösningen för den här situationen och jag använder RhinoSlider, eftersom det är min favorit, så ta en kopia.
Inne i den nedladdade mappen ser du tre mappar som heter img, js, och css. Kopiera img och css mappar i vårt plugin och kopiera filerna inuti js mapp till befintliga js mapp vi har på vår quiz plugin. Nu kan vi komma igång med att inkludera nödvändiga skript och stilar för reglaget.
I första delen skapade vi nödvändiga skript för backend. I den här delen kommer vi att inkludera nödvändiga skript för RhinoSlider samt quiz.js för anpassad funktionalitet.
För större applikationer kan vi använda separata skriptfiler för både frontend och backend. Jag använder en skriptfil för att göra saker enklare.Tänk på följande kod för att inkludera skript och nödvändiga konfigurationsdata.
funktion wpq_frontend_scripts () wp_register_script ('rhino', plugins_url ('js / rhinoslider-1.05.min.js', __FILE__), array ('jquery')); wp_register_script ('rhino-mousewheel', plugins_url ('js / mousewheel.js', __FILE__), array ('jquery')); wp_register_script ('rhino-easing', plugins_url ('js / easing.js', __FILE__), array ('jquery')); wp_register_script ("quiz", plugins_url ('js / quiz.js', __FILE__), array ("jquery", "rhino", "rhino-mousewheel", "rhino-easing")); wp_enqueue_script ("quiz"); $ quiz_duration = get_option ('wpq_duration'); $ quiz_duration = (! tom ($ quiz_duration))? $ quiz_duration: 300; $ config_array = array ('ajaxURL' => admin_url ('admin-ajax.php'), 'quizNonce' => wp_create_nonce ('quiz-nonce'), 'quizDuration' => $ quiz_duration, 'plugin_url' => $ this -> plugin_url); wp_localize_script ("quiz", "quiz", $ config_array);
Här har vi tre JavaScript-filer som används för RhinoSlider och quiz.js fil för anpassad funktionalitet. I den föregående delen konfigurerade vi frågans varaktighet. Vi kan hämta varaktigheten med hjälp av get_option
funktionen och tilldela den till $ config
array. Vi måste också inkludera vanliga konfigurationer i config-arrayen.
Slutligen kan vi använda wp_localize_script
funktion för att tilldela config data i quiz.js fil.
På samma sätt kan vi inkludera CSS-filerna som krävs för Rhino Slider med följande kod.
funktion wpq_frontend_styles () wp_register_style ("rhino-bas", plugins_url ('css / rhinoslider-1.05.css', __FILE__)); wp_enqueue_style ("rhino-bas");
Slutligen måste vi uppdatera pluginkonstruktorn för att lägga till nödvändiga åtgärder för att inkludera skript och format som anges i följande kod.
add_action ('wp_enqueue_scripts', array ($ this, 'wpq_frontend_scripts')); add_action ('wp_enqueue_scripts', array ($ this, 'wpq_frontend_styles'));
Allt är klart för att integrera skjutreglaget med frågor i den kortnummer vi skapade tidigare. Låt oss gå framåt.
Vi har för närvarande två kommentarer inom kortkodsfunktionen, med namnet "Generering av HTML för frågor" och "Inbäddning av slider". De sektionerna måste uppdateras med respektive kod för att generera en reglage. Först måste vi uppdatera medan
slinga enligt följande.
medan ($ query-> has_posts ()): $ query-> the_post (); $ question_id = get_the_ID (); $ question = the_title (",", FALSE). ". få_the_content (); $ question_answers = json_decode (get_post_meta ($ question_id, '_question_answers', true)); $ questions_str. = '
Kodförklaring
get_post_meta
fungera.för varje
loop, alla svar kommer att tilldelas radioknapparna med nödvändiga värden.Nästa måste vi skapa behållarna för skjutreglaget i avsnittet kommenterat som "Inbäddning av slider". Följande kod innehåller HTML-koden för att skapa containrar.
$ html. = '
Vi kommer att använda en oordnad lista som heter reglaget
som behållare för Rhino Slider. Initialt inkluderar vi uppsättningen frågor och svar som genereras inuti slingan, med hjälp av $ questions_str
. Det kommer att innehålla en samling av listobjekt.
Då måste vi manuellt skapa ett annat listobjekt för att visa resultatet av quiz och poängen.
Nu är alla data och diabilder som krävs för quiz-applikationen konfigurerad. Vi kan initiera Rhino Slider i quiz.js att se quizen i aktion.
jQuery (dokument) .ready (funktion ($) $ ('# slider'). rhinoslider (controlsMousewheel: false, controlsPlayPause: false, showBullets: 'always', showControls: 'always'););
Jag har använt vissa anpassade CSS-stilar för att förbättra utseendet och känslan. Du hittar alla ändrade CSS under wp_quiz
del av rhinoslider-1.05.css fil. Nu borde du ha något som följande bild.
När frågeställningen är laddad kan du använda navigeringskontrollerna för att flytta mellan frågor och välja svaren. Du borde klicka på knappen "Få resultat" när alla frågor är besvarade. Nu behöver vi skapa frågesportresultaten med en AJAX-förfrågan.
Låt oss implementera jQuery-koden för att göra AJAX-förfrågan.
$ ("# completeQuiz"). klicka (funktion () wpq_quiz_results ();); var wpq_quiz_results = funktion () var selected_answers = ; $ ("ques_answers"). Var (funktion () var question_id = $ (this) .attr ("data-quiz-id"); var selected_answer = $ (this) .find ('inmatning [typ = radio] : checked)) if (selected_answer.length! = 0) var selected_answer = $ (selected_answer) .val (); selected_answers ["qid _" + question_id] = selected_answer; annat selected_answers ["qid _" + question_id] = ";); // AJAX-förfrågan;
När "Get Results" -knappen är klickad kallar vi wpq_quiz_results
funktionen med jQuery. Varje fråga har lagts till glidreglaget med en särskild CSS-klass som heter ques_answers
.
När du går igenom varje element med ques_answers
klass, hämtar vi fråge-idet med hjälp av det HTML-attribut som heter data frågesport-id
och den valda radioknappen med jQuery.
Slutligen tilldelar vi alla frågor och de valda svaren till en upptagen grupp selected_answers
, att skickas till AJAX-förfrågan.
Ta en titt på följande kod för genomförandet av AJAX-förfrågan.
$ .post (quiz.ajaxURL, action: "get_quiz_results", nonce: quiz.quizNonce, data: selected_answers,, funktion (data) // AJAX resultathanteringskod, "json");
Först skapar vi AJAX-förfrågan med hjälp av konfigurationsdata som tilldelats från wpq_frontend_scripts
fungera. Svarlistan som genererats i föregående avsnitt skickas som dataparameter. Innan vi hanterar resultatet måste vi titta på implementeringen av serverns sidkod i följande avsnitt.
Först måste vi uppdatera konstruktören med de åtgärder som krävs för att använda AJAX för både inloggade användare och vanliga användare som visas i följande kod.
add_action ('wp_ajax_nopriv_get_quiz_results', array ($ this, 'get_quiz_results')); add_action ('wp_ajax_get_quiz_results', array ($ this, 'get_quiz_results'));
Då kan vi gå in i implementeringen av get_quiz_results
funktion som visas i följande kod.
funktion get_quiz_results () $ score = 0; $ question_answers = $ _POST ["data"]; $ question_results = array (); foreach ($ question_answers as $ ques_id => $ svar) $ question_id = trim (str_replace ('qid_', ', $ ques_id))', '; $ correct_answer = get_post_meta ($ question_id,' _question_correct_answer ', true); om $ answer == $ correct_answer) $ score ++; $ question_results ["$ question_id"] = array ("answer" => $ svar, "correct_answer" => $ correct_answer, "mark" => "correct"); andra $ question_results ["$ question_id"] = array ("answer" => $ svara, "correct_answer" => $ correct_answer, "mark" => "inkorrekt"); total_questions = count ($ question_answers) ; $ quiz_result_data = array ("total_questions" => $ total_questions, "score" => $ poäng, "result" => $ question_results); echo json_encode ($ quiz_result_data); exit;
Kodförklaring
$ _POST
array.qid_
prefix.get_post_meta
fungera.$ question_results
baserat på status för resultatet.$ poäng
variabel.$ quiz_result_data
array som ska skickas som svaret.Hittills har vi skapat AJAX-förfrågan och genomfört serverns sidansvar. I nästa avsnitt kommer vi att slutföra frågeprocessen genom att hantera AJAX-svaret.
I svarhanteringsdelen har vi en hel del uppgifter, inklusive visning av frågesportresultat och betyg. Så jag ska skilja koden i några avsnitt för att förklara förklaringen. Tänk på följande kod som innehåller den fullständiga AJAX-förfrågan.
$ .post (quiz.ajaxURL, action: 'get_quiz_results', nonce: quiz.quizNonce, data: selected_answers, funktion (data) // Avsnitt 1 var total_questions = data.total_questions; $ ('# slider'). nästa ($ ('# rhino-item' + total_questions)); $ ('# poäng'). html (data.score + '/' + total_questions); // Avsnitt 2 var result_html = '
Fråga | Svar | Rätt svar | Resultat |
'+ quiz_index +' | '+ ques.answer +' | '+ ques.correct_answer +' | '; result_html + = '|
'; result_html + = ' |