如何通过地理位置使WordPress网站与众不同

地理WordPress网站的一种方法

为了启动一个由志愿者运营的廉价全球站点网络,该站点将为购物者提供分类目录的本地商店,我需要利用WordPress的强大功能以及一些不寻常的自定义和解决方法。 有很多方法可以提供WordPress的本地体验。 在本教程中,我将向您展示为什么以及我们决定制作定制解决方案的方式。

7月,我在亚马逊发布了名为FleetheJungle.com的全球基于互联网的购物替代指南,反响很好。 我们收到了大量媒体报道和随后的访问量。 它不是数据库驱动的应用程序; 相反,我们利用了出色的KnowHow知识库主题

逃离丛林全球首页-亚马逊替代品

但是要增加站点数量,我们需要为各个城市提供地理版本。 当然,该全球站点可以帮助访问者取消主要会员资格或寻找Kindle书的替代品,但是没有什么可以鼓励人们支持其社区中的小型企业的。

首先,我们将为附近波特兰市的当地购物者制作指南,波特兰市是一个拥有古怪而独立的小企业的骄傲传统。

爱德华·胡安的有趣波特兰地图
图片提供: 爱德华·胡安(Edward Juan)的《森林与海浪波特兰地图》

技术挑战

当然,我已经写了足够的书来介绍如何使用预先配置的, 预先优化的配方快速启动大量 WordPress网站,但是维护网络的相关要求可能非常耗时-例如管理SEO,WordPress和插件升级等。 。

我也考虑过WordPress Multisite,但即使我知道成长了很多,我们也遇到了许多尴尬的困难配对,而且可能永远也不会在一起。 一旦加入“她”,就很难分手。

我需要一个更简单的解决方案。

在本教程中,我将指导您完成与WordPress和知识库主题一起使用的自定义设置和技巧,以启动我们的波特兰购物指南,并轻松启动任何其他城市,同时避免管理数十或数百个城市的开销网站。

地理位置网络要求

以下是启动更多网站的一些基本要求:

1.维护全球站点。 我希望保持全球Fleethejungle.com主域名完整无缺,不包含本地文章,而是提供有关我们可用城市的指南。

2.按子域本地化。 我想要按子域本地化的内容。 例如,访问http://portland.fleethejungle.com可以在该网站上推广本地内容,同时重用一些与更广泛的Internet购物相关的特定国家级网站类别,例如视频流(没有基于Portland的替代方法HBO现在)。 CraigsList为此提供了一个很好的模型。

3.本地与全球之间的整合。 我想向本地访问者解释其本地站点和全球站点之间的差异,同时鼓励他们参与帮助改善其城市中的列表。

4.志愿者管理。 我想让定期添加城市到站点变得容易,只需要具有基本博客技能的志愿者即可启动和维护。 对每个城市启动新的WordPress网站的要求太多,以至于很难与志愿者一起做到这一点。

5.最少的维护。 最后,我想使站点网络的维护与运行单个站点一样简单。

让我们探索一些通常用于解决这类需求的技术方法。

技术方法

对于内容管理,我想到了三种基本方法:

  1. 运行WordPress的不同安装。
  2. 使用WordPress Multisite来运行各种站点。
  3. 自定义WordPress以动态过滤地理内容。

如前所述,我不是Multisite的粉丝,我想避免启动和维护各种WordPress网站的复杂性。 像Flee the Jungle这样的网站将有太多中央内容,需要在城市页面中重复使用(例如如何终止您的Prime会员资格),我不想在不同的WordPress安装中维护此内容-或编写代码来这样做。

我决定根据访问者在浏览器中使用的域或子域来过滤内容。

如果您已经阅读了“ 如何使用Zillow邻居地图和HTML5地理位置”教程,那么您就会知道如何使用基于HTML5浏览器的地理位置来确定用户的位置。 但是,我希望用户拥有更多控制权。

我希望用户使用一个与CraigsList一起使用多年的子域来引导他们到达他们的城市。

按子域划分的Craigslist全球网络

但是WordPress对绝对URL的控制使这一点变得困难。 当我第一次尝试跟踪一个城市的入站子域并将其映射到页面上的链接时,我遇到了WordPress几乎在所有地方都创建绝对链接的习惯。 与我交谈的一位同事问到它时立刻笑了起来-这是WordPress开发人员的常见敌人。

在本教程中,我将在主题的基于PHP的查询中共享自定义项,以构建基于城市的站点,以及最终如何解决绝对URL问题。  

