使用 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错误提示”抱歉,由于安全原因,这个文件类型不受支持。”解决方法

PHP 使用PHP在WordPress中使用自定义菜单

如何在 AngularJS 部分文件中使用 php (wordpress) 函数?

PHP 在functions.php中使用WordPress自定义更多文本

php 在Wordpress中使用Ajax