Utilizzando Backbone All'interno dell'amministratore di WordPress The Back End

Le voci sono vere! Il pannello di amministrazione di WordPress ora utilizza Underscore e Backbone! Ciò significa che con il minimo sforzo, possiamo iniziare a utilizzare queste fantastiche librerie JavaScript nei nostri plugin. Questo tutorial ti mostrerà esattamente come puoi farlo. Creeremo la parte Admin di un plug-in Quiz. Useremo un semplice tipo di messaggio personalizzato per salvare le domande, quindi all'interno di ogni domanda aggiungeremo una meta-box che ci permetterà di inserire fino a 4 risposte e selezionare qual è quella corretta. Vedremo come utilizzare i modelli, come agganciare gli eventi click e key-up, come salvare i dati nel database di WordPress e, soprattutto, come "ottenere la verità dal Dom", come creatore A Jeremy Ashkenas piace dirlo.

Devo dire in anticipo, che il plugin che stiamo costruendo in questo tutorial può sembrare eccessivamente prolisso per ciò che realizza. Tuttavia, ti darà una sbirciatina eccellente nel mondo dell'utilizzo di Backbone e se dovessi imbatterti in un progetto in futuro che richiede una complessa interfaccia utente con un sacco di JavaScript, sarai ben armato e pronto a portare l'organizzazione tanto necessaria a la festa.


Cosa faremo

In questa prima parte, configureremo il back-end del nostro plug-in. Ciò comporterà la creazione di file e cartelle e l'implementazione di tutte le funzionalità richieste dal nostro plugin in PHP. Avremo bisogno di:

  1. Registra un tipo di messaggio personalizzato - per le nostre domande
  2. Aggiungi una meta-scatola che ci permetterà di inserire risposte sulla stessa pagina
  3. Salva le informazioni dalle meta-box quando il post viene salvato
  4. Salva le informazioni dalle nostre richieste Ajax (tramite Backbone)

Quindi nella seconda parte ...

Una volta impostato il nostro back-end, procederemo all'output dell'HTML necessario per la nostra meta-box insieme ai dati per ogni risposta in formato JSON. Scriveremo anche il codice JavaScript che lega tutto insieme. Copriremo:

  1. Uscita di base HTML per la meta-box
  2. Emissione di un modello lato client insieme alle risposte in JSON
  3. Il JavaScript doveva legare tutto insieme

Spero che questa piccola serie ti sembri interessante e non vedo l'ora di aiutarti a iniziare a utilizzare Backbone.js con un plug-in di WordPress.


Cosa costruiremo

Questo piccolo plug-in utilizzerà un tipo di messaggio personalizzato per salvare le domande. Quindi, in una meta-scatola, creeremo quattro input che permetteranno agli utenti di inserire le possibili risposte alla domanda corrente e selezionare quale di queste è la risposta corretta. Quando viene modificata una risposta, il corrispondente pulsante di salvataggio diventa attivo. Quando si fa clic, utilizzeremo il built-in di Backbone model.save () metodo per salvare i dati nel database di WordPress. Inoltre, quando le risposte vengono scritte negli input, la casella di selezione sotto di essa aggiornerà automaticamente i suoi valori mentre cercherà le modifiche ai modelli. Tutte queste cose sono relativamente banali da fare con Backbone e dopo aver letto questo tutorial, sarai in grado di iniziare a portare i tuoi plug-in al livello successivo usandoli all'interno di WordPress.

C'è molto da coprire, quindi iniziamo!


1. Crea il plugin

Abbiamo bisogno di fare tutti i soliti primi passi coinvolti con qualsiasi plugin - creare le cartelle dei file.

  1. Crea una cartella chiamata wp_quiz
  2. Crea un file PHP all'interno con lo stesso nome
  3. Crea una cartella chiamata js
  4. Crea una cartella chiamata src

La struttura della tua cartella dovrebbe assomigliare a questa.


2. Aggiungi l'intestazione del plugin

All'interno di wp_quiz.php.

 / * Nome plugin: WP Quiz Plugin URI: http://wp.tutsplus.com/author/shaneosbourne/ Descrizione: Un esempio di utilizzo di Backbone in un plug-in. Autore: Shane Osbourne Versione: 0.1 Autore URI: http://wp.tutsplus.com/author/shaneosbourne/ * /

