Bản địa hóa chủ đề của sên trên mạng Cameron (loại bài tùy chỉnh, phân loại)


16

trong chủ đề của tôi, tôi muốn xác định một loạt các loại bài tùy chỉnh và phân loại tùy chỉnh, mỗi loại có sên tùy chỉnh riêng; ngôn ngữ cơ bản trong chủ đề của tôi là tiếng Anh, do đó, tiếng sên sẽ bằng tiếng Anh

ví dụ: trong khi xác định sên của loại bài đăng "sản phẩm" tùy chỉnh:

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

Có cách nào để dịch "slug" thông qua các tập tin po / mo không? Tôi có thể đặt nó là:

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

hoặc nó sẽ không hoạt động? thực tế hiện nay để bản địa hóa sên là gì?


Tôi không biết nếu chúng ta đang giải quyết vấn đề tương tự nhưng có vẻ như nó. Để minh họa rõ hơn ở đây là một liên kết đến một trang chỉ mục gốc cho một loại bài đăng tùy chỉnh được gọi prensavới một sên được đặt thành prensa. Sử dụng WPML , sên trang được dịch presslà không thể prensalặp lại: / en / nhấn / không hiển thị bất cứ điều gì (lưu ý rằng bây giờ nhấp vào liên kết ES sẽ không đưa bạn trở lại / prensa /). NHƯNG, nếu bạn truy cập / en / prensa / nó hoạt động ...
Naoise Golden

Tôi đã quyết định chuyển hướng các trang từ / en / nhấn sang / en / prensa để liên kết có thể sẽ không hoạt động như đã đề cập nữa. Quá tệ, tôi không thể sử dụng sên được bản địa hóa nhưng làm việc đúng giờ sẽ thân thiện với địa phương hơn
Naoise Golden

Xem câu trả lời của tôi Naoise, tôi nghĩ rằng nó sẽ cung cấp cho bạn một giải pháp làm việc.
chrisguitarguy

Tôi đã có vấn đề này trong nhiều giờ. Cuối cùng tôi đã tìm thấy một bản hack: github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/ Trân trọng.
Sylvain Tch

Câu trả lời:


19

Tôi sẽ không cố gắng bản địa hóa sên của bạn. Thay vào đó, tại sao không cung cấp cho người dùng của bạn tùy chọn để thay đổi chúng bằng cách thêm một trường khác vào trang cài đặt permalink?

Móc vào load-options-permalink.phpvà thiết lập một số thứ để bắt $_POSTdữ liệu để lưu sên của bạn. Đồng thời thêm trường cài đặt vào trang.

<?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' );
}

Sau đó, chức năng gọi lại cho trường cài đặt:

<?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" />';
}

Sau đó, khi bạn đăng ký loại bài đăng của bạn, lấy sên với get_option. Nếu nó không ở đó, sử dụng mặc định của bạn.

<?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 );
}

Đây là phần trường cài đặt dưới dạng plugin https://gist.github.com/1275867

EDIT: Một lựa chọn khác

Bạn cũng có thể thay đổi sên dựa trên những gì được xác định trong WPLANGhằng số.

Chỉ cần viết một chức năng nhanh chóng chứa dữ liệu ...

<?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];
}

Sau đó lấy sên nơi bạn đăng ký loại bài tùy chỉnh của bạn.

<?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 );
}

Tùy chọn tốt nhất, IMO, sẽ là cung cấp cho người dùng một tùy chọn và cung cấp các giá trị mặc định vững chắc:

<?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 cho plugin trên ý chính và mã tài liệu tốt. Tuy nhiên, trong trường hợp của tôi, nó đánh bại mục đích, đó là không cung cấp năng lượng cho người dùng mà là làm cho các url nhận biết nội địa hóa (seo thân thiện) cho các loại bài đăng tùy chỉnh
Naoise Golden

1
Tôi không chắc chắn tôi hiểu lý do tại sao bạn muốn xóa một tùy chọn khỏi người dùng của bạn. Hơn nữa, việc chạy sên qua bộ lọc dịch cung cấp cho họ tùy chọn tương tự: thay đổi sên. Chỉ cần không phải với một trường mẫu đẹp để điền vào.
chrisguitarguy

chỉ vì tò mò, tại sao wpse30021?
Vàng Naoise

Có vẻ như tùy chọn này dành cho nội địa hóa dựa trên WPLANG. Nhưng nếu bạn đang làm việc với một trang web đa ngôn ngữ thì sao? (ví dụ plugin WPML). Câu hỏi liên quan đến việc hiển thị một con sên khác nhau tùy thuộc vào nội địa hóa của khách hàng hơn là có thể đặt sên loại bài tùy chỉnh từ các tùy chọn của máy chủ.
Vàng Naoise

