在WordPress i18n项目中,通过变量触发内部链接添加前缀

BOZ*_*BOZ 5 php wordpress permalinks

我们正在 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' );
Run Code Online (Sandbox Code Playgroud)

因此,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'
);
Run Code Online (Sandbox Code Playgroud)

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

注意:从事此类项目并希望使用这些规则的人员将根据要求添加它。


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

localhost/en/hello-world

localhost/ru/hello-world

localhost/de/04/07/2019

localhost/fr/page/2
Run Code Online (Sandbox Code Playgroud)

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

第 3 步

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

在这一点上,我们不需要任何支持。但是当我们到达第 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' );
Run Code Online (Sandbox Code Playgroud)

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

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

要解决这种情况,您必须向现有 URL 结构添加 REGEX 查询,如果它不包含 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' );
Run Code Online (Sandbox Code Playgroud)

Shi*_*ans 1

你已经走得很远了。非常好的努力

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

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

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;

}
Run Code Online (Sandbox Code Playgroud)