3. Aggiungi ganci per istanziare il plugin

Ancora dentro wp_quiz.php, dobbiamo fare le seguenti cose:

  1. Includi la nostra classe di plugin principale
  2. Creare una funzione che creerà un'istanza della classe
  3. Aggiungi un hook per chiamare la funzione solo quando l'utente è un amministratore
 / ** wp_quiz.php ** / include 'src / WpQuiz.php'; // Class File // Crea un'istanza della funzione Plugin Class call_wp_quiz () return new WpQuiz ('admin');  // Solo quando l'utente corrente è un Admin se (is_admin) add_action ('init', 'call_wp_quiz'); // Funzione di supporto if (! Function_exists ('pp')) function pp () return plugin_dir_url (__FILE__); 

Mettere la funzione di aiuto pp () all'interno di questo file ci permetterà di fare riferimento ad altri file relativi alla radice della cartella plugin (vedrai che in azione a breve).


4. Creare la classe plugin

All'interno del src cartella, creare un file chiamato WpQuiz.php.

In questa classe di plug-in, avremo bisogno di alcuni metodi diversi per realizzare quanto segue:

  1. Registra il tipo di messaggio personalizzato
  2. Aggiungi una meta-scatola
  3. Recupera il contenuto per la meta-box e visualizza sia l'HTML che alcuni dati JSON
  4. Ascolta le richieste PUT e salva i dati nel database
  5. Salvare i nostri dati sulla meta-casella sulle normali azioni di "salvataggio"

Prima di scrivere i metodi, però, stiamo memorizzando alcune informazioni come proprietà di classe. Conserviamo queste informazioni nella parte superiore del nostro file di classe in modo che le modifiche siano più facili da effettuare in seguito. Il answerIds array contiene le chiavi che useremo in questo plugin per salvare i dati usando il built-in add_post_meta ().

Aggiungi le proprietà

 / ** src / WpQuiz.php ** / class WpQuiz // Nomi del tipo di post personalizzato public $ postTypeNameSingle = 'Question'; public $ postTypeNamePlural = 'Domande'; // Meta Box Stuff public $ metaBoxTitle = 'Answers'; public $ metaBoxTempl = 'templates / metabox.templ.php'; // Question Id's public $ answerIds = array ('quiz-a-1', 'quiz-a-2', 'quiz-a-3', 'quiz-a-4'); // Javascript public $ jsAdmin = '/js/admin.js'; 

Aggiungi il costruttore

  1. Per prima cosa registriamo il Custom Post Type usando un altro metodo helper (che verrà visto più avanti)
  2. Quindi stiamo registrando un hook per caricare la nostra meta-box
  3. Abbiamo anche bisogno di un metodo separato per accettare le nostre richieste Ajax
  4. Infine, quando viene caricata una pagina, vorremmo salvare le informazioni dalla nostra meta-scatola
 / ** src / WpQuiz.php ** / public function __construct ($ type) switch ($ type) case 'admin': // Registra il Post Type $ this-> registerPostType ($ this-> postTypeNameSingle, $ this -> postTypeNamePlural); // Aggiungi la Meta Box add_action ('add_meta_boxes', array ($ this, 'addMetaBox')); // Accetta una richiesta Ajax add_action ('wp_ajax_save_answer', array ($ this, 'saveAnswers')); // Watch for Post in fase di salvataggio add_action ('save_post', array ($ this, 'savePost')); 

Aggiungi la Meta Box

  1. Aggiungi i file JavaScript necessari per questo plugin - di nuovo usando un metodo di supporto (visto più avanti)
  2. Crea un ID univoco per questo plug-in in base al nome del tipo di post
  3. Aggiungi la meta-box usando le proprietà che abbiamo impostato in precedenza
 / ** src / WpQuiz.php ** / public function addMetaBox () // Carica il Javascript necessario su questa pagina di amministrazione. $ This-> addScripts (); // Crea un ID basato sul nome del post-tipo $ id = $ this-> postTypeNameSingle. '_Metabox'; // Aggiungi la meta box add_meta_box ($ id, $ this-> metaBoxTitle, array ($ this, 'getMetaBox'), // Ottieni il markup necessario $ this-> postTypeNameSingle); 

