prosource

언어에 따라 커스텀 포스트 타입 슬러그를 어떻게 다시 작성할 수 있습니까?

probook 2023. 7. 2. 20:49
반응형

언어에 따라 커스텀 포스트 타입 슬러그를 어떻게 다시 작성할 수 있습니까?

저는 워드프레스로 웹사이트를 만들고 있습니다. 그것은 블로그 플랫폼이라기 보다는 CMS와 더 비슷합니다.저는 맞춤형 게시물 유형과 맞춤형 분류법을 많이 활용했습니다.마지막으로 WPML 플러그인을 사용하여 다국어로 만들었습니다.

CPT 선언을 하는 동안 나는 끈과 슬러그를 감쌌습니다.gettextWPML 내에서 번역을 준비할 수 있도록 하기 위해.

CPT 선언의 예는 다음과 같습니다.

register_post_type('rooms',
    array(
        'label' => __('Rooms','valletta'),
        'description' => __('','valletta'),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'capability_type' => 'post',
        'hierarchical' => true,
        'rewrite' => array('slug' => __('rooms','valletta')),
        'query_var' => true,
        'exclude_from_search' => false,
        'menu_position' => 25,
        'supports' => array('title','editor','excerpt','custom-fields','comments',),
        'taxonomies' => array('features','typology',),
        'labels' => array (
            'name' => __('Rooms','valletta'),
            'singular_name' => __('room','valletta'),
            'menu_name' => __('Rooms','valletta'),
            'add_new' => __('Add room','valletta'),
            'add_new_item' => __('Add New room','valletta'),
            'edit' => __('Edit','valletta'),
            'edit_item' => __('Edit room','valletta'),
            'new_item' => __('New room','valletta'),
            'view' => __('View room','valletta'),
            'view_item' => __('View room','valletta'),
            'search_items' => __('Search Rooms','valletta'),
            'not_found' => __('No Rooms Found','valletta'),
            'not_found_in_trash' => __('No Rooms Found in Trash','valletta'),
            'parent' => __('Parent room','valletta'),
        )
    )
);

보시다시피 저도 슬러그 용어를 끝냈고 이것은 (저에게) 완벽하게 이해가 됩니다.제가 얻고 싶었던 것은 사용자가 이탈리아어로 된 "표준" 웹 사이트를 방문하면 /camere/nome-camera/를 통해 룸 CPT 페이지에 도달하는 반면 영어 사용자는 /rooms/room-name/을 통해 그것을 얻을 수 있다는 것입니다.이것은 이탈리아어에서 원활하게 작동하고 WPML도 영어 버전의 슬러그를 올바르게 번역하므로 이탈리아 웹사이트에서 룸 CPT를 보고 영어 버전으로 전환하면 WordPress가 /rooms/로 이동되며 404가 표시되는 유일한 문제가 있습니다.

WPML 웹사이트를 확인해보니 슬러그 번역은 아직 진행 중인 작업이며 플러그인의 다음 버전과 함께 출시될 수 있는 기능이라고 합니다.좋아요, 괜찮습니다.

그러면 제가 얻으려고 하는 것은 WPML 업데이트가 플러그인인 동안 사용하기 위한 해킹입니다.제 생각은 제 .htaccess에 몇 가지 사용자 정의 다시 쓰기 규칙을 가지고 그 CPT 페이지의 URL 다시 쓰기를 하는 것입니다.저는 두 언어에 대한 단일 슬러그를 갖기 위해 슬러그 번역을 제거한 다음 누군가가 "표준" 슬러그를 대신 입력할 때 번역된 슬러그를 입력하지만 적어도 내용은 올바르고: a) 브라우저가 페이지를 리디렉션하지 않고 URL만 다시 작성하기 때문에 사용자는 아무것도 눈치채지 못할 것이라는 다시 쓰기 규칙을 가질 수 있다고 생각했습니다.그리고 b) WP에 대해 아무것도 변경되지 않습니다(또는 변경됩니까??).

그래서 문제는 어떻게 이 모든 것을 할 수 있을까 하는 것입니다.슬러그 번역을 제거하는 것은 괜찮습니다. WPML 백엔드에서 삭제하는 것뿐이지만, 저는 다시 쓰기 규칙 등에 익숙하지 않기 때문에 제 목표를 달성하고 궁극적으로 제가 필요로 하는 것을 달성할 수 있는 더 나은 방법을 보여줄 사람을 찾고 있습니다(그리고 제 아이디어가 말이 되든 안 되든).