为Geolocal自定义WordPress

这就是我决定为“丛林逃亡”实施基于城市的站点的方法,这些站点可以由本地博主轻松维护和创作,而无需其他技术技能。

利用子域标记

为城市撰写的文章将以城市名称标记,例如“波特兰”。 全球站点的文章将被标记为“全球”。 我希望能够收录有关基于Internet的商店的全球文章,用于某些类别的本地支持不那么有效的内容,例如视频流。 当然,其他类别肯定适合仅专注于本地商店,例如杂货店,汽车商店和玩具店。

城市站点的地理本地主页

对于地域性网站,我们会保留全球类别,仅针对本地适当类别显示不同的文章。 将来,我们会在适当时将全球性文章添加到类别中的本地选择中。

当访问者查看类别页面并进行搜索时,我们还将根据这些设计选择来过滤和自定义结果。

定义变量

为此,我们通过其ID在主题内定义数组:

  • 全球类别列表
  • 当地城市的类别列表
  • 活跃城市及其子域前缀列表

这里有一些例子。 首先,这是我的全球(非本地)类别ID数组:

// Category IDs that are worldwide, digital to be displayed without changes
// e.g. Getting Started, Prime and Smile Alternatives, Streaming Media, etc.
$nonlocal_category_ids = [1,22,29,30,46,57,60,195];

您可以通过查看仪表板类别列表中的类别ID来检索那些内容(通过将鼠标悬停在类别名称上,如下面的标签所示):

逃离丛林类别列表

或者,编辑类别并从编辑URL中获取 ID(“ 入门”29 ):

逃离丛林类别编辑以获取ID

这是西雅图波特兰的标签ID:

// Tag IDs for city names e.g. Seattle, Portland
$known_cities = array(49,211);

西雅图49岁 。 您可以将鼠标悬停在城市上并让状态栏将其显示出来,以查看标签ID:

逃离丛林揭示城市标签ID

使用子域进行地理位置定位

为了获得域或子域,我使用了Trevor Scott的 WordPress技巧 ,并将其放在主题的functions.php中。

这是WordPress仪表板主题编辑器:

WordPress主题编辑

而且,这是Trevor的代码:

/**
 * @author Trevor Scott <trevor@trevor.net>
 * @version 1.0 2010-12-07
 *https://wordpress.org/support/topic/how-do-i-get-sub-domain-name
 * Grab the subdomain portion of the URL. If there is no sub-domain, the root
 * domain is passed back. By default, this function *returns* the value as a
 * string. Calling the function with echo = true prints the response directly to
 * the screen.
 *
 * @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);
	}
}

全球首页

当访问者到达全球主页时,该域将是Flehejungle.com,而不是子域。 我创建了另一个函数configure_geolocal() ,该函数在模板header.php文件的开头调用。 这是函数的第一部分:

function configure_geolocal() {
    global $nonlocal_category_ids;
	global $known_cities;
	global $domain_locale;
	global $logo_image_url;
	// Tag IDs for city names e.g. Seattle, Portland
	$known_cities = array(49,211);

	// Category IDs that are worldwide, digital to be displayed without changes
	// e.g. Getting Started, Prime and Smile Alternatives, Streaming Media, etc.
	$nonlocal_category_ids = [1,22,29,30,46,57,60,195]; 
	$domain_locale = arrested_subdomain();
	if ($domain_locale == 'www' or $domain_locale == 'fleethejungle') {
		$domain_locale = false;

这是主题的header.php中的get_header()调用方式:

<?php configure_geolocal(); ?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>" />
<meta content="width=device-width,minimum-scale=1,maximum-scale=1" name="viewport">
<meta name="format-detection" content="telephone=no">
<meta http-equiv="X-UA-Compatible" content="IE=Edge"/>

如果域是全$domain_locale ,则$domain_locale将为false。 在这种情况下,我将排除城市在本地标记的文章。 我将在主页和类别页面上执行此操作。 当域指向本地城市时, $domain_locale将代表前缀,例如,西雅图或波特兰。

在主题的主页中,如果访问者位于全球站点(根域)上,则从$st_cat_post_args数组中排除带有城市标记的文章。 但是,如果访问者在城市页面上并且知道该子域,则我们仅显示大多数类别的本地文章,但针对nonlocal_category_ids标识的文章除外;这些文章更适合非本地内容,例如视频流:

global $known_cities;
global $nonlocal_category_ids;
global $domain_locale;

if ($domain_locale===false) {
  // root visit
  $st_cat_post_args['tag__not_in']=$known_cities;
} else {
   // local city being viewed but include worldwide articles in this category
 if (in_array($st_category->term_id,$nonlocal_category_ids) {
   $st_cat_post_args['tag_slug__in']=array($domain_locale,'worldwide');
} else {
   // only show local articles
   $st_cat_post_args['tag_slug__in']=array($domain_locale);
}

这是更多函数上下文中的代码:

//List Posts
$st_cat_post_num = of_get_option('st_hp_cat_postnum');
$st_posts_order = of_get_option('st_hp_cat_posts_order');

global $post;
 
// If show posts is 0 do nothing
if ($st_cat_post_num != 0) {

    // Listed by popular?
		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;
global $nonlocal_category_ids;
global $domain_locale;

if ($domain_locale===false) {
  // root visit
  $st_cat_post_args['tag__not_in']=$known_cities;
} else {
   // local city being viewed but include worldwide articles in this category
 if (in_array($st_category->term_id,$nonlocal_category_ids) {
   $st_cat_post_args['tag_slug__in']=array($domain_locale,'worldwide');
} else {
   // only show local articles
   $st_cat_post_args['tag_slug__in']=array($domain_locale);
}

    $st_cat_posts = get_posts($st_cat_post_args);
	echo '<ul class="category-posts">';
	foreach($st_cat_posts as $post) : setup_postdata($post);
	?>
    <?php
	// Set post format class
	if ( has_post_format( 'video' )) { 
	$st_postformat_class = 'video';
	} else {
	$st_postformat_class = 'standard';
	}
  ?>
    <li class="format-<?php echo $st_postformat_class; ?>"><a href="<?php the_permalink(); ?>">
      <?php the_title(); ?>
      </a></li>

    <?php 
	endforeach;
	
echo '</ul>';
自定义类别列表页面的行为

使用KnowHow主题 ,访问者还可以单击类别标题,将其带到该类别中的文章列表。

如果它们在全球站点上,我只想显示全球文章。 为了方便起见,我选择将所有全球​​文章标记为“全球”。

因此,对于全球站点,我仅显示标记为“全球”的文章,对于本地城市站点,我仅显示标记为该城市的文章。 如果该类别对于这两种情况都是例外情况,那么我们会收录来自当前城市和全球的文章。

这是主题的category.php中的代码:

<?php while ( have_posts() ) : {  ?>

<?php 
  the_post();
  $show_post = false;
if ($GLOBALS["domain_locale"]===false) {
  // root worldwide visit, exclude local articles
  if (has_tag('worldwide')) {
    $show_post=true;
  }
} else {
   // local city being viewed 
   if (in_array($current_cat,$GLOBALS['nonlocal_category_ids'])) {
    // include worldwide articles in this category
    if (has_tag($GLOBALS["domain_locale"]) || has_tag('worldwide')) {
      $show_post=true;
    } 
  } else {
     // only show local articles
     if (has_tag($GLOBALS["domain_locale"])) {
       $show_post=true;
     }
    }
}
if ($show_post) {
  get_template_part( 'content', get_post_format()); 
}

?>

<?php } endwhile; ?>

我不在这里自定义查询,因为当前性能不是主要问题。 我只是在上下文中跳过结果,而不显示它们。

将来,我可能会通过在类别页面底部不同部分显示全球范围的结果来进一步针对城市站点进行自定义。

自定义搜索

对搜索执行此类自定义也很重要。 KnowHow主题提供AJAX搜索结果或生成的结果页面。 我们需要提供代码以自定义每个选项。

实时AJAX搜索

对于实时搜索,没有get_header()调用,因此我们需要动态配置位置:

<?php if(!empty($_GET['ajax']) ? $_GET['ajax'] : null) { // Is Live Search ?>
<?php
    // get geolocal settings for live search only
	 configure_geolocal();
?>

然后,我们将实时搜索结果中类别页面上使用的相同逻辑整合在一起:

// check if one of its categories is excluded from local
$category_excluded=false;
foreach((get_the_category()) as $category) { 
    if (in_array($category->cat_ID,$GLOBALS['nonlocal_category_ids'])) {      
      $category_excluded=true;
      break; 
    }    
}
 if ($GLOBALS["domain_locale"]!==false && has_tag( $GLOBALS["domain_locale"]) || ($category_excluded && has_tag('worldwide'))) { ?>

  <li class="<?php echo $st_search_class ?>">
  <?php if ( 'st_faq' == get_post_type() ) { ?>
  <a href="<?php echo home_url(); ?>/<?php echo $st_faq_slug ?>/#faq-<?php the_ID(); ?>"><?php the_title(); ?></a>
  <?php } else { ?>
  <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
  <?php } ?>
  </li>

<?php } else { ?>
    <?php 	if ($GLOBALS["domain_locale"]===false && has_tag( "worldwide")) { ?>

  <li class="<?php echo $st_search_class ?>">
  <?php if ( 'st_faq' == get_post_type() ) { ?>
  <a href="<?php echo home_url(); ?>/<?php echo $st_faq_slug ?>/#faq-<?php the_ID(); ?>"><?php the_title(); ?></a>
  <?php } else { ?>
  <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
  <?php } ?>
  </li>

	<?php } ?>

<?php } ?>

动态搜索结果页面

如果不是AJAX,则会为我们调用get_header() ,它会更简单一些:

<?php while ( have_posts() ) : the_post(); ?>

<?php
// check if one of its categories is excluded from local
$category_excluded=false;
foreach((get_the_category()) as $category) { 
    if (in_array($category->cat_ID,$GLOBALS['nonlocal_category_ids'])) {      
      $category_excluded=true;
      break; 
    }    
}
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());  } 
}
?>
				<?php endwhile; ?>

就像我上面提到的“类别”一样,我可能决定自定义搜索结果以在城市站点上显示全球文章的第二部分结果。

内容方法

为了提供本地游客的当地网站与全球网站之间的差别的解释,同时鼓励他们参与,帮助改善他们的城市的列表,我所使用的插件我在2015年1月写了关于ENVATO TUTS +: 使用的好处免费的Shortcoder插件 。 它是一个插件,可让您使用宏从本质上扩展可重复使用HTML内容。 对于每个城市的文章,我们都使用它来定制本地访客从波特兰到达时所看到的内容。

安装插件后,我为每个城市创建了一个短代码,例如[sc:pdx] ,该代码在本地文章页面的顶部提供了一个简单的简介:

逃离丛林简码编辑器

然后,无论何时添加本地文章,我们都在顶部加入简码[sc:pdx]

在文章编辑页面中逃离丛林简码

访客到达时,文章如下所示:

通过短码与城市简介一起逃离丛林文章
克服绝对链接

我是Digital Ocean的长期用户,但我也越来越热衷于WP Engine 。 托管良好的托管在某些情况下会提供优势。 事实证明,WP Engine提供了解决WordPress绝对URL问题的解决方案,它比替代方法要好。

WP Engine提供了一个后处理过滤器,您可以在其中使用正则表达式来修改代码。 在考虑了其他修改WordPress的方法并为此使用自己的API之后,我决定用相对地址替换到FleeTheJungle.com的绝对链接是最简单的。 这允许访问基于城市的子域的用户保留在地理本地站点内:

WPEngine HTML后处理

在进行此配置之前,访问“丛林逃离波特兰”子域的访问链接指向分散在各个页面中的全球Flehejungle.com。 配置它之后,出站链接与入站域或子域保持一致。

本质上,我使用后处理过滤器来消除绝对URL,并允许浏览器的URL和相对地址来驱动导航。

城市列表

为了提供“丛林逃亡”所在城市的目录,我建立了一个页面,列出了全球用户可以进入的城市 。 我还使用它来吸引志愿者为他们的城市启动站点。

逃离丛林城市导航
完成的Configure_Geolocal()函数

这是我们在WordPress中用于configure_geolocal()的最终代码:

function configure_geolocal() {
    global $nonlocal_category_ids;
	global $known_cities;
	global $domain_locale;
	global $logo_image_url;
	// Tag IDs for city names e.g. Seattle, Portland
	$known_cities = array(49,211);

	// Category IDs that are worldwide, digital to be displayed without changes
	// e.g. Getting Started, Prime and Smile Alternatives, Streaming Media, etc.
	$nonlocal_category_ids = [1,22,29,30,46,57,60,195]; 
	$domain_locale = arrested_subdomain();
	if ($domain_locale == 'www' or $domain_locale == 'fleethejungle') {
		$domain_locale = false;
		$logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-global.gif';
	} else if ($domain_locale == 'pdx' or $domain_locale =='portland') {
	  $domain_locale = 'portland';
	  $logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-portland.gif';
	}  else if ($domain_locale == 'sea' or $domain_locale =='seattle') {
	  $domain_locale = 'seattle';
	  $logo_image_url = '/wp-content/uploads/2015/10/ftj-logo-seattle.gif';
	}  else {
		// unknown city - redirect
		wp_redirect( 'http://fleethejungle.com/cities' ); exit; 
	}
}

杂项要求

自定义徽标

当然,我想根据子域实现徽标的基本自定义。 KnowHow主题本身不支持此功能。

逃离丛林,通过Subdomain在WordPress中自定义徽标

如果您在最终的configure_geolocal()代码中注意到,则为每个城市的徽标设置媒体库URL。

然后,header.php中的代码将根据以下域自定义主题徽标URL:

<!-- #logo -->
  <div id="logo">
    <?php if (is_front_page()) { ?><h1><?php } ?>
      <a title="<?php bloginfo( 'name' ); ?>" href="<?php echo home_url(); ?>">
      <?php if (of_get_option('st_logo')) { ?>
      <img alt="<?php bloginfo( 'name' ); ?>" src="<?php echo $GLOBALS["logo_image_url"] ?>">
      <?php } else { ?>
      <?php bloginfo( 'name' ); ?>
      <?php } ?>
      </a>
     <?php if (is_front_page()) { ?></h1><?php } ?>
  </div>
<!-- /#logo -->
托管域和子域

WP Engine的域映射对于未启动的用户可能会有些困惑。 您必须为您的站点添加域,并将其映射到WP Engine的内部寻址系统。 如果希望子域正常运行,则必须从WP Engine域仪表板中单独配置每个子域。

这花了我一段时间才弄清楚。 在这里,我要添加一个旧金山的占位符到达页面,可以通过sanfrancisco.fleethejungle.com或sfbay.fleethejungle.com进行访问。 WP Engine可以轻松设置以下重定向:

WPEngine添加新的城市域

这是为全局和本地Flee the Jungle配置的域的初步视图:

您网站的WPEngine域列表

不幸的是,您未明确添加的城市在WP Engine中重定向到404错误。 还有其他方法可以解决此问题,但目前,我只是在其中添加较大的城市。 人们通常会被引导到全球主页或先前存在的城市,从那里,他们可以自愿创建自己的城市。

其他事宜

Google的内部搜索引擎优化以相当秘密而闻名,但您的网站收到的许多引荐流量都取决于它。

我们的某些内容会出现在多个域中,但是根据我们要浏览的城市,其中许多内容会有所不同。 Google不想在多个站点上看到相同的内容,但是它也擅长分别索引子域。

坦白说,我不知道如何获得“丛林密探”地理本地网络模型,并将其置于其强大的超级计算巨型网络中。 目前,这对我来说是次要的。 逃离丛林交通的基础是基层支持和社会共享。

收盘时

请比较全球“丛林逃亡”波特兰本地城市站点在内容上的差异:

逃离丛林波特兰-主页示例

当然,我可以通过多种方法来应对创建地理位置站点的挑战。 但是,“丛林逃亡”仍然是志愿者的工作,我需要一种既简单又快速的解决方案,同时又可以利用博客作为志愿者来轻松添加城市。 我所描述的方法已快速实现了这些目标。

所有这些自定义的结果是,我们只有一个WordPress安装程序,可以运行我们站点的数百个地理区域变体,并适当地过滤和组织了全球和本地内容。 最重要的是,志愿者只能使用WordPress博客作者的基本技能来建造和发射城市。 这比我的“朋友” WordPress多站点或运行单独的安装要简单和快捷得多。 未来是相对无限的。

我希望您喜欢本教程,并希望听听您如何应对这一挑战。 如果您想为自己的城市发布购物指南,请与我们联系 。 如果您对建立这样的网站感兴趣,我已经编写了详细的分步教程,用于在WordPress上构建自己的知识库网站 。 假设您要启动自己的“哈利波特”粉丝网站,这是入门的简单指南。

请随时在下面发表您的问题和评论。 您也可以通过Twitter @reifman与我联系或直接给我发送电子邮件 。 您也可以浏览我的Envato Tuts +讲师页面,以查看我编写的其他教程。

相关链接

翻译自: https://code.tutsplus.com/tutorials/how-to-make-wordpress-sites-different-by-geography--cms-25053

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值