wpse = trao đổi ngăn xếp WordPress. 30021 là số từ URL. Chúc may mắn với tìm kiếm của bạn; Tôi đã đưa ra câu trả lời của mình. Sự phức tạp bổ sung mà bạn đang thêm và thay đổi hoàn toàn rõ ràng của câu hỏi ban đầu - ban đầu về sên CPT, chỉ tạo ra trường hợp cho phép người dùng cuối chọn sên của riêng họ.
chrisguitarguy

2

Nếu điều đó không hiệu quả Tại sao bạn không đơn giản làm:

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

điều này không hiệu quả với tôi
Naoise Golden

về cơ bản nó là cùng một mã theo phong cách khác
Naoise Golden

Bạn đã thêm tên miền văn bản thích hợp? <? php load_theme nhiệtdomain (my lòng_domain);?>?
chifliiiii

Đây là giải pháp tốt nhất.
Al Rosado

2

Tôi đang làm chính xác điều đó trong một chủ đề chúng tôi đang phát triển. Nó có sẵn trong 5 ngôn ngữ riêng biệt và mỗi ngôn ngữ có một bộ danh mục được dịch. Thành phần đầu tiên của URL trong chủ đề được phân tích cú pháp để xác định ngôn ngữ nào được sử dụng, ở định dạng ngôn ngữ quốc gia:

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

Và sau đó các danh mục được dịch được phân tích cú pháp dưới dạng các thành phần khác của URL.

URL được phân tích cú pháp trong parse_requestgiai đoạn:

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' );

Ví dụ này không có kiểm tra cần thiết, nhưng chỉ có ý nghĩa như một ví dụ.

Dĩ nhiên, có những hạn chế đối với phương pháp này, nhưng nó cho phép các URL tự nhiên trong tất cả các ngôn ngữ. Những nhược điểm chính tôi thấy là:

1) Nó không sử dụng cơ chế permalink. Điều này có thể được mở rộng để các quy tắc permalink thích hợp cho tất cả các ngôn ngữ được tạo và parse numquest sẽ không cần thiết, nhưng để làm điều đó cho tất cả các ngôn ngữ sẽ liên quan đến việc tải một tệp MO sau một vòng lặp khác và tôi không biết làm thế nào được hỗ trợ tốt.

2) Nếu người dịch thay đổi một con sên, thì các liên kết sẽ bị vô hiệu.


0

Bạn có thể thử điều này trong 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;
});
?>

như đã thấy ở đây


-1

Tôi khuyên bạn không nên làm cho sên có thể dịch .

Dịch là cho nội dung trang web người dùng . Sên được sử dụng nội bộ và chỉ được "đối mặt công khai" một chút thông qua việc viết lại URL - và URL cũng không thể dịch được .

Vì vậy: để lại sên của bạn một mình, như bạn xác định chúng. Chỉ tạo các chuỗi có thể dịch được dành cho tiêu dùng công cộng .


11
dịch sên, cả từ góc độ seo và trải nghiệm người dùng, rất có ý nghĩa ...
Naoise Golden

Tôi không đồng ý rằng sên ảnh hưởng đến trải nghiệm người dùng dù thế nào đi nữa. Nếu một con sên được sử dụng như một phần của liên kết, văn bản neo liên kết sẽ được dịch, vì vậy người dùng sẽ không biết sự khác biệt. Và khi mọi người bắt đầu tung hoành "SEO", tôi thường nghĩ, " dầu rắn ". Tôi không phải là chuyên gia SEO, nhưng tôi không mua tác động SEO liên quan đến sên dịch.
Chip Bennett

3
Tôi không đồng ý dựa trên kinh nghiệm. Chúng tôi có các nhà quản lý nội dung nước ngoài, những người rõ ràng rằng sên URL phải được bản địa hóa. Đó là vấn đề tạo ra trải nghiệm địa phương hoàn chỉnh / ly cho người dùng nước ngoài. Đối với một số quốc gia, như Nhật Bản, việc thiết lập một loại niềm tin đích thực và cho thấy bạn thực sự nghiêm túc trong việc kinh doanh ở đó.
internet trên

url phải nói. Vì vậy, nếu sên là (thường xuyên) tên của thực thể hoặc phân loại, việc viết lại phải tính đến số nhiều cũng như các bản dịch. Đó không phải là một lựa chọn, cả cho SEO và đơn giản là thực hành tốt đối với người dùng cuối.
Luca Reghellin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.