使用PHP在WordPress中使用国家/地区代码动态重写子文件夹

Vik*_*eta 5 php wordpress url-rewriting

我知道这个问题已经被问过很多次了,但是我没有找到可以用来解决问题的有效解决方案或示例。

我一直在客户端站点上工作。有两个类似的网站,一个针对自己的国家,第二个针对其他国家的游客。

他们的主站点托管在服务器的根目录中,第二个站点托管在子文件夹中。

现在,我想要的是第二个站点的动态URL重写,该站点托管在带有访问用户国家代码的子文件夹中。

例如

http://example.com
http://example.com/subfolder/

是网址。

我希望http://example.com/subfolder/将其更改为通过php函数获取ISO格式的访客国家代码的http://example.com/country_code/地方country_code

因此,如果用户来自美国,subfolder必须将其更改为us,新网址应为now 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:我尝试使用add_rewrite_rule()WP中提供的功能来实现此目的。

Kap*_*dav 0

您可以通过基于用户国家/地区 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' );
Run Code Online (Sandbox Code Playgroud)