Ottieni il contenuto della Meta Box

Qui passiamo in rassegna i nostri ID di risposta e costruiamo un array che contiene post meta recuperato con il nostro metodo di supporto getOneAnswer. Creiamo questo nuovo array in modo che possiamo codificarlo e inviarlo al nostro modello in formato JSON, proprio come piace a Backbone. Noi inviare dati al nostro modello utilizzando il $ Viewdata array visto di seguito. Ciò mantiene tutto l'HTML fuori dai guai e ci consente di lavorarci su un file separato. Daremo una rapida occhiata al getTemplatePart metodo più avanti, ma se vuoi una spiegazione approfondita sul perché lo uso, ti preghiamo di controllare Migliorare il tuo flusso di lavoro - Separa il mark-up dalla tua logica!

 / ** src / WpQuiz.php ** / funzione pubblica getMetaBox ($ post) // Ottieni i valori correnti per le domande $ json = array (); foreach ($ this-> answerIds as $ id) $ json [] = $ this-> getOneAnswer ($ post-> ID, $ id);  // Imposta i dati necessari nel modello $ viewData = array ('post' => $ post, 'answers' => json_encode ($ json), 'correct' => json_encode (get_post_meta ($ post-> ID, 'correct_answer '))); echo $ this-> getTemplatePart ($ this-> metaBoxTempl, $ viewData); 

Ottieni una risposta singola - Helper

Stiamo solo restituendo una serie di dati necessari nel nostro modello. Puoi pensare a questo come alla creazione di un singolo modello che è necessario sul front-end.

 / ** src / WpQuiz.php ** / public function getOneAnswer ($ post_id, $ answer_id) return array ('answer_id' => $ answer_id, 'answer' => get_post_meta ($ post_id, $ answer_id, true)); 

Salva messaggio

Quando un utente fa clic per salvare un post in cui è presente la nostra meta-box, dobbiamo fare un paio di controlli per assicurarci di salvare il nostro Custom Post Type e che l'utente corrente abbia le autorizzazioni corrette - se entrambi i controlli sono ok, allora salva le quattro risposte dalla meta-box e la risposta corretta.

 / ** src / WpQuiz.php ** / public function savePost ($ post_id) // Verifica di salvare il nostro tipo di post personalizzato se ($ _POST ['post_type']! == strtolower ($ this-> postTypeNameSingle) )  ritorno;  // Controlla che l'utente abbia i permessi corretti se (! $ This-> canSaveData ($ post_id)) return;  // Accede ai dati da $ _POST globali e crea un nuovo array contenente // le informazioni necessarie per effettuare il salvataggio $ fields = array (); foreach ($ this-> answerIds as $ id) $ fields [$ id] = $ _POST [$ id];  // Passa attraverso il nuovo array e salva / aggiorna ogni foreach ($ campi come $ id => $ campo) add_post_meta ($ post_id, $ id, $ campo, vero); // o update_post_meta ($ post_id, $ id, $ campo);  // Salva / aggiorna la risposta corretta add_post_meta ($ post_id, 'correct_answer', $ _POST ['correct_answer'], true); // o update_post_meta ($ post_id, 'correct_answer', $ _POST ['correct_answer']); 

Salva le risposte dalle richieste Ajax

Qui è dove riceveremo i dati passati al server da Backbone. Abbiamo bisogno di:

  1. Accedi ai dati inviati come richiesta PUT. Come sarà nel formato JSON, abbiamo bisogno di decodificarlo
  2. Verifica nuovamente che l'utente corrente disponga delle autorizzazioni pertinenti
  3. Vai avanti e prova il salvataggio
  4. Se Add o Update ha avuto successo, possiamo semplicemente restituire i dati appena salvati e Backbone visualizzerà questo come un salvataggio riuscito
  5. Se nessuno dei due ha avuto successo, restituiamo 0 per indicare un errore
 / ** src / WpQuiz.php ** / public function saveAnswers () // Ottieni i dati PUT e decodificali $ model = json_decode (file_get_contents ("php: // input")); // Assicurati che questo utente abbia i permessi corretti se (! $ This-> canSaveData ($ model-> post_id)) return;  // Tentativo di un inserimento / aggiornamento $ update = add_post_meta ($ model-> post_id, $ model-> answer_id, $ model-> answer, true); // o $ update = update_post_meta ($ model-> post_id, $ model-> answer_id, $ model-> answer); // Se un salvataggio o un aggiornamento ha avuto esito positivo, restituire il modello in formato JSON se ($ update) echo json_encode ($ this-> getOneAnswer ($ model-> post_id, $ model-> answer_id));  else echo 0;  die (); 

