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


17

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

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

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

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

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

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


우리가 같은 문제를 다루고 있는지 모르겠지만 문제가있는 것 같습니다. 여기에 더 잘 설명하기 위해 슬러그가로 설정된 커스텀 게시물 유형 의 원본 색인 페이지에 대한 링크 prensaprensa있습니다. 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.