Opprette enkeltsideapplikasjoner med WordPress og Angular.js

Hva du skal skape

Arbeidet med Angular.js-rammen er rask og givende, og kombinert med WordPress kan det skape et veldig hyggelig SPA (Enkelt søknad) på kort tid. Med alle CMS kontrollene og plugins WordPress tilbyr, er dette et interessant short-cut.

Sette opp temaet

Vi vil begynne å lage et nytt tema ved å bruke _tk boilerplate tema til å begynne med. Dette er en implementering av _s understreker tema fra Automattic, men med Twitter Bootstrap implementert.

Ta tak i temaet fra GitHub, og legg filene i din temaer katalogen:

$ cd-temaer $ wget https://github.com/Themekraft/_tk/archive/master.zip wp-content / themes / $ unzip master.zip Arkiv: master.zip 69acda231e2a2f8914374df81b89a7aa37d594fa opprette: _tk-master / inflating: _tk-master /404.php oppblåsing: _tk-master / archive.php oppblåsing: _tk-master / comments.php oppblåsing: _tk-master / content-page.php oppblåsing: _tk-master / content-single.php ... ## Gi nytt navn The Directory $ mv _tk-master / angular-bootstrap $ rm -f master.zip 

Nå som vi har _tk starter tema, vil vi trenge NPM pakker vinkel og vinkel-rute fra innsiden din tema katalog (vi bruker navnet vinkel-bootstrap).

$ cd wp-vinkel $ npm init #follow beskjedene for å lage din package.json-fil ... "forfatter": "", "lisens": "ISC" Er dette ok? (ja) ja ## Installer pakkene $ $ npm installer kantet vinkelrute - lagre 
  • Du må initialisere NPM innenfor temaet katalog med npm init for å opprette package.json, en fil som NPM bruker til å administrere prosjekter.
  • Ved å bruke --lagre flagg i vår npm installer vinklet vinkelrute - lagre kommando vi forteller NPM å legge til modulene som avhengigheter til prosjektet vårt.
  • I fremtiden, hvis vi trenger å dele prosjektet med en annen utvikler, trenger de bare å løpe npm installasjon i samme katalog som package.json for å få pakkene.

Nå har du pakkene i din node_modules katalog inni temaet ditt. Ta en titt i katalogen, og du vil kunne se flere js-filer. Vi skal bruke angular.min.js for utvikling

Initialiserer vinkel

Å inkludere angular.min.js inne i WordPress må vi endre functions.php fil slik at vi kan skrive inn skriptene i WordPress.

Inne i funksjoner.php, finn _tk_scripts () funksjon og legg til følgende til bunnen av funksjonen:

// Load angular wp_enqueue_script ('angularjs', get_template_directory_uri (). '/ Node_modules / angular / angular.min.js'); wp_enqueue_script ('angularjs-rute', get_template_directory_uri (). '/ node_modules / angular-route / angular-route.min.js'); wp_enqueue_script ('scripts', get_stylesheet_directory_uri (). '/js/scripts.js', array ('angularjs', 'angularjs-rute')); 

Du må også opprette JS / scripts.js-For nå bare opprett en tom fil.

Oppdater nå temaet ditt i en nettleser, og i utviklerverktøyene vil du kunne se angular.min.js inkludert nå.

Bruke Partials

Angular.js har et flott system for bare å oppdatere et delvis stykke HTML. Å dra nytte av dette og vinkel-rute modul, må vi opprette en katalog inne i temaet som heter partials.

$ mkdir partials 

Inne i partials katalog, opprett en fil som heter main.html for å teste, og legge til hva HTML du liker inne.

Lokaliser Partial-banen for WordPress

For Angular å kunne laste delene, må vi gi en fullstendig URL. Jeg hadde noen problemer med å bruke get_stylesheet_directory_uri () metode, men prøv det selv. Hvis det ikke virker, bruk din fullstendige nettadresse.

Legg til følgende i _tk_scripts funksjonen nedenfor hvor du la til angularjs og vinkel-rute linjer fra siste trinn:

// Med get_stylesheet_directory_uri () wp_localize_script ('skript', 'lokalisert', array ('partials' => get_stylesheet_directory_uri (). '/ Wp-innhold / temaer / vinkelstartstrap / partisjoner /')); 

Hvis dette mislykkes (som i skrivende stund var det for meg), skriv inn URL-adressen, f.eks.

// Med hardkodet verdi wp_localize_script ('scripts', 'localized', array ('partials' => 'http://www.mydomaind.com/wp-content/themes/angular-bootstrap/partials/')); 

Aktiverer WP-API

For Angular å jobbe med WordPress, må vi aktivere WP-API REST plugin. Dette er enkelt, da det bare er installasjonen av et plugin.

