För att starta ett billigt globalt nätverk av webbplatser som drivs av volontärer som skulle ge kunder kategoriserade kataloger till lokala butiker, behövde jag utnyttja kraften i WordPress med några ovanliga anpassningar och lösningar. Det finns ett antal tillvägagångssätt för att ge lokala erfarenheter med WordPress. I denna handledning ska jag visa dig varför och hur vi bestämde oss för att göra en anpassad lösning.
I juli lanserade jag en global guide till internetbaserade alternativ till shopping på Amazon som heter FleetheJungle.com och svaret var utmärkt. Vi fick mycket mediedekning och efterföljande trafik. Det är inte en databasdriven app; I stället utnyttjade vi det utestående KnowHow kunskapsbaset:
Men för att odla webbplatsen behövde vi erbjuda geolokala versioner för enskilda städer. Visst den globala webbplatsen hjälper besökare att avbryta sina primära medlemskap eller hitta alternativ till Kindle böcker men det fanns inget för att uppmuntra människor att stödja småföretag i sina samhällen.
Till att börja med skulle vi bygga en guide för lokala shoppare i närliggande Portland, en stad med ett stolt arv av knäppa, oberoende småföretag.
Kredit: Skog och vinkar Portland Karta av Edward Juan.Säkert har jag skrivit tillräckligt om att snabbt starta en mängd WordPress-webbplatser med hjälp av förkonfigurerade, föroptimerade recept, men upprätthållande av relaterade krav för ett nätverk kan vara extremt tidskrävande - saker som att hantera SEO, WordPress och plugin-uppgraderingar, etc.
Jag betraktade också WordPress Multisite men även om jag vet hon är växt mycket, vi hade ett antal besvärliga svåra parningar och var nog inte tänkt att vara tillsammans. När du är engagerad med "henne" är det väldigt svårt att bryta upp.
Jag behövde en enklare lösning.
I denna handledning guidar jag dig genom anpassningar och tricks jag använde med WordPress och mitt kunskapsbaserat tema för att starta vår Portland shoppingguide och göra det enkelt att starta ett antal andra städer - samtidigt som man undviker överhanteringen av att hantera dussintals eller hundratals webbplatser.
Här är några av de grundläggande kraven för att starta fler webbplatser:
1. Underhålla en världsomspännande webbplats. Jag ville behålla den globala, fleethejungle.com primära domänen intakt, fri från lokala artiklar, men istället en guide till våra lediga städer.
2. Lokalisera efter deldomän. Jag ville ha innehåll lokaliserat av deldomän. Ett besök på http://portland.fleethejungle.com skulle till exempel främja lokalt innehåll på webbplatsen och återanvända vissa specifika nationella sidokategorier relaterade till shopping på det bredare Internet, t.ex. videostreaming (det finns inget Portland-baserat alternativ till HBO Now). CraigsList ger en bra modell för detta.
3. Integration mellan lokala och globala. Jag ville ge lokala besökare en förklaring av skillnaderna mellan deras lokala webbplats och den globala webbplatsen samtidigt som de uppmuntrar dem att delta i att hjälpa till att förbättra listorna i deras stad.
4. volontär förvaltade. Jag ville göra det enkelt att regelbundet lägga till städer på webbplatsen på ett sätt som bara skulle kräva volontärer med grundläggande bloggar att starta och underhålla. Det finns för många krav att lansera nya WordPress-webbplatser för varje enskild stad för att enkelt göra det med volontärer.
5. Minimalt underhåll. Slutligen ville jag behålla underhållet av webbplatsnätet så enkelt som att köra en enda webbplats.
Låt oss undersöka några av de tekniska metoder som ofta används för att hantera dessa krav.
För innehållshantering finns det tre grundläggande tillvägagångssätt som jag tänkte på:
Som jag sa tidigare är jag inte en fan av Multisite och jag ville undvika komplexiteten att starta och behålla en mängd olika WordPress-webbplatser. En webbplats som Flee the Jungle skulle ha så mycket centralt innehåll som skulle behöva återanvändas över stadssidor (till exempel hur man avslutar ditt Prime-medlemskap) och jag behövde inte behålla detta innehåll på olika WordPress-installationer -eller skriv kod för att göra det.
Jag bestämde mig för att filtrera innehållet beroende på domän eller underdomän som användaren använde i webbläsaren.
Om du har läst min handledning Hur man använder Zillow Neighborhood Maps och HTML5 Geolocation, vet du hur man använder HTML5-baserad geolocation för att bestämma var en användare är. Jag ville dock att användaren skulle ha mer kontroll.
Jag ville att användaren skulle använda en underdomän som den som har arbetat i åratal med CraigsList för att styra dem till sin stad.
Men WordPress dominion över absoluta webbadresser gör det svårt. När jag började experimentera med att spåra den inkommande deldomänen för en stad och kartlägga den till länkar på sidan, sprang jag in i WordPress vana att skapa absoluta länkar nästan överallt. En kollega jag pratade med om det skrattade omedelbart när jag frågade honom om det - det är en vanlig fiende för WordPress-utvecklare.
I den här handledningen delar jag anpassningarna inom våra temas PHP-baserade frågor för att bygga våra stadsbaserade webbplatser och hur vi slutligen arbetade kring det absoluta webbadressproblemet.
Så här bestämde jag mig för att genomföra stadsbaserade webbplatser för Flee the Jungle som lätt kan underhållas och författas av lokala bloggare utan ytterligare tekniska färdigheter.
Artiklar skrivna för städer skulle vara märkta med stadens namn, t.ex. "portland". Artiklar på den globala webbplatsen skulle vara märkta "worldwide". Jag ville ha möjlighet att inkludera världsomspännande artiklar om internetbaserade butiker för vissa kategorier där det var mindre effektivt lokalt stöd som video streaming. Andra kategorier är verkligen lämpliga för att fokusera exklusivt på lokala butiker som livsmedelsbutiker, bilhandlare och leksaksaffärer.
För geolokala platser håller vi världskategorierna på plats och visar bara olika artiklar för de lokalt lämpliga kategorierna. I framtiden lägger vi över hela världen artiklar till de lokala valen inom en kategori när det är lämpligt.
När besökare visar kategori sidor och sökning filtrerar och anpassar vi även resultaten utifrån dessa designval.
För att göra detta definierar vi arrayer inom temat med deras ID:
Här är några exempel. Först här är mitt utbud av globala (icke-lokala) kategori ID:
// Kategori ID-er som är över hela världen, digitala för att visas utan ändringar // t.ex. Komma igång, Prime och leendealternativ, Streaming Media, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195];
Du kan hämta dem från att titta på kategoridokumentet i kategorin för instrumentpanelen (genom att sväva med musen över kategorinavnet som visas nedan med taggar):
Eller rediger kategorin och ta tag i ID-en från redigeringsadressen (Komma igång är 29):
Här är tagg-ID för Seattle och Portland:
// Tag-ID för stadsnamn t.ex. Seattle, Portland $ known_cities = array (49,211);
Seattle är 49. Du kan se taggen id genom att sväva över staden och låta statusfältet avslöja det:
För att få domänen eller deldomänen använde jag Trevor Scotts WordPress-tips och placerade den i mitt temas funktioner.php.
Här är WordPress Dashboard Theme Editor:
Och här är Trevors kod:
/ ** * @ författare Trevor Scott* @version 1.0 2010-12-07 * https: //wordpress.org/support/topic/how-do-i-get-sub-domain-name * Ta tag i underdomändelen av webbadressen. Om det inte finns någon domän, skickas rot * -domänen tillbaka. Som standard returnerar den här funktionen * värdet som en * -sträng. Ringa funktionen med echo = true skriver svaret direkt på * skärmen. * * @param bool $ echo * / funktion arrested_subdomain ($ echo = false) $ hostAddress = explodera ('.', $ _SERVER ["HTTP_HOST"]); om (is_array ($ hostAddress)) if (eregi ("^ www $", $ hostAddress [0])) $ passBack = 1; annars $ passBack = 0; om ($ echo == false) returnera ($ hostAddress [$ passBack]); annars echo ($ hostAddress [$ passBack]); annars returnera (false);
När besökare anländer till den globala hemsidan kommer domänen att vara fleethejungle.com snarare än en deldomän. Jag har skapat en annan funktion, configure_geolocal ()
, som kallas i början av mallen header.php-filen. Här är den första delen av funktionen:
funktion configure_eolocal () global $ nonlocal_category_ids; globala $ known_cities; global $ domain_locale; global $ logo_image_url; // Tag-ID för stadsnamn t.ex. Seattle, Portland $ known_cities = array (49,211); // Kategori ID-er som är över hela världen, digitala för att visas utan ändringar // t.ex. Komma igång, Prime och leendealternativ, Streaming Media, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195]; $ domain_locale = arrested_subdomain (); om ($ domain_locale == 'www' eller $ domain_locale == 'fleethejungle') $ domain_locale = false;
Så här heter det av det get_header ()
inom tematets header.php:
>
När domänen är global, $ domain_locale
kommer att vara falskt. Under dessa omständigheter kommer jag att utesluta artiklar märkta lokalt av städer. Och det gör jag på hemsidan och kategorisidan. När domänen hänvisar till en lokal stad, $ domain_locale
kommer att representera prefixet, t.ex. seattle eller portland.
På temat hemsida, om besökaren är på världsomspännande webbplats (root-domän), utesluter jag artiklar som taggats med städer från $ st_cat_post_args
array. Om besökaren är på en stadssida och underdomänen är känd, visar vi bara lokala artiklar i de flesta kategorier utom de som identifierats för nonlocal_category_ids-det är de som är mer lämpliga för icke-lokalt innehåll, t.ex. video-streaming:
globala $ known_cities; globala $ nonlocal_category_ids; global $ domain_locale; om ($ domain_locale === false) // root besök $ st_cat_post_args ['tag__not_in'] = $ known_cities; annan // lokala stad visas men inkluderar globala artiklar i den här kategorin om (in_array ($ st_category-> term_id, $ nonlocal_category_ids) $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale, 'worldwide'); // visa bara lokala artiklar $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale);
Här är koden inom ramen för mer av funktionen:
// Lista inlägg $ st_cat_post_num = of_get_option ('st_hp_cat_postnum'); $ st_posts_order = of_get_option ('st_hp_cat_posts_order'); global $ post; // Om visa inlägg är 0 gör ingenting om ($ st_cat_post_num! = 0) // Listad av populära? om $ st_posts_order == 'meta_value_num') $ st_cat_post_args = array ('numberposts' => $ st_cat_post_num, 'orderby' => $ st_posts_order, 'meta_key' => '_st_post_views_count', 'category__in' => $ st_category-> term_id); else $ st_cat_post_args = array ('numberposts' => $ st_cat_post_num, 'orderby' => $ st_posts_order, 'category__in' => $ st_category-> term_id); globala $ known_cities; globala $ nonlocal_category_ids; global $ domain_locale; om ($ domain_locale === false) // root besök $ st_cat_post_args ['tag__not_in'] = $ known_cities; annan // lokala stad visas men inkluderar globala artiklar i den här kategorin om (in_array ($ st_category-> term_id, $ nonlocal_category_ids) $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale, 'worldwide'); // visa bara lokala artiklar $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale); $ st_cat_posts = get_posts ($ st_cat_post_args); echo '
Med KnowHow-temat kan besökare också klicka på rubrikrubrikerna och ta dem till en artikellista inom kategorin.
Om de är på den globala sidan vill jag bara visa globala artiklar. Jag valde att märka alla globala artiklar som "över hela världen" för att underlätta detta.
Så för den globala sidan visar jag bara artiklar taggade "över hela världen" och för lokala stadssidor, visar jag bara artiklar taggade för den staden. Om kategorin är ett exceptionellt fall för båda, inkluderar vi artiklar från både den nuvarande staden och hela världen.
Här är koden inom temat kategorin .php:
Jag anpassar inte frågan här eftersom prestanda för närvarande inte är en viktig fråga. Jag hoppar bara över resultat ur sammanhang och inte visar dem.
I framtiden kan jag anpassa detta vidare för stadssidor genom att visa globala resultat längst ner på kategorisidan i en distinkt sektion.
Det är också viktigt att utföra dessa typer av anpassningar för sökning. KnowHow-temat ger ett AJAX-sökresultat eller en genererad sida med resultat. Vi måste ange kod för att anpassa varje alternativ.
Live AJAX-sökning
För direktsökning finns det ingen get_header ()
ring så vi måste konfigurera vår plats dynamiskt:
Då integrerar vi samma logik som används på kategorisidorna inom levande sökresultat:
// kolla om en av dess kategorier är uteslutna från lokala $ category_excluded = false; foreach ((get_the_category ()) som $ kategori) om (in_array ($ category-> cat_ID, $ GLOBALS ['nonlocal_category_ids'])) $ category_excluded = true; ha sönder; om $ GLOBALS ["domain_locale"]! == false && has_tag ($ GLOBALS ["domain_locale"]) || ($ category_excluded && has_tag ('worldwide')))
Dynamisk sökresultat sida
Om det inte är AJAX, då get_header ()
kallas för oss och det är lite enklare:
cat_ID, $ GLOBALS ['nonlocal_category_ids']))) $ category_excluded = true; ha sönder; om $ GLOBALS ["domain_locale"]! == false && has_tag ($ GLOBALS ["domain_locale"]) || ($ category_excluded && has_tag ('worldwide'))) get_template_part ('content', get_post_format ); annat om ($ GLOBALS ["domain_locale"] === false && has_tag ("worldwide")) get_template_part ('content', get_post_format ()); ?>
Som jag nämnde ovan för kategorier kan jag bestämma mig för att anpassa sökresultat för att visa en andra del av resultaten för globala artiklar på stadens webbplatser.
För att ge besökare en förklaring till skillnaderna mellan deras lokala webbplats och den globala webbplatsen och uppmuntra dem att delta i att förbättra listorna i deras stad, använde jag ett plugin jag skrev om i januari 2015 för Envato Tuts +: Fördelarna med att använda Gratis kortkortsplugin. Det är ett plugin som låter dig använda makron i huvudsak för att expandera återanvändbart HTML-innehåll på plats. För varje stadsartikel använder vi den för att anpassa vad lokala besökare ser när de kommer från Portland.
När pluginet installerades skapade jag en kortnummer för varje stad, till exempel [Sc: pdx] som ger en enkel blurb längst upp på lokala artikelsidor:
Då, när vi lagt till en lokal artikel, inkluderade vi kortnummeret [Sc: pdx] på toppen:
Så här ser artikeln ut när besökare anländer:
Jag är en långsiktig användare av Digital Ocean men jag blir också en mer entusiastisk fan av WP Engine också; välskött hosting ger fördelar under vissa omständigheter. Det visade sig att WP Engine erbjöd en lösning på det absoluta URL-problemet för WordPress som var bättre än alternativ.
WP Engine erbjuder ett efterbehandlingsfilter där du kan använda reguljära uttryck för att ändra kod. Efter att ha övervägt andra metoder för att modifiera WordPress och använda egna API för detta beslutade jag att det skulle vara enklast att helt enkelt ersätta absoluta länkar till FleeTheJungle.com med relativa adresser. Detta gjorde det möjligt för användare som besöker en stadsbaserad deldomän att ligga inom den geolokala webbplatsen:
Innan du konfigurerade detta hade besök på Portland Flee the Jungle-underdomän utgående länkar till den globala fleethejungle.com spridda över sidor. Efter att ha konfigurerat det var utgående länkar i överensstämmelse med den inkommande domänen eller deldomänen.
I huvudsak använde jag efterbehandlingsfiltret för att eliminera absoluta webbadresser och tillåta webbläsarens URL och relativa adresser för att köra navigering.
För att ge en katalog över de städer där Flee the Jungle är och skulle bli tillgänglig byggde jag en sida där städerna skulle kunna hoppa över globala användare. Jag använder det också för att locka volontärer att starta webbplatser för sina städer.
Här är den sista koden vi använde inom WordPress för configure_geolocal ():
funktion configure_eolocal () global $ nonlocal_category_ids; globala $ known_cities; global $ domain_locale; global $ logo_image_url; // Tag-ID för stadsnamn t.ex. Seattle, Portland $ known_cities = array (49,211); // Kategori ID-er som är över hela världen, digitala för att visas utan ändringar // t.ex. Komma igång, Prime och leendealternativ, Streaming Media, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195]; $ domain_locale = arrested_subdomain (); om ($ domain_locale == 'www' eller $ domain_locale == 'fleethejungle') $ domain_locale = false; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-global.gif'; annars om ($ domain_locale == 'pdx' eller $ domain_locale == 'portland') $ domain_locale = 'portland'; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-portland.gif'; annars om ($ domain_locale == 'sea' eller $ domain_locale == 'seattle') $ domain_locale = 'seattle'; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-seattle.gif'; annan // okänd stad - omdirigera wp_redirect ('http://fleethejungle.com/cities'); utgång;
Naturligtvis ville jag genomföra grundläggande anpassning av logotypen beroende på underdomänen. KnowHow-temat stöder inte detta nationellt.
Om du märker i finalen configure_geolocal ()
kod, ställde jag in ett mediebibliotekets URL för logotyperna för varje stad.
Då anpassar koden inom header.php tematlogotypens URL baserat på domänen här:
"href =""> ">
WP Engines domänkartläggning kan vara lite förvirrande för de oinitierade. Du måste lägga till domäner för din webbplats och kartlägga dem på WP Engines interna adresseringssystem. Om du vill att deldomäner ska fungera korrekt måste du individuellt konfigurera varje deldomän från WP Engine-domänens instrumentpanel.
Det tog mig en liten stund att räkna ut. Här lägger jag till en platshållare ankomst sida för San Francisco, som kan nås av sanfrancisco.fleethejungle.com eller sfbay.fleethejungle.com. WP Engine gör det enkelt att ställa in dessa omdirigeringar:
Här är en preliminär bild av domäner som är konfigurerade för globala och lokala Flee the Jungle:
Tyvärr, städer som du inte explicit lägger till omdirigering till ett 404-fel vid WP Engine. Det finns andra sätt att arbeta kring detta, men för tillfället lägger jag bara till större städer i konfigurationen där. Människor kommer i allmänhet att riktas till den globala hemsidan eller en befintlig stad, därifrån kan de frivilligt starta sin egen stad.
Googles interna sökmotoroptimering är välkänd för att vara ganska hemlig, men mycket av referraltrafiken som din webbplats mottar beror på den.
Några av våra innehåll kommer att visas på flera domäner, men mycket av det kommer att vara distinkt beroende på vilken stad vi surfar. Google gillar inte att se samma innehåll på flera webbplatser, men det är också bra att indexera deldomäner separat.
Uppriktigt sagt har jag ingen aning om hur Flee the Jungle geolokala nätverksmodell kommer att tas emot och rankas inom sin stora supercomputing megaplex. Detta är en lägre prioritet för mig just nu. Grunden för Flee the Jungle's trafik är gräsrotsstöd och social delning.
Vänligen jämföra skillnaderna i innehåll mellan hela världen, Flee the Jungle och Portlands lokala stadssida:
Visst, det finns ett antal sätt att jag kunde ha närmat utmaningen att skapa geolokala platser. Flee the Jungle är dock en volontäransträngning. Jag behövde en lösning som skulle vara enkel och snabb samtidigt som det var enkelt att lägga till städer och utnyttja bloggare som volontärer. Tillvägagångssättet jag har beskrivit har uppnått dessa mål snabbt.
Resultatet av all denna anpassning är att vi har en enda WordPress-installation som kan köra hundratals geografiska variationer på vår webbplats, med globalt och lokalt innehåll som är korrekt filtrerat och organiserat. Viktigast, volontärer kan bygga och starta städer med bara grundläggande färdigheter i en WordPress blogger. Detta är så mycket enklare och snabbare än min "vän" WordPress multisite eller köra separata installationer. Framtiden är relativt obegränsad.
Jag hoppas att du har haft den här handledningen och skulle njuta av att höra hur du kunde ha kontaktat den här utmaningen. Om du vill starta en handledning för din egen stad, kontakta oss. Om du är intresserad av att bygga en webbplats så här har jag skrivit en detaljerad steg för steg handledning för att bygga upp din egen kunskapsbas webbplats på WordPress. Låt oss säga att du vill starta din egen Harry Potter fan-webbplats - det är en enkel guide för att komma igång.
Var snäll och posta dina frågor och kommentarer nedan. Du kan också kontakta mig på Twitter @ reifman eller maila mig direkt. Du kan också bläddra i min Envato Tuts + instruktörssida för att se andra handledning som jag har skrivit.