I metodi di supporto

Ecco i quattro helper menzionati nei frammenti sopra.

  1. canSaveData () - Ciò garantisce solo che l'utente corrente disponga delle autorizzazioni pertinenti per modificare / aggiornare questo post.
  2. addScripts () - Nota che qui ci stiamo assicurando di passare il quinto param al wp_register_script () funzione. Questo caricherà il nostro JavaScript personalizzato nel piè di pagina e garantirà che i nostri dati JSON siano disponibili. Inoltre, se si utilizza l'editor di WordPress nel proprio plug-in, non è necessario specificare Backbone come dipendenza in quanto sarà già disponibile. Lo sto includendo qui per il gusto dell'esempio.
  3. registerPostType () - Questo è qualcosa che uso spesso nei plugin. Semplifica la vita aggiungendo un nuovo tipo di messaggio personalizzato. Accetta sia versioni singolari che plurali del nome perché non è sempre facile come aggiungere semplicemente una "s".
  4. getTemplatePart () - Non mi è mai piaciuto avere mark-up nei miei metodi. Questo piccolo aiuto consentirà l'uso di un file modello separato.
 / ** src / WpQuiz.php ** / / ** * Determina se l'utente corrente ha le autorizzazioni pertinenti * * @param $ post_id * @return bool * / private function canSaveData ($ post_id) if (defined ('DOING_AUTOSAVE ') && DOING_AUTOSAVE) restituiscono false; if ('page' == $ _POST ['post_type']) if (! current_user_can ('edit_page', $ post_id)) restituisce false;  else if (! current_user_can ('edit_post', $ post_id)) restituisce false;  return true;  private function addScripts () wp_register_script ('wp_quiz_main_js', pp (). $ this-> jsAdmin, array ('backbone'), null, true); wp_enqueue_script ('wp_quiz_main_js');  / ** * Registra un tipo di messaggio personalizzato * * @param $ single * @param $ plural * @param null $ supporta * / private function registerPostType ($ singolo, $ plural, $ supports = null) $ labels = array ( 'name' => _x ($ plural, 'nome generale del tipo di post'), 'singular_name' => _x ("$ single", 'post type singular name'), 'add_new' => _x ("Aggiungi New $ single "," $ singolo ")," add_new_item "=> __ (" Aggiungi nuovo $ singolo ")," edit_item "=> __ (" Modifica $ singolo ")," nuovo_item "=> __ (" Nuovo $ singolo ") , 'all_items' => __ ("All $ plural"), 'view_item' => __ ("Visualizza $ single"), 'search_items' => __ ("Cerca $ plural"), 'not_found' => __ ( "No $ plural found"), "not_found_in_trash" => __ ("No $ singolo trovato nel Cestino"), "parent_item_colon" => "," menu_name "=> $ plurale); $ args = array (" labels "= > $ labels, 'public' => true, 'public_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => true, 'capability_type' = > 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => nul l, 'supporta' => ($ supporta)? $ supporta: array ('title', 'editor', 'page-attributes')); register_post_type ($ single, $ args);  / ** * Rendering di un file di modello * * @param $ filePath * @param null $ viewData * @return string * / public function getTemplatePart ($ filePath, $ viewData = null) ($ viewData)? extract ($ viewData): null; ob_start (); include ("$ filePath"); $ template = ob_get_contents (); ob_end_clean (); return $ template; 

5. Accedere al front-end

A questo punto, abbiamo impostato tutto il necessario per il nostro back-end. È il momento di fare una pausa e prepararci per la prossima parte in cui andremo a fondo con i modelli lato client, JavaScript e Backbone.js. Spero di vederti lì - sarà bello.