Om een goedkoop wereldwijd netwerk van sites te lanceren die worden gerund door vrijwilligers die gecategoriseerde mappen door consumenten aan lokale winkels zouden aanbieden, moest ik de kracht van WordPress gebruiken met een aantal ongewone aanpassingen en oplossingen. Er zijn een aantal manieren om lokale ervaringen met WordPress aan te bieden. In deze zelfstudie laat ik je zien waarom en hoe we hebben besloten om een oplossing op maat te maken.
In juli lanceerde ik een wereldwijde gids voor internetgebaseerde alternatieven voor winkelen bij Amazon genaamd FleetheJungle.com en het antwoord was uitstekend. We ontvingen veel media-aandacht en daaropvolgend verkeer. Het is geen databasegestuurde app; in plaats daarvan hebben we gebruikgemaakt van het uitstekende KnowHow-kennisbasisthema:
Maar om de site te laten groeien, moesten we geolocal-versies bieden voor individuele steden. De wereldwijde site helpt bezoekers zeker hun prime-lidmaatschap te annuleren of alternatieven te vinden voor Kindle-boeken, maar er was niets om mensen aan te moedigen om kleine bedrijven in hun gemeenschap te ondersteunen..
Om te beginnen zouden we een gids voor lokale kopers in het nabijgelegen Portland bouwen, een stad met een trotse erfenis van eigenzinnige, onafhankelijke kleine bedrijven.
Credit: Forest and Waves Portland Map door Edward Juan.Zeker, ik heb genoeg geschreven over het snel lanceren van een overvloed aan WordPress-websites met behulp van vooraf geconfigureerde, vooraf geoptimaliseerde recepten, maar het onderhouden van gerelateerde vereisten voor een netwerk kan zeer tijdrovend zijn, zoals het beheren van SEO, WordPress en plug-in-upgrades, enz..
Ik heb ook WordPress Multisite overwogen, maar ook al weet ik dat zij is veel gegroeid, we hadden een aantal ongemakkelijke moeilijke combinaties en waren waarschijnlijk nooit bedoeld om samen te zijn. Als je eenmaal met 'haar' bezig bent, is het heel moeilijk om uit elkaar te gaan.
Ik had een eenvoudiger oplossing nodig.
In deze zelfstudie zal ik je helpen met het aanpassen van de trucjes die ik heb gebruikt met WordPress en mijn kennisdatabase om onze Portland-winkelgids te lanceren en het gemakkelijk maken om een willekeurig aantal andere steden te lanceren - zonder de overhead van het beheer van tientallen of honderden plaatsen.
Hier zijn enkele van de basisvereisten voor het lanceren van meer sites:
1. Onderhoud een wereldwijde site. Ik wilde het globale, fleethejungle.com primaire domein intact houden, vrij van lokale artikelen maar in plaats daarvan een gids voor onze beschikbare steden.
2. Lokaliseren op subdomein. Ik wilde inhoud gelokaliseerd op subdomein. Een bezoek aan http://portland.fleethejungle.com zou bijvoorbeeld lokale inhoud op de site promoten, terwijl bepaalde specifieke nationale sitecategorieën met betrekking tot winkelen op het bredere internet, bijv. videostreaming (er is geen alternatief op basis van Portland voor HBO Now). CraigsList biedt hiervoor een goed model.
3. Integratie tussen lokaal en wereldwijd. Ik wilde lokale bezoekers uitleg geven over de verschillen tussen hun lokale site en de wereldwijde site, en hen aanmoedigen om deel te nemen aan het verbeteren van de vermeldingen in hun stad..
4. Vrijwilligers-managed. Ik wilde het gemakkelijk maken om regelmatig steden aan de site toe te voegen op een manier die alleen vrijwilligers met basisblogvaardigheden vereist om te starten en te onderhouden. Er zijn te veel vereisten om nieuwe WordPress-sites te lanceren voor elke individuele stad om dit eenvoudig met vrijwilligers te doen.
5. Minimaal onderhoud. Ten slotte wilde ik het onderhoud van het sitenetwerk zo eenvoudig houden als het runnen van een enkele site.
Laten we enkele technische benaderingen verkennen die vaak worden gebruikt om dit soort vereisten aan te pakken.
Voor inhoudsbeheer zijn er drie basisbenaderingen waar ik aan dacht:
Zoals ik al zei, ben ik geen fan van Multisite en wilde ik de complexiteit van het lanceren en onderhouden van verschillende WordPress-sites vermijden. Een site als Flee the Jungle zou zoveel centrale inhoud bevatten dat deze opnieuw zou moeten worden gebruikt op stadspagina's (zoals hoe je je Prime-lidmaatschap moet beëindigen), en ik wilde deze inhoud niet bij verschillende WordPress-installaties onderhouden - of schrijf code om dit te doen.
Ik besloot om de inhoud te filteren, afhankelijk van het domein of subdomein dat door de bezoeker in de browser wordt gebruikt.
Als u mijn zelfstudie Hoe u Zillow-buurtkaarten en HTML5-geolocatie gebruikt, hebt gelezen, weet u hoe u op HTML5 gebaseerde geolocatie kunt gebruiken om te bepalen waar een gebruiker zich bevindt. Ik wilde echter dat de gebruiker meer controle had.
Ik wilde dat de gebruiker een subdomein zou gebruiken zoals het jaar dat met CraigsList werkte om hen naar hun stad te leiden.
Maar de heerschappij van WordPress over absolute URL's maakt dit moeilijk. Toen ik voor het eerst experimenteerde met het volgen van het inkomende subdomein voor een stad en het toewijzen aan links op de pagina, zag ik WordPress's gewoonte om bijna overal absolute links te maken. Een collega waar ik het over had, lachte meteen toen ik hem ernaar vroeg - het is een veel voorkomende vijand van WordPress-ontwikkelaars.
In deze zelfstudie deel ik de aanpassingen binnen de op PHP gebaseerde query's van ons thema om onze in de stad gevestigde sites te bouwen en hoe we uiteindelijk werkten aan het absolute URL-probleem.
Hier is hoe ik besloot om stad-gebaseerde sites te implementeren voor Flee the Jungle die gemakkelijk kunnen worden onderhouden en geschreven door lokale bloggers zonder extra technische vaardigheden.
Artikelen geschreven voor steden worden gelabeld op plaatsnaam, bijvoorbeeld "Portland". Artikelen voor de wereldwijde site worden 'wereldwijd' getagd. Ik wilde de mogelijkheid hebben om wereldwijde artikelen over internetgebaseerde winkels op te nemen voor bepaalde categorieën waar minder effectieve lokale ondersteuning was, zoals videostreaming. Andere categorieën zijn zeker geschikt om zich uitsluitend te richten op lokale winkels zoals Boodschappen, Auto Winkels en Speelgoedwinkels.
Voor geolocal sites houden we de wereldwijde categorieën op peil en tonen alleen verschillende artikelen voor de lokaal geschikte categorieën. In de toekomst voegen we waar mogelijk wereldwijde artikelen toe aan de lokale keuzes binnen een categorie.
Wanneer bezoekers categoriepagina's bekijken en zoeken, filteren en passen we de resultaten aan op basis van deze ontwerpkeuzes.
Om dit te doen, definiëren we arrays binnen het thema met hun ID's:
Hier zijn een paar voorbeelden. Ten eerste, hier is mijn verzameling van wereldwijde (niet-lokale) categorie-ID's:
// Categorie-ID's die wereldwijd zijn, digitaal kunnen worden weergegeven zonder wijzigingen // b. Aan de slag, Prime en Smile Alternatives, Streaming Media, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195];
Je kunt ze terugvinden door te kijken naar de categorie-ID in de lijst met dashboardcategorieën (door met de muis over de categorienaam te bewegen zoals hieronder met tags wordt getoond):
Of bewerk de categorie en pak de ID bij de bewerkings-URL (Ermee beginnen is 29):
Hier zijn de tag-ID's voor Seattle en Portland:
// Tag-ID's voor plaatsnamen, bijvoorbeeld Seattle, Portland $ known_cities = array (49,211);
Seattle is 49. U kunt de tag-ID bekijken door de muis over de stad te bewegen en de statusbalk te laten zien:
Om het domein of subdomein te verkrijgen, gebruikte ik de WordPress-tip van Trevor Scott en plaatste deze in de functies van mijn thema.php.
Dit is de WordPress Dashboard-thema-editor:
En hier is de code van Trevor:
/ ** * @author Trevor Scott* @version 1.0 2010-12-07 * https: //wordpress.org/support/topic/how-do-i-get-sub-domainname * Pak het subdomeingedeelte van de URL. Als er geen subdomein is, wordt het root * -domein teruggegeven. Standaard retourneert deze functie * de waarde als een * tekenreeks *. Als de functie met echo = true wordt aangeroepen, wordt het antwoord rechtstreeks op * het scherm afgedrukt. * * @param bool $ echo * / function arrested_subdomain ($ echo = false) $ hostAddress = explode ('.', $ _SERVER ["HTTP_HOST"]); if (is_array ($ hostAddress)) if (eregi ("^ www $, $ hostAddress [0])) $ passBack = 1; else $ passBack = 0; if ($ echo == false) return ($ hostAddress [$ passBack]); else echo ($ hostAddress [$ passBack]); else return (false);
Wanneer bezoekers op de algemene startpagina aankomen, is het domein fleethejungle.com in plaats van een subdomein. Ik heb een andere functie gemaakt, configure_geolocal ()
, die wordt aangeroepen aan het begin van het sjabloon header.php-bestand. Dit is het eerste deel van de functie:
function configure_geolocal () global $ nonlocal_category_ids; globale $ known_cities; global $ domain_locale; globaal $ logo_image_url; // Tag-ID's voor plaatsnamen, bijvoorbeeld Seattle, Portland $ known_cities = array (49,211); // Categorie-ID's die wereldwijd zijn, digitaal kunnen worden weergegeven zonder wijzigingen // b. Aan de slag, Prime en Smile Alternatives, Streaming Media, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195]; $ domain_locale = arrested_subdomain (); if ($ domain_locale == 'www' of $ domain_locale == 'fleethejungle') $ domain_locale = false;
Dit is hoe het wordt aangeroepen door get_header ()
binnen de header.php van het thema:
>
Wanneer het domein globaal is, $ domain_locale
zal onwaar zijn. Onder deze omstandigheden sluit ik artikelen uit die lokaal zijn getagged door steden. En ik zal dit doen op de startpagina en de categoriepagina. Wanneer het domein verwijst naar een lokale stad, $ domain_locale
zal het voorvoegsel, b.v. Seattle of Portland.
In de startpagina van het thema, als de bezoeker zich op de wereldwijde site (hoofddomein) bevindt, sluit ik artikelen uit die zijn getagd met steden uit de $ st_cat_post_args
matrix. Als de bezoeker zich echter op een stadspagina bevindt en het subdomein bekend is, geven we alleen lokale artikelen weer in de meeste categorieën, behalve de artikelen die worden geïdentificeerd voor nonlocal_category_ids; dat zijn degenen die meer geschikt zijn voor niet-lokale inhoud, zoals videostreaming:
globale $ known_cities; globale $ nonlocal_category_ids; global $ domain_locale; if ($ domain_locale === false) // rootbezoek $ st_cat_post_args ['tag__not_in'] = $ known_cities; else // lokale stad wordt bekeken maar omvat wereldwijde artikelen in deze categorie als (in_array ($ st_category-> term_id, $ nonlocal_category_ids) $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale, 'worldwide'); else // toon alleen lokale artikelen $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale);
Hier is de code binnen de context van meer van de functie:
// Lijstposten $ st_cat_post_num = of_get_option ('st_hp_cat_postnum'); $ st_posts_order = of_get_option ('st_hp_cat_posts_order'); wereldwijde $ post; // Als show posts is 0 doe niets als ($ st_cat_post_num! = 0) // Aangeboden door populair? if ($ 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); global $ known_cities; globale $ nonlocal_category_ids; global $ domain_locale; if ($ domain_locale === false) // rootbezoek $ st_cat_post_args ['tag__not_in'] = $ known_cities; else // lokale stad wordt bekeken maar omvat wereldwijde artikelen in deze categorie als (in_array ($ st_category-> term_id, $ nonlocal_category_ids) $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale, 'worldwide'); else // toon alleen lokale artikelen $ st_cat_post_args ['tag_slug__in'] = array ($ domain_locale); $ st_cat_posts = get_posts ($ st_cat_post_args); echo '
Met het KnowHow-thema kunnen bezoekers ook op de categoriekoppen klikken en deze naar een artikellijst binnen de categorie brengen.
Als ze op de internationale site staan, wil ik alleen algemene artikelen weergeven. Ik koos ervoor alle wereldwijde artikelen als 'wereldwijd' te taggen om dit te vergemakkelijken.
Dus voor de wereldwijde site laat ik alleen artikelen zien met de tag 'wereldwijd' en voor lokale stadssites toon ik alleen artikelen die zijn getagd voor die stad. Als de categorie een uitzonderlijk geval is voor beide, nemen we artikelen op van zowel de huidige stad als wereldwijd.
Dit is de code binnen de categorie category.php:
Ik ben de zoekopdracht hier niet aan het aanpassen omdat prestaties momenteel geen groot probleem zijn. Ik sla resultaten gewoon uit hun context en toon ze niet.
In de toekomst kan ik dit verder aanpassen voor stadssites door wereldwijde resultaten onder aan de categoriepagina in een apart gedeelte weer te geven.
Het is ook belangrijk om dit soort aanpassingen uit te voeren voor zoeken. Het KnowHow-thema biedt een AJAX-zoekresultaat of een gegenereerde pagina met resultaten. We moeten code opgeven om elke optie aan te passen.
Live AJAX-zoekopdracht
Voor live zoeken is er geen get_header ()
bellen zodat we onze locatie dynamisch moeten configureren:
Vervolgens integreren we dezelfde logica die wordt gebruikt op categoriepagina's in de live zoekresultaten:
// controleer of een van de categorieën is uitgesloten van local $ category_excluded = false; foreach ((get_the_category ()) als $ categorie) if (in_array ($ categorie-> cat_ID, $ GLOBALS ['nonlocal_category_ids'])) $ category_excluded = true; breken; if ($ GLOBALS ["domain_locale"]! == false && has_tag ($ GLOBALS ["domain_locale"]) || ($ category_excluded && has_tag ('worldwide'))) ?>
Pagina met dynamische zoekresultaten
Als het geen AJAX is, dan get_header ()
is voor ons geroepen en het is een beetje eenvoudiger:
cat_ID, $ GLOBALS ['nonlocal_category_ids'])) $ category_excluded = true; breken; if ($ GLOBALS ["domain_locale"]! == false && has_tag ($ GLOBALS ["domain_locale"]) || ($ category_excluded && has_tag ('worldwide'))) get_template_part ('content', get_post_format () ); else if ($ GLOBALS ["domain_locale"] === false && has_tag ("worldwide")) get_template_part ('content', get_post_format ()); ?>
Zoals ik hierboven al vermeldde voor Categorieën, kan ik besluiten de zoekresultaten aan te passen om een tweede sectie met resultaten voor algemene artikelen over stadssites weer te geven.
Om lokale bezoekers uitleg te geven over de verschillen tussen hun lokale site en de wereldwijde site, en hen aan te moedigen deel te nemen aan het verbeteren van de vermeldingen in hun stad, gebruikte ik een plug-in die ik in januari 2015 schreef voor Envato Tuts +: De voordelen van het gebruik van de Gratis Shortcoder-plugin. Het is een plug-in waarmee u macro's in essentie kunt gebruiken om herbruikbare HTML-inhoud op zijn plaats uit te breiden. Voor elk stadsartikel gebruiken we het om aan te passen wat lokale bezoekers zien als ze uit Portland komen.
Nadat de plug-in was geïnstalleerd, maakte ik een shortcode voor elke stad zoals [Sc: pdx] die een eenvoudige blurb bovenaan de artikelpagina's biedt:
Wanneer we vervolgens een lokaal artikel toevoegden, hebben we de shortcode opgenomen [Sc: pdx] op de top:
Dit is hoe het artikel eruitziet wanneer bezoekers aankomen:
Ik ben een lange tijd gebruiker van Digital Ocean, maar ik ben ook een enthousiaste fan van WP Engine aan het worden; goed beheerde hosting biedt in sommige omstandigheden voordelen. Het bleek dat WP Engine een oplossing bood voor het WordPress absolute URL-probleem dat beter was dan alternatieven.
WP Engine biedt een nabewerkingsfilter waarin u reguliere expressies kunt gebruiken om code te wijzigen. Nadat ik andere benaderingen had overwogen om WordPress te wijzigen en hiervoor zijn eigen API's te gebruiken, besloot ik dat het het eenvoudigst zou zijn om absolute links naar FleeTheJungle.com eenvoudig te vervangen door relatieve adressen. Hierdoor konden gebruikers die een subdomein in de stad bezochten, zich binnen de geolocal-site bevinden:
Voorafgaand aan het configureren van dit, hadden bezoeken aan Portland Flee the Jungle subdomein uitgaande links naar de wereldwijde fleethejungle.com verspreid over pagina's. Na het configureren bleven de uitgaande links consistent met het inkomende domein of subdomein.
In wezen heb ik het filter voor naverwerking gebruikt om absolute URL's te verwijderen en de URL en relatieve adressen van de browser toe te staan navigatie te besturen.
Om een directory te bieden van de steden waar Vlucht de Jungle is en beschikbaar zou worden, bouwde ik een pagina met steden waar wereldwijde gebruikers naartoe konden springen. Ik gebruik het ook om vrijwilligers aan te trekken om sites voor hun steden te lanceren.
Hier is de definitieve code die we in WordPress hebben gebruikt configure_geolocal ():
function configure_geolocal () global $ nonlocal_category_ids; globale $ known_cities; global $ domain_locale; globaal $ logo_image_url; // Tag-ID's voor plaatsnamen, bijvoorbeeld Seattle, Portland $ known_cities = array (49,211); // Categorie-ID's die wereldwijd zijn, digitaal kunnen worden weergegeven zonder wijzigingen // b. Aan de slag, Prime en Smile Alternatives, Streaming Media, etc. $ nonlocal_category_ids = [1,22,29,30,46,57,60,195]; $ domain_locale = arrested_subdomain (); if ($ domain_locale == 'www' of $ domain_locale == 'fleethejungle') $ domain_locale = false; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-global.gif'; else if ($ domain_locale == 'pdx' of $ domain_locale == 'portland') $ domain_locale = 'portland'; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-portland.gif'; else if ($ domain_locale == 'sea' of $ domain_locale == 'seattle') $ domain_locale = 'seattle'; $ logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-seattle.gif'; else // onbekende stad - omleiding wp_redirect ('http://fleethejungle.com/cities'); Uitgang;
Natuurlijk wilde ik de basisaanpassing van het logo implementeren, afhankelijk van het subdomein. Het KnowHow-thema ondersteunt dit niet native.
Als je het opmerkt in de finale configure_geolocal ()
code, ik stel een mediabibliotheek URL in voor de logo's voor elke stad.
Vervolgens past de code in header.php de URL van het themalogo aan op basis van het domein hier:
"href =""> ">
WP Engine's domein mapping kan een beetje verwarrend zijn voor niet-ingewijden. U moet domeinen voor uw site toevoegen en deze toewijzen aan het interne adresseringssysteem van WP Engine. Als u wilt dat subdomeinen goed werken, moet u elk subdomein afzonderlijk configureren vanuit het dashboard van de WP Engine-domeinen.
Dit kostte me een tijdje om erachter te komen. Hier voeg ik een placeholder-aankomstpagina toe voor San Francisco, die kan worden bereikt door sanfrancisco.fleethejungle.com of sfbay.fleethejungle.com. WP Engine maakt het eenvoudig om deze omleidingen in te stellen:
Hier is een voorlopige weergave van domeinen die zijn geconfigureerd voor mondiaal en lokaal Flee the Jungle:
Helaas verwijzen steden die u niet expliciet toevoegt aan een 404-fout bij WP Engine. Er zijn andere manieren om dit te omzeilen, maar op dit moment voeg ik alleen grotere steden toe aan de configuratie daar. Mensen worden meestal doorverwezen naar de algemene startpagina of een reeds bestaande stad - van daaruit kunnen ze zich aanmelden als vrijwilliger om hun eigen stad te beginnen.
De interne zoekmachineoptimalisatie van Google staat erom bekend vrij geheim te zijn, maar veel van het verwijzingsverkeer dat uw site ontvangt, hangt ervan af.
Sommige van onze inhoud verschijnen op meerdere domeinen, maar veel ervan zal verschillen afhankelijk van de stad die we bezoeken. Google vindt het niet leuk om dezelfde inhoud op meerdere sites te zien, maar het is ook goed om subdomeinen afzonderlijk te indexeren.
Eerlijk gezegd, ik heb geen idee hoe het Flee the Jungle geolocal netwerkmodel zal worden ontvangen en gerangschikt binnen zijn grote supercomputing megaplex. Dit is op dit moment een lagere prioriteit voor mij. De basis van het verkeer van Flee the Jungle is basisondersteuning en sociaal delen.
Vergelijk alsjeblieft de verschillen in inhoud tussen Flee the Jungle en de lokale stadssite van Portland:
Zeker, er zijn een aantal manieren waarop ik de uitdaging heb kunnen aangaan om geolocale sites te maken. Echter, Flee the Jungle blijft een vrijwillige inspanning - ik had een oplossing nodig die eenvoudig en snel zou zijn, terwijl ik het eenvoudig zou maken om steden toe te voegen door bloggers als vrijwilligers te gebruiken. De aanpak die ik heb beschreven, heeft deze doelen snel bereikt.
Het resultaat van al deze aanpassingen is dat we een enkele WordPress-installatie hebben die honderden geografische variaties van onze site kan uitvoeren, waarbij wereldwijde en lokale inhoud op de juiste manier wordt gefilterd en georganiseerd. Het belangrijkste is dat vrijwilligers steden kunnen bouwen en lanceren met alleen de basisvaardigheden van een WordPress-blogger. Dit is zoveel eenvoudiger en sneller dan mijn WordPress multi-site voor "vrienden" of het uitvoeren van afzonderlijke installaties. De toekomst is relatief onbegrensd.
Ik hoop dat je deze tutorial leuk vond en zou graag horen hoe je deze uitdaging hebt benaderd. Als u een winkelgids voor uw eigen stad wilt maken, neemt u contact met ons op. Als je geïntrigeerd bent over het bouwen van een site als deze, heb ik een gedetailleerde, stapsgewijze tutorial geschreven voor het bouwen van je eigen knowledge base-website over WordPress. Laten we zeggen dat je je eigen Harry Potter-fansite wilt lanceren - het is een eenvoudige handleiding om aan de slag te gaan.
Aarzel niet om uw vragen en opmerkingen hieronder te plaatsen. U kunt ook contact met mij opnemen op Twitter @reifman of mij rechtstreeks een e-mail sturen. Je kunt ook bladeren op mijn Envato Tuts + instructeurspagina om andere tutorials te zien die ik heb geschreven.