제가 뭔가를 놓쳤다면 죄송합니다.정보가 더 필요하시면 제가 그들에게 알려드리겠습니다.

저는 달리기를 한다고 합니다.flush_rewrite_rules()모든 페이지 로드에서 당신이 의도하는 방식으로 페이지 슬래그를 현지화할 수 있지만, 그것은 또한 쓰기 때문에 극도로 빈약한 해결책입니다..htaccess각 페이지 로드에 있는 파일은 속도를 엄청나게 늦추고 잠재적으로 사이트를 방문하는 두 명 이상의 사용자가 있을 때 정말 이상한 결과를 제공합니다.문서를 보니 당신이 제공할 수 있는 것 같습니다.false.금지하는 첫로, 과 같은되어 있기 .

중요:다시 쓰기 규칙을 플러시하는 것은 비용이 많이 드는 작업이며, 'init' 후크에서 실행할 것을 제안하는 튜토리얼과 예제가 있습니다.이것은 나쁜 관행입니다.대신 플러그인의 활성화 후크에서 다시 쓰기 규칙을 플러시하거나 다시 쓰기 규칙을 변경해야 합니다(예: 코드에 새 분류법 또는 게시 유형 추가).

이러한 문제가 발생할 때마다 저는 두 언어에 모두 적용되는 permlink 구조를 사용하게 되었습니다. 하지만 그것도 좋은 해결책은 아닙니다.

을 하는 ./wp-includes/rewrite.php그리고 필터를 통해 주어진 게시 유형에 대한 영구 링크를 재정의하고 사용자 언어 설정에 따라 슬러그를 반환할 수 있는지 확인합니다.은 각 두 영구 의 각 을 "" " " " " " 에 된 영구 할 수 있도록 입니다.register_post_type또한 다른 곳에서 지정한 영구 링크를 통해서도 가능합니다.다음을 사용하여 이 작업을 수행할 수 있습니다.WP_Rewrite또는 일부를 추가함으로써.mod_rewrite.htaccess에 대한 지침입니다.후자의 경우에는 다음과 같은 방법이 사용될 수 있습니다.

$data = 'Rewrit­eRule ^/localized-type-name/(.*)$ /type-name/$1 [R,NC,L]';
// You might want to do a little more work on the actual rewrite rule, it's very much from the top of my head so it might not even work
insert_with_markers( ABSPATH . '/.htaccess', 'NAME OF YOUR MARKER', $data );
$wp_rewrite->flush_rules();

업데이트: 이 스레드를 체크아웃할 수 있습니다.

가능하다.

플러그인을 I 당신이 WPML 러인을사때에, php 상수 I.ICL_LANGUAGE_CODE현재 언어를 제공합니다.그런 다음 게시물 유형을 등록할 때 다음 코드를 사용합니다.

 $args = array (

    'labels'            => array (
        'name'              => _x( 'Destination','post type general name',TT_CPT_DOMAIN ),
        'singular_name'     => _x( 'Destination','post type singular name',TT_CPT_DOMAIN ),
        'add_new'           => _x( 'Add Destination','post type general name',TT_CPT_DOMAIN ),

        'edit_item'         => __( 'Edit Destination',TT_CPT_DOMAIN ),
        'not_found_in_trash' => __( 'No Destination found in Trash',TT_CPT_DOMAIN ),
        'taxonomies'        => __('post_tag','category'),
        'parent_item_colon' => '',
        'menu_name'         => __( 'Destination',TT_CPT_DOMAIN ) 
    ),

    'has_archive'       => true,
    'hierarchical'      => true,
    'menu_position'     => 3,
    'supports'          => array ('title'),
    'menu_icon'         => TT_CPT_PLUGIN_URL. 'images/News.png',  
    'rewrite'           => array('slug' => ( (ICL_LANGUAGE_CODE=='sv')? 'resor':'reiser' ) ),
    'menu_icon'              => TT_CPT_PLUGIN_URL . '/cpts/images/icon_news.png'        

);

줄을 주목하세요.

rewrite'           => array('slug' => ( (ICL_LANGUAGE_CODE=='sv')? 'resor':'reiser' ) ),

사용자가 직접 언어를 처리하거나 다른 플러그인을 사용하는 경우에도 유사한 논리를 사용할 수 있습니다.행운을 빕니다.

언급URL : https://stackoverflow.com/questions/13117058/how-can-i-rewrite-custom-post-types-slugs-based-on-language

반응형