"슬러그"의 테마 현지화 (사용자 정의 게시물 유형, 분류)


17

내 테마에서 나는 일련의 커스텀 포스트 타입과 커스텀 분류법을 정의하고 싶다. 내 테마의 기본 언어는 영어이므로 슬러그는 영어입니다.

예를 들어 커스텀 포스트 타입 "product"args의 슬러그를 정의 할 때 :

'rewrite' => array( 'slug' => 'product' ),

po / mo 파일을 통해 "슬러그"를 번역하는 방법이 있습니까? 나는 그것을 다음과 같이 넣을 수 있습니까?

'rewrite' => array( 'slug' => __('product', 'mytextdomain') )

아니면 작동하지 않습니까? 슬러그를 현지화하는 현재 관행은 무엇입니까?


우리가 같은 문제를 다루고 있는지 모르겠지만 문제가있는 것 같습니다. 여기에 더 잘 설명하기 위해 슬러그가로 설정된 커스텀 게시물 유형 의 원본 색인 페이지에 대한 링크 prensa가 prensa있습니다. WPML을 사용 하면 번역 된 페이지 슬러그가 다시 표시 press될 수 없으므로 / en / press / 가 표시되지 않습니다 (이제 ES 링크를 클릭해도 / prensa /로 돌아 가지 않습니다). 그러나 / en / prensa / 를 방문하면 작동합니다 ...prensa
— Naoise Golden

페이지를 / en / press에서 / en / prensa로 리디렉션하기로 결정하여 링크가 더 이상 언급되지 않은 것처럼 작동하지 않을 수 있습니다. 현지화 된 슬러그를 사용할 수 없었지만 작업 시간이 URL 현지화에 비해 더 나았습니다
— Naoise Golden

내 답변 Naoise를 참조하십시오. 작동하는 솔루션을 제공 할 것입니다.
— chrisguitarguy

나는 몇 시간 동안이 문제가있었습니다. 나는 마지막으로 해킹을 발견 github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/... 감사합니다.
— Sylvain Tch

답변:


19

나는 당신의 슬러그를 현지화하려고하지 않을 것입니다. 대신 사용자에게 퍼머 링크 설정 페이지에 다른 필드를 추가하여 사용자를 변경할 수있는 옵션을 제공하십시오.

슬러그를 저장하기 load-options-permalink.php위해 $_POST데이터를 잡을 몇 가지를 연결 하고 설정 하십시오. 또한 페이지에 설정 필드를 추가하십시오.

<?php
add_action( 'load-options-permalink.php', 'wpse30021_load_permalinks' );
function wpse30021_load_permalinks()
{
    if( isset( $_POST['wpse30021_cpt_base'] ) )
    {
        update_option( 'wpse30021_cpt_base', sanitize_title_with_dashes( $_POST['wpse30021_cpt_base'] ) );
    }

    // Add a settings field to the permalink page
    add_settings_field( 'wpse30021_cpt_base', __( 'CPT Base' ), 'wpse30021_field_callback', 'permalink', 'optional' );
}

그런 다음 설정 필드의 콜백 기능 :

<?php
function wpse30021_field_callback()
{
    $value = get_option( 'wpse30021_cpt_base' );    
    echo '<input type="text" value="' . esc_attr( $value ) . '" name="wpse30021_cpt_base" id="wpse30021_cpt_base" class="regular-text" />';
}

그런 다음 게시물 유형을 등록 할 때으로 슬러그를 잡습니다 get_option. 없는 경우 기본값을 사용하십시오.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    if( ! $slug ) $slug = 'your-default-slug';

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

플러그인으로 설정 필드 부분은 https://gist.github.com/1275867입니다.

편집 : 다른 옵션

WPLANG상수에 정의 된 내용에 따라 슬러그를 변경할 수도 있습니다 .

데이터를 보유한 빠른 기능을 작성하십시오 ...

<?php
function wpse30021_get_slug()
{
    // return a default slug
    if( ! defined( 'WPLANG' ) || ! WPLANG || 'en_US' == WPLANG ) return 'press';

    // array of slug data
    $slugs = array( 
        'fr_FR' => 'presse',
        'es_ES' => 'prensa'
        // etc.
    );

    return $slugs[WPLANG];
}

그런 다음 사용자 정의 게시물 유형을 등록하는 슬러그를 가져옵니다.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

가장 좋은 옵션 인 IMO는 사용자에게 옵션을 제공하고 확실한 기본값을 제공하는 것입니다.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    // They didn't set up an option, get the default
    if( ! $slug ) $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

2
요점의 플러그인과 잘 문서화 된 코드의 경우 +1 제 경우 에는 사용자 에게 힘을 주지 않고 사용자 정의 게시물 유형에
— 서우

1
사용자가 왜 옵션을 제거하고 싶을 지 잘 모르겠습니다. 또한 변환 필터를 통해 슬러그를 실행하면 슬러그를 변경하는 것과 동일한 옵션이 제공됩니다. 예쁜 양식 필드로 작성하지 마십시오.
— chrisguitarguy

1
호기심을 위해서, 왜 wpse30021?
— Naoise Golden