Last ned og installer pluginet fra git, og kjør følgende i din plugins dir:

git klone [email protected]: WP-API / WP-API.git json-rest-api 

Aktiver deretter pluginet i din wp-admin panel. Du vil kunne se JSON-utdata på your-wordpress.com/wp-json når den er aktivert.

Bygge ruter

Ruter utgjør de spesifikke sidene i bloggen din. Vi kan definere en for vår main.html Del nå - og konfigurer den til å bli vist på indekssiden til vår WordPress.

Først må du kontrollere at Angular.js-appen er definert via ng-app attributt og i header.php gjør følgende:

  ng-app = "wp">   

Her ringer vi appen wp med ng-app Egenskap. Også vi satte utgangspunkt merk så at Angular kan finne JSON vi har aktivert i WP-API.

Legg til følgende til JS / scripts.js:

angular.module ('wp', ['ngRoute']) .config (funksjon ($ routeProvider, $ locationProvider) $ routeProvider .when ('/', templateUrl: localized.partials + 'main.html' 'Main')) .controller ('Main', funksjon ($ omfang, $ http, $ routeParams) $ http.get ('wp-json / posts /'). Suksess .posts = res;);); 

Nå inne partials / main.html Legg til dette:

  • Post.title

Og til slutt inne index.php, rett etter get_header.php (), legg til Angular-attributtet ng-syn på en div stikkord.

Oppdater indeksen til WordPress, og en kolliste med blogginnleggene dine vil nå bli vist på hjemmesiden.

Dette skyldes ng-kontrolleren påkalle Hoved kontrolleren fra scripts.js og ng-syn Attributt angir hvor kantet skal gjengis.

Viser et innlegg etter slug

La oss legge til ruten nå for å vise en WordPress-blogg via URL-sluggen.

Åpen JS / scripts.js og juster filen slik at den leser som følger:

angular.module ('wp', ['ngRoute']) .config (funksjon ($ routeProvider, $ locationProvider) $ routeProvider .when ('/', templateUrl: localized.partials + 'main.html' 'Main'). Når ('/: slug', templateUrl: localized.partials + 'content.html', kontroller: 'Innhold') .Oversikt (redirectTo: '/';) .controller ('Main', funksjon ($ scope, $ http, $ routeParams) $ http.get ('wp-json / posts /'). Suksess (funksjon (res) $ scope.posts = res;); ) .controller ('Innhold', ['$ scope', '$ http', '$ routeParams', funksjon ($ omfang, $ http, $ routeParams) $ http.get ('wp-json / posts /? filter [name] = '+ $ routeParams.slug) .success (funksjon (res) $ scope.post = res [0];);]); 

Ved å legge til Innhold kontrolleren, kan vi spesifisere $ http.get URI for JSON innleggene, og angi slug som filterparameter.

For å opprette dette bruker vi følgende kode: $ http.get ('wp-json / posts /? filter [name] =' + $ routeParams.slug).

Merk: For å få tak i /: Slug ruteplanlegging, du må spesifisere /% Postname% / som din permalinkstruktur i wp-admin.

Pass på å stille inn content.html med følgende:

Post.title

Post.content

Nå, hvis du oppdaterer siden, vil du kunne navigere til blogginnleggene dine via koblingene i punktlisten du gjorde i forrige trinn.

Bruke kantetjenester i WordPress

Så langt har vi sett hvordan å skape ruter og begynne å jobbe med wp-json API. Før vi begynner å skrive noen logikk trenger vi et sted for det å gå, og det er innenfor en kantet service (i dette eksemplet bruker vi en Fabrikk service).

Opprett en ny fil JS / services.js og legg til følgende kode for å hente kategorier og innlegg:

 funksjon ThemeService ($ http) var ThemeService = kategorier: [], innlegg: [], sideTitle: 'Siste innlegg:', currentPage: 1, totalPages: 1, currentUser: ; // Sett sidetittelen i  tag-funksjon _setTitle (documentTitle, pageTitle) document.querySelector ('title'). innerHTML = documentTitle + '| AngularJS Demo Theme '; ThemeService.pageTitle = pageTitle;  // Oppsettpaginasjonsfunksjon _setArchivePage (innlegg, side, overskrifter) ThemeService.posts = posts; ThemeService.currentPage = side; ThemeService.totalPages = overskrifter ('X-WP-TotalPages');  ThemeService.getAllCategories = function () // Hvis de allerede er satt, trenger de ikke å få dem igjen hvis (ThemeService.categories.length) return;  // Få kategorivilkårene fra wp-json returnere $ http.get ('wp-json / taxonomies / category / terms'). Suksess (funksjon (res) ThemeService.categories = res;); ; ThemeService.getPosts = funksjon (side) return $ http.get ('wp-json / posts /? Page =' + side + '& filter [posts_per_page] = 1'). Suksess (funksjon (res, status, overskrifter)  ThemeService.posts = res; page = parseInt (side); // Kontroller sidevariabel for sunnhet hvis (isNaN (side) || side> overskrifter ('X-WP-TotalPages')) _setTitle ('Siden ikke funnet' 'Side ikke funnet');;) ellers // Behandle paginering hvis (side> 1) _setTitle ('Innlegg på siden' + side, 'Innlegg på siden' + side + ':'); else _setTitle 'Hjem', 'Siste innlegg:'); _setArchivePage (res, side, overskrifter);); ; returnere ThemeService;  // Endelig registrerer tjenesten app.factory ('ThemeService', ['$ http', ThemeService]); </pre> <p>Dette er et grunnleggende fabrikkoppsett, der vi har to interne funksjoner <code>_setTitle</code> og <code>_setArchivePage</code>. Disse metodene kalles fra <code>getPosts</code> og <code>getCategories</code> å oppdatere gjeldende sidetittel og også sette et internt tall for å vite hvilket sidnummer vi ser på.</p> <p>Vi må begynne å bruke <code>ngSanitize</code> modul for parsing innganger til vår tjeneste. Installer dette med <code>NPM</code> som så inne i temakatalogen din:</p> <pre>$ npm installer vinkel-sanitize - save </pre> <p>De <code>ThemeService</code> er bare et grunnleggende JavaScript-objekt som utfører en kategorioppslag via <code>$ http.get</code>, som det er <code>getPosts</code> metode. Vi vil nå gjøre kontrolløren oppmerksom på denne tjenesten. Åpen <code>scripts.js</code> og endre kontrolleren for å være oppmerksom på <code>ThemeService</code>.</p> <pre>// Hovedkontroller app.controller ('Main', ['$ scope', '$ http', 'ThemeService', funksjon ($ omfang, $ http, ThemeService) // Få kategorier fra ThemeService ThemeService.getAllCategories (); // Få den første siden av innlegg fra ThemeService ThemeService.getPosts (1); $ scope.data = ThemeService;]); </pre> <p>Ikke glem å aktivere <code>vinkel-oppryddings</code> modulen inne i din <code>scripts.js</code> også på første linje med:</p> <pre>var app = angular.module ('wp', ['ngRoute', 'ngSanitize']); </pre> <p>Til slutt må du sikre <code>JS / services.js</code> er enqueued i WordPress, så vel som <code>vinkel-oppryddings</code> modul. Gjør det ved å endre <code>functions.php</code> fil og legg til følgende før <code>wp_localize_script</code> anrop:</p> <pre>wp_enqueue_script ('angularjs-sanitize', get_stylesheet_directory_uri (). '/node_modules/angular-sanitize/angular-sanitize.min.js'); wp_enqueue_script ('theme-service', get_stylesheet_directory_uri (). '/js/services.js'); </pre> <p>Nå må vi oppdatere <code>main.html</code> delvis for å vise disse kategoriene som tilbys av ThemeService.</p> <pre><h1>kategorier</h1> <ul> <li ng-repeat="category in data.categories"> <span ng-if="current_category_id && category.ID == current_category_id" ng-bind-html="category.name"></span>  </li> </ul> <p>Data.pageTitle</p> <ul> <li ng-repeat="post in data.posts">  <img ng-src="post.featured_image_thumbnail_url" alt="Post.featured_image.title.rendered" /> <div ng-bind-html="post.excerpt.rendered"></div> </li> </ul> </pre> <p>Du vil nå kunne se dine innlegg og kategorier som vises på hjemmesiden din via <code>ng-syn</code> bruker en <code>fabrikk</code> service for kantet. Fordelen med dette er at alle komponenter vil ha dataene tilgjengelige for dem. Så vi kan nå dele kategoribjektet mellom alle våre kontrollører i våre ruter.</p> <h2>Tar ting videre</h2> <p>Nå som vi har en tjeneste satt opp for vårt tema, kan vi fortsette å utvikle datalaget og inkorporere Bootstrap styling i den returnerte HTML.</p> <p>Mulighetene nå når Angular er konfigurert i temaet ditt, er virkelig endeløs, og ved å sjekke ut lagret som er oppgitt, vil du få et raskt utgangspunkt for å lage Angular- og Bootstrap-aktiverte enkeltsidede WordPress-programmer.</p>


<div class="rek-block">
	<center>	
			<ins class="adsbygoogle"
			style="display:inline-block;width:580px;height:400px"
			data-ad-client="ca-pub-3810161443300697"
			data-ad-slot="9434875811"></ins>
	   <script>
	   (adsbygoogle = window.adsbygoogle || []).push({});
	   </script>
	</center>
</div>


<div class="h-alltags">
<a href="articles/code">Kode</a>
</div>

		</div>

</div>
</div>




</div>


<div class="next_posts clearfix">
	<div class="n_post">
        
		<div class="next_posts-h1 left_nh1"><a href="/articles/music/creating-skrillex-style-tech-basslines-in-ni-massive-adjusting-parameters.html">Opprette Skrillex Style Tech Basslines i NI Massive - Justere Parametre</a></div>
			
			<div class="next_posts-img" style="background-image: url('//accentsconagua.com/img/images_24/creating-skrillex-style-tech-basslines-in-ni-massive-adjusting-parameters_3.jpg');"></div>	
			
        				
	</div>		
	<div class="n_post">
        
		<div class="next_posts-h1 right_nh1"><a href="/articles/design/creating-simple-origami-style-typography-in-illustrator.html">Opprette Simple Origami Style Typography i Illustrator</a></div>
			
			<div class="next_posts-img" style="background-image: url('//accentsconagua.com/img/images_26_1/creating-simple-origami-style-typography-in-illustrator_23.jpg');"></div>
					
        
	</div>
</div>


<footer>
	<div class="container">
			<div class="footer-langs">
					<ul class="site-langs-list">
							<li><a href="https://www.accentsconagua.com"><i class="flag flag-DE"></i>Deutsch</a></li>					
							<li><a href="https://fr.accentsconagua.com"><i class="flag flag-FR"></i>Français</a></li>
							<li><a href="https://nl.accentsconagua.com"><i class="flag flag-NL"></i>Nederlands</a></li>
							<li><a href="https://no.accentsconagua.com"><i class="flag flag-NO"></i>Norsk</a></li>
							<li><a href="https://sv.accentsconagua.com"><i class="flag flag-SE"></i>Svenska</a></li>
							<li><a href="https://it.accentsconagua.com"><i class="flag flag-IT"></i>Italiano</a></li>
							<li><a href="https://es.accentsconagua.com"><i class="flag flag-ES"></i>Español</a></li>
							<li><a href="https://ro.accentsconagua.com"><i class="flag flag-RO"></i>Românesc</a></li>
					</ul>
				</div>
				
			<div class="h-block"><a href="/">no.accentsconagua.com</a><div class="h-block-a"></div></div>
			<div class="footer-text">
				Interessant informasjon og nyttige tips om programmering. Nettstedutvikling, webdesign og webutvikling. Photoshop opplæringsprogrammer. Opprettelse av dataspill og mobile applikasjoner. Bli en profesjonell programmerer fra grunnen av.
			</div>
	</div>
</footer>

<div class="search">
	<img class="searchico" src="//accentsconagua.com/img/search.svg" alt="">
</div>
	<div class="modal">
			<div class="modal-content">
							<span class="close-button">×</span>

							<input class="searchmain" type="text" id="search-input" placeholder="Søke...">
							<ul class="searchli" id="results-container"></ul>

						</div>
</div>


<link rel="stylesheet" href="css/flags.css">

<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" />
<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script>
<script>
window.addEventListener("load", function(){
window.cookieconsent.initialise({
"palette": {
  "popup": {
	"background": "#edeff5",
	"text": "#838391"
  },
  "button": {
	"background": "#4b81e8"
  }
},
"theme": "classic",
"position": "bottom-right"
})});
</script>


	<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
	<script src="js/scripts.min.js"></script>	
	<script src="js/common.js"></script>
	<link rel="stylesheet" href="css/fontawesome-all.min.css">

	<script>
			var modal = document.querySelector(".modal");
			var trigger = document.querySelector(".search");
			var closeButton = document.querySelector(".close-button");

			function toggleModal() {
						modal.classList.toggle("show-modal");
			}

			function windowOnClick(event) {
						if (event.target === modal) {
										toggleModal();
						}
			}

			trigger.addEventListener("click", toggleModal);
			closeButton.addEventListener("click", toggleModal);
			window.addEventListener("click", windowOnClick);
</script>



    <script src="https://unpkg.com/simple-jekyll-search@1.5.0/dest/simple-jekyll-search.min.js"></script>

<script>
        SimpleJekyllSearch({
          searchInput: document.getElementById('search-input'),
          resultsContainer: document.getElementById('results-container'),
          json: '/search.json',
          searchResultTemplate: '<li><a href="{url}">{title}</a></li>'
        })
</script>

<script src="jquery.unveil2.min.js"></script>
<script>
	$('img').unveil();
</script>

</body>
</html>