使用 PHP 在 WordPress 中使用国家代码动态重写子文件夹
Posted
技术标签:
【中文标题】使用 PHP 在 WordPress 中使用国家代码动态重写子文件夹【英文标题】:Rewrite sub folder dynamically with country code in WordPress using PHP 【发布时间】:2017-11-25 21:00:44 【问题描述】:我知道这个问题已经被问过很多次了,但我没有找到任何可行的解决方案或示例来解决我的问题。
我一直在开发客户网站。有两个类似的网站,一个是针对本国的,第二个是针对其他国家/地区的访问者的。
他们的主站点托管在服务器的根目录中,第二个站点托管在子文件夹中。
现在我想要的是对第二个站点进行动态 URL 重写,该站点托管在带有访问用户国家代码的子文件夹中。
例如
http://example.com
http://example.com/subfolder/
是网址。
我希望将这个http://example.com/subfolder/
更改为这个http://example.com/country_code/
,其中country_code
是通过php 函数获取的ISO 格式的访问者国家代码。
因此,如果用户来自美国,则必须将subfolder
更改为us
,新的URL 现在应该是http://example.com/us/
。
我希望它适用于所有类型的页面,无论是页面、帖子、类别、标签还是作者页面。
再说一遍,http://example.com/subfolder/any-type-of-url/
=> http://example.com/country_code/any-type-of-url/
记住 country_code
是 ISO 格式的用户/访问者国家代码。
如果有人需要这方面的更多信息,请告诉我。提前致谢。
PS:我尝试使用 WP 中的add_rewrite_rule()
函数来实现这一点。
【问题讨论】:
如何在 htaccess 中获取国家代码? @SagarV 我没有在.htaccess
文件中获取国家代码,我有PHP 函数,顺便说一句,我也可以在.htaccess
文件中获取国家代码,请参阅答案here跨度>
他们真的会为每个单独的国家/地区托管同一个站点吗?为什么不使用 qTranslate X 或 WPML?您可以完全按照描述在那里进行 URL 重写。
@Blackbam 他们没有托管多个站点,该站点旨在为多个国家/地区用户提供服务。清楚地阅读我的问题,它说我想用访问者国家 ISO 代码重写子文件夹。如果我使用 qTranslateX 或 WPML,它不会用国家 ISO 代码重写子文件夹,它只会附加到子文件夹,例如 /subfolder/in/。顺便说一句,在我们的案例中不需要翻译插件。我希望它现在清楚了。
主机中的文件夹名称可以任意命名,例如“子文件夹”,访问者应该能够使用各自的国家代码访问该站点。示例:example.com/us/blog & example.com/in/blog 这两个 URL 都将调用 example.com/subfolder/blog。如果我错了,请纠正我?
【参考方案1】:
.htaccess 将是实现这一目标的更快方法,并且用户实现全页缓存也不会有问题。
如果您在您的网站上使用 cloudflare,您可以使用以下简单代码,我们从 cloudflare 本身获取国家/地区;)
Options +FollowSymLinks
RewriteEngine on
#INDIA
RewriteCond %HTTP:CF-IPCountry ^IN$
RewriteRule !^in/ /in%REQUEST_URI [NC,NE,R,L]
#USA
RewriteCond %HTTP:CF-IPCountry ^US$
RewriteRule !^us/ /us%REQUEST_URI [NC,NE,R,L]
#THAILAND
RewriteCond %HTTP:CF-IPCountry ^TH$
RewriteRule !^th/ /th%REQUEST_URI [NC,NE,R,L]
这将取代
xyz.com/sg/random 到 xyz.com/us/random 如果用户来自美国。
如果您想使用 GeoIP
GeoIPEnable On
GeoIPDBFile /path/to/GeoIP.dat
RewriteEngine on
#INDIA
RewriteCond %ENV:GEOIP_COUNTRY_CODE ^IN$
RewriteRule !^in/ /in%REQUEST_URI [NC,NE,R,L]
#USA
RewriteCond %ENV:GEOIP_COUNTRY_CODE ^US$
RewriteRule !^us/ /us%REQUEST_URI [NC,NE,R,L]
#THAILAND
RewriteCond %ENV:GEOIP_COUNTRY_CODE ^TH$
RewriteRule !^th/ /th%REQUEST_URI [NC,NE,R,L]
您始终可以根据您的用例添加更多国家/地区。在有人还在寻找 PHP 代码时,请告诉我。
基于 Wordpress 的 PHP
//For fetching url eg. xyz.com/in/ from xyz.com/in/random-link/abc
$current_url = home_url( add_query_arg( NULL, NULL ) );
//For fetching random-link/abc
$current_rel_url = str_replace( home_url(), "", $current_url );
// I am using cloudflare country variable here , you can use any of your api or whatever method needed
if( !empty($_SERVER["HTTP_CF_IPCOUNTRY"]) )
$userCountry = $_SERVER["HTTP_CF_IPCOUNTRY"];
exit( wp_safe_redirect( site_url() . $userCountry . $current_rel_url ) );
您可以根据您的用例修改重定向条件。
【讨论】:
【参考方案2】:您可以根据用户国家/地区 ISO 代码通过过滤器假装重写规则来做到这一点。请在下面找到代码。
function prepend_default_rewrite_rules( $rules )
// Prepare for new rules
$new_rules = [];
// Set up languages, except default one, get user language code
$user = get_current_user_id();
$language_slugs = (array) get_user_meta($user->ID, 'country_code');
// Generate language slug regex
$languages_slug = '(?:' . implode( '/|', $language_slugs ) . '/)?';
// Set up the list of rules that don't need to be prefixed
$whitelist = [
'^wp-json/?$',
'^wp-json/(.*)?',
'^index.php/wp-json/?$',
'^index.php/wp-json/(.*)?'
];
// Set up the new rule for home page
$new_rules['(?:' . implode( '/|', $language_slugs ) . ')/?$'] = 'index.php';
// Loop through old rules and modify them
foreach ( $rules as $key => $rule )
// Re-add those whitelisted rules without modification
if ( in_array( $key, $whitelist ) )
$new_rules[ $key ] = $rule;
// Update rules starting with ^ symbol
elseif ( substr( $key, 0, 1 ) === '^' )
$new_rules[ $languages_slug . substr( $key, 1 ) ] = $rule;
// Update other rules
else
$new_rules[ $languages_slug . $key ] = $rule;
// Return out new rules
return $new_rules;
add_filter( 'rewrite_rules_array', 'prepend_default_rewrite_rules' );
【讨论】:
会用用户国家代码代替subfolder
吗?
没有得到我应该得到的结果。以上是关于使用 PHP 在 WordPress 中使用国家代码动态重写子文件夹的主要内容,如果未能解决你的问题,请参考以下文章
wordpress中的WooCommerce购物车结帐页面中的国家列表里面怎么修改
wordpress错误提示”抱歉,由于安全原因,这个文件类型不受支持。”解决方法
如何在 AngularJS 部分文件中使用 php (wordpress) 函数?