이 옵션은 WPLANG 기반 지역화를위한 것 같습니다. 그러나 다국어 사이트를 사용하는 경우에는 어떻습니까? (예 : WPML 플러그인). 문제는 서버의 옵션에서 사용자 정의 포스트 유형 슬러그를 설정할 수있는 것보다 클라이언트의 현지화 에 따라 다른 슬러그를 표시하는 것에 관한 것입니다.
— Naoise Golden

wpse = 워드 프레스 스택 교환. 30021은 URL의 숫자입니다. 당신의 탐구에 행운을 빕니다; 나는 내 대답을 주었다. 추가하는 복잡성 및 원래 질문 (원래 CPT 슬러그에 대한)의 명백한 변경은 최종 사용자가 자신의 슬러그를 선택할 수있는 경우를 만듭니다.
— chrisguitarguy

2

그래도 작동하지 않으면 왜 간단하지 않습니까?

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );

이것은 나를 위해 작동하지 않았다
— Naoise Golden

그것은 기본적으로 다른 스타일 같은 코드
— Naoise 골든

올바른 텍스트 도메인을 추가 했습니까? <? php load_theme_textdomain (my_text_domain);?>?
— chifliiiii

이것이 지금까지 최고의 솔루션입니다.
— Al Rosado

2

나는 우리가 개발하고있는 주제에서 정확히하고 있습니다. 5 개의 다른 언어로 제공되며 각 언어에는 번역 된 범주 집합이 있습니다. 테마에서 URL의 첫 번째 구성 요소가 구문 분석되어 사용되는 언어를 국가 별 형식으로 판별합니다.

/uk-en
/fr-fr
/it-it

그런 다음 번역 된 범주는 URL의 추가 구성 요소로 구문 분석됩니다.

URL은 다음 parse_request단계 에서 구문 분석됩니다 .

function my_parse_request( $wp ) {
    $path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

    $components = preg_split('|/|', $path, null, PREG_SPLIT_NO_EMPTY );

    // Determine language from $components[0]
    $language = array_shift( $components );
    ...

    // Load translations file...
    $mofile = get_stylesheet_directory()."/$language.mo";

    load_textdomain( 'mydomain', $mofile );

    ...

    // Determine category from $components[0]
    if( __( 'some-category', 'mydomain' ) == $components[0] )
      $wp->query_vars['category'] = 'some-category';

    ...
}
add_action( 'parse_request', 'my_parse_request' );

이 예에는 필수 검사가 없지만 예일뿐입니다.

물론이 방법에는 단점이 있지만 모든 언어에서 고유 URL을 허용합니다. 내가 볼 수있는 주요 단점은 다음과 같습니다.

1) 퍼머 링크 메커니즘을 사용하지 않습니다. 이것은 모든 언어에 대한 적절한 permalink 규칙이 생성되고 parse_request가 필요하지 않도록 확장 될 수 있지만 모든 언어에 대해 수행하려면 루프에서 하나의 MO 파일을 차례로로드해야합니다. 그것이 얼마나 잘 지원되는지 알고 있습니다.

2) 번역기가 슬러그를 변경하면 링크가 무효화됩니다.


0

당신은 이것을 시도 할 수 있습니다 functions.php

<?php
add_filter('rewrite_slugs', function($translated_slugs) {
    // the possible translations for your slug 'product'
    $translated_slugs = array(
        'product' => array(
            'pt' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'produto'),
            ),
            'es' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'producto'),
            ),
        ),
    );
    return $translated_slugs;
});
?>

여기 에서 본


-1

슬러그를 번역 할 수 없도록하는 것이 좋습니다 .

번역은 사용자가 직면 한 사이트 콘텐츠를위한 것 입니다. 슬러그는 내부적 으로 사용 되며 URL 재 작성을 통해 약간 "공개 연결"되며 URL 도 변환 할 수 없습니다 .

따라서 슬러그를 정의 할 때 슬러그를 내버려 두십시오. 대중 소 비용 문자열 만 번역하십시오 .


11
검색
— 엔진 최적화

나는 슬러그 가 어쨌든 사용자 경험 에 영향을 미친다는 것에 동의하지 않는다. 슬러그가 링크의 일부로 사용되면 링크 앵커 텍스트 가 변환되므로 사용자는 그 차이를 알 수 없습니다. 사람들이 "SEO"를 던지기 시작하면 일반적으로 " 뱀 오일 " 이라고 생각 합니다. 저는 SEO 전문가는 아니지만 번역 된 슬러그와 관련하여 SEO에 영향을주지 않습니다.
— Chip Bennett

3
나는 경험에 근거하여 동의하지 않습니다. URL 슬러그를 현지화해야한다는 명시적인 외부 컨텐츠 관리자가 사내에 있습니다. 외국인 사용자를 위해 완벽하게 / 로컬 한 로컬 경험을 만드는 문제입니다. 일본과 같은 일부 국가의 경우 문자 그대로 확실한 신뢰를 설정하고 실제로 사업을하는 데 진지함을 나타내는 것이 필수적입니다.
— internetross

URL은 말해야합니다. 따라서 슬러그가 (주로) 실체 또는 분류법의 이름 인 경우, 재 작성은 번역뿐만 아니라 복수도 고려해야합니다. SEO와 최종 사용자에 대한 좋은 연습 모두를위한 옵션은 아닙니다.
— Luca Reghellin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.