programing

WordPress i18n 프로젝트에서 변수로 내부 링크를 트리거하여 접두사를 추가합니다.

topblog 2023. 10. 10. 20:01
반응형

WordPress i18n 프로젝트에서 변수로 내부 링크를 트리거하여 접두사를 추가합니다.

우리는 워드프레스에서 현지화 프로젝트를 진행하고 있습니다.실제로 언어 지원을 통해 활성 브라우저 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" 함수를 사용하여 WordPress의 영구 링크 구조를 배경으로 실행하려면 변수 ?lang=를 추가해야 합니다.

쉬운 예:

/*
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 멀티>

물론 너무 복잡하고 코드가 너무 많아요.우리는 플러그인을 이해하지도 못했습니다.

물론 논리적인 방법도 있고, 그 사람이 이 글을 보고 답을 했으면 좋겠습니다.당신의 모든 지원에 진심으로 감사드립니다.


원 스텝 투 앤서(One Step to Answer)

잠시 후 아래 코드에 도달하여 정상적으로 작동하고 있음을 확인하였습니다.

<?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".

이 문제를 해결하려면 기존 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' );

정말 멀었군요.아주 멋진 노력.

당신과 승리 사이에 있는 것은 결과 연결 구조를 바꾸는 것뿐인 것으로 알고 있습니다.

그렇다면 다음과 같은 해결 방법이 있습니다.

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;

}

HTML 컨텐츠를 모두 사용할 수 있게 하는 것이 한 가지 가능한 방법이라고 생각합니다.ob_start()그리고.ob_get_contents()그리고 regEx로 모든 링크를 가져옵니다.

참고: 모든 링크가 포스트/페이지가 아닌 정적 파일도 있습니다.

언어 상수가 경로 대신 쿼리 문자열의 일부가 될 수 있습니까?

대신에

localhost/en/hello-world

이것처럼.

localhost/hello-world?lang=en

그렇다면 WordPress로 URL에 추가 변수를 전달하는 방법을 살펴보십시오.

저는 이 방향으로 파고들 것을 제안합니다.

add_action( 'pre_get_posts', 'lang_pre_get_posts', 1 );
function lang_pre_get_posts( $query ) {
    if ( is_admin() || ! $query->is_main_query() ){
        return;
    }
    add_query_arg( 'lang', filter_var( $_COOKIE["lang"], FILTER_SANITIZE_STRING ) );
}

언급URL : https://stackoverflow.com/questions/57860345/in-the-wordpress-i18n-project-add-prefixes-by-triggering-internal-links-with-va

반응형