首页 > 解决方案 > 在 WordPress i18n 项目中,通过使用变量触发内部链接来添加前缀

问题描述

我们正在 WordPress 中进行本地化项目。事实上,我们可以正确添加具有语言支持的活动浏览器 URL。我将在下面添加详细信息和整个代码。别担心,我的问题不会那么开放,我会说得更具体。

步骤1

首先,我们应该在 WordPress 算法的链接结构中添加一个变量。

function custom_rewrite_basic_query_vars( $query_vars ){
    $query_vars[] = 'lang';
    return $query_vars;
}
add_filter( 'query_vars', 'custom_rewrite_basic_query_vars' );

因此,WordPress 会检测到一个变量,例如?lang=并将其包含在查询机制中。

第2步

使用“add_rewrite_rule”函数,需要添加变量?lang=在WordPress持久链接结构的后台运行。

简单的例子:

/*
LANG PREFIX + INDEX = localhost/en/ = localhost/?lang=en
*/

add_rewrite_rule(
    '^(en|fr|de|ru|tr)/?$',
    'index.php?lang=$matches[1]',
    'top'
);

我不会一一添加剩余的实例,因为您应该使用接近 20 条重写规则。(日期、类别、评论、页面、文本、分页等)

注意:从事此类项目并希望使用这些规则的人将在需要时添加它。


现在我们的持久连接结构支持语言选项的变量。

localhost/en/hello-world

localhost/ru/hello-world

localhost/de/04/07/2019

localhost/fr/page/2

等等所有你能想到的链接。

第 3 步

如果从浏览器中检测到变量(例如:lang = en),我们将显示之前保存的跨语言翻译的内容。

在这一点上,我们不需要任何支持。但是当我们到达第 4 步时,我们就被卡住了。

第4步

激活之前添加的前缀语言变量,用户在使用站点内的链接时,在所有站点内导航链接上。

这意味着如果用户有权访问该localhost/fr/hello-world链接,他们必须localhost/fr/contact在返回主页或单击“联系”链接时访问该链接。

为此,您需要将浏览器中当前处于活动状态的语言前缀添加到所有站内链接。

不幸的是,这是我们闲逛的唯一地方,我们找不到解决方案。

事实上,在写到这里之前,我们尝试了大多数事情。(当然在我们的知识范围内)。我们甚至查看了提供一些语言支持的插件。

例如< WP Multilang >

当然,它是如此复杂和如此多的代码。我们甚至不了解插件。

当然,这样做有一种合乎逻辑的方式,我希望那个人看到这篇文章并回答。衷心感谢大家的支持。


一步回答

过了一会儿,我找到了下面的代码,并确认它工作正常。

<?php

function link_fn( $url ){

    $lang = get_query_var('lang', false);       

    if( $lang !== false && strpos( $url, $lang ) !== false )
        $url = $url . $lang . '/';

    return $url;
}

add_filter( 'shortcut_link', 'link_fn' );
add_filter( 'post_link', 'link_fn' );
add_filter( 'page_link', 'link_fn' );
add_filter( 'post_type_link', 'link_fn' );
add_filter( 'attachment_link', 'link_fn' );
add_filter( 'term_link', 'link_fn' );
add_filter( 'author_link', 'link_fn' );
add_filter( 'post_type_archive_link', 'link_fn' );
add_filter( 'day_link', 'link_fn' );
add_filter( 'month_link', 'link_fn' );
add_filter( 'year_link', 'link_fn' );

但是此时,我遇到了一个问题。这里我们得到像“ localhost/hello-world/[LANG]/”这样的数据。

我想要的是“ localhost/[LANG]/hello-world”。

要解决这种情况,您必须将 REGEX 查询添加到现有 URL 结构,如果它不包含 LANG,则将语言代码添加到 BASE URL。由于应该添加 REGEX 查询,我不能这样做......

我不想回答我自己的问题并确认。除了上面我写的代码之外,如果有答案包含我想要的查询,我会将其标记为答案。


回答

function link_fn( $url ){

    $lang = get_query_var('lang', false);

    $site_url = get_option('home');

    if( $lang !== false )
    {
        $new_url = str_replace( $site_url, "", $url );

        if( preg_match('/\b$lang\b/', $new_url) !== false )
        {
            $url = $site_url."/".$lang.$new_url;
        }

    }

    return $url;
}

add_filter( 'home_url', 'link_fn' );

标签: phpwordpresspermalinks

解决方案


你真的走得很远。很不错的努力

我知道你和胜利之间的关系只是改变结果链接结构?

如果是,这里有一个解决方案:

function link_fn($url){

    $lang = get_query_var('lang', false);
    $url_parts = explode('/', $url);

    if ( $lang && in_array($lang, $url_parts) === false) { // lang does not exists in URL
        array_splice($url_parts, 1, 0, $lang);
    }
    $url = implode('/', $url_parts);
    return $url;

}

推荐阅读