การแปลธีมของ "กระสุน" (ประเภทโพสต์ที่กำหนดเอง, taxonomies)


17

ในชุดรูปแบบของฉันฉันต้องการกำหนดชุดประเภทโพสต์ที่กำหนดเองและ taxonomies ที่กำหนดเองแต่ละคนมีกระสุนที่กำหนดเอง ภาษาหลักของชุดรูปแบบของฉันคือภาษาอังกฤษดังนั้นทากจะเป็นภาษาอังกฤษ

ตัวอย่างเช่นในขณะที่กำหนดกระสุนของโพสต์ที่กำหนดเองประเภท "ผลิตภัณฑ์" args:

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

มีวิธีใดในการแปล "กระสุน" ผ่านไฟล์ po / mo? ฉันขอเป็น:

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

หรือมันจะไม่ทำงาน สิ่งที่เป็นปัจจุบันการปฏิบัติเพื่อ จำกัด ทาก?


ฉันไม่รู้ว่าเรากำลังเผชิญกับปัญหาเดียวกัน แต่ดูเหมือนว่ามัน แสดงให้เห็นถึงการที่ดีกว่ามันนี่คือการเชื่อมโยงไปยังเดิมดัชนีหน้าสำหรับประเภทโพสต์ที่กำหนดเองที่เรียกว่ากับชุดกระสุนไปprensa prensaการใช้WPMLทากหน้าของการแปลpressนั้นไม่สามารถเกิดขึ้นได้prensaอีก: / en / กด / ซึ่งไม่แสดงอะไรเลย (โปรดทราบว่าตอนนี้การคลิกที่ลิงค์ ES จะไม่นำคุณกลับไปที่ / prensa /) แต่ถ้าคุณเยี่ยมชม/ en / prensa /มันใช้งานได้ ...
Naoise Golden

ฉันตัดสินใจเปลี่ยนเส้นทางหน้าเว็บจาก / en / กดเพื่อ / en / prensa ดังนั้นลิงก์อาจไม่ทำงานตามที่กล่าวไว้อีกต่อไป น่าเสียดายที่ฉันไม่สามารถใช้กระสุนที่แปลเป็นภาษาท้องถิ่นได้ แต่การทำงานตรงเวลานั้นดีกว่า URL ที่เป็นมิตรต่อผู้ใช้ท้องถิ่น
Naoise Golden

ดูคำตอบของฉัน Naoise ฉันคิดว่ามันจะให้ทางออกแก่คุณ
chrisguitarguy

ฉันมีปัญหานี้หลายชั่วโมง ในที่สุดฉันก็พบแฮ็ค: github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/…ขอแสดงความนับถือ
Sylvain

คำตอบ:


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 สำหรับปลั๊กอินในส่วนสำคัญและรหัสที่ดี ในกรณีของฉันแม้ว่ามันจะเอาชนะจุดประสงค์ซึ่งไม่ได้ให้อำนาจแก่ผู้ใช้ แต่เพื่อทำให้ URL ของการแปลเป็นภาษาที่รับรู้ในท้องถิ่น (เป็นมิตรกับ SEO) สำหรับประเภทโพสต์ที่กำหนดเอง
Naoise Golden

1
ฉันไม่แน่ใจว่าฉันเข้าใจว่าทำไมคุณต้องการลบตัวเลือกจากผู้ใช้ของคุณ ยิ่งไปกว่านั้นการรันตัวบุ้งผ่านตัวกรองการแปลให้ตัวเลือกเดียวกัน: เพื่อเปลี่ยนตัวบุ้ง เพียงแค่ไม่ได้มีเขตข้อมูลรูปแบบที่สวยงามในการกรอก
chrisguitarguy

1
เพียงเพื่ออยากรู้ว่าทำไมwpse30021?
Naoise Golden

ดูเหมือนว่าตัวเลือกนี้มีไว้สำหรับการแปลตาม WPLANG แต่ถ้าคุณทำงานกับเว็บไซต์หลายภาษาล่ะ (ตัวอย่างเช่นปลั๊กอิน WPML) คำถามเพิ่มเติมเกี่ยวกับการแสดงกระสุนที่แตกต่างกันขึ้นอยู่กับการแปลของลูกค้ากว่าความสามารถในการตั้งค่ากระสุนชนิดโพสต์ที่กำหนดเองจากตัวเลือกของเซิร์ฟเวอร์
Naoise Golden

wpse = WordPress สแต็คแลกเปลี่ยน 30021 คือหมายเลขจาก URL ขอให้โชคดีกับภารกิจของคุณ ฉันได้รับคำตอบแล้ว ความซับซ้อนเพิ่มเติมที่คุณเพิ่มและการเปลี่ยนแปลงที่ชัดเจนของคำถามต้นฉบับ - เดิมเกี่ยวกับทาก CPT เพียงทำกรณีที่อนุญาตให้ผู้ใช้เลือกกระสุนของตัวเอง
chrisguitarguy

2

หากนั่นไม่ได้ผลทำไมคุณไม่ง่ายเพียงทำ:

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

สิ่งนี้ไม่ได้ผลสำหรับฉัน
Naoise Golden

มันเป็นรหัสเดียวกันในสไตล์อื่น
Naoise Golden

คุณเพิ่มโดเมนข้อความที่เหมาะสมหรือไม่ <? php load_theme_textdomain (my_text_domain);?>?
chifliiiii

นี่คือทางออกที่ดีที่สุด
อัล 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) มันไม่ได้ใช้ประโยชน์จากกลไกความคิดเห็น สิ่งนี้อาจขยายได้เพื่อให้มีการสร้างกฎความสัมพันธ์ที่เหมาะสมสำหรับทุกภาษาและไม่จำเป็นต้อง 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 และประสบการณ์ของผู้ใช้ทำให้รู้สึกเป็นอย่างมาก ...
Naoise Golden

ฉันไม่เห็นด้วยกับทากที่ส่งผลกระทบต่อประสบการณ์ของผู้ใช้ในทุกกรณี หากกระสุนถูกใช้เป็นส่วนหนึ่งของลิงค์ข้อความที่ลิงค์ยึดจะถูกแปลดังนั้นผู้ใช้จะไม่ทราบความแตกต่าง และเมื่อผู้คนเริ่มใช้คำว่า "SEO" ฉันก็มักจะคิดว่า " น้ำมันงู " ฉันไม่ใช่ผู้เชี่ยวชาญ SEO แต่ฉันไม่ได้ซื้อผลกระทบ SEO ที่เกี่ยวกับทากที่แปลแล้ว
Chip Bennett

3
ฉันไม่เห็นด้วยจากประสบการณ์ เรามีผู้จัดการเนื้อหาต่างประเทศที่มีความชัดเจนว่าทาก URL ควรได้รับการแปลเป็นภาษาท้องถิ่น มันเป็นเรื่องของการสร้างประสบการณ์ในท้องถิ่นที่สมบูรณ์แบบสำหรับผู้ใช้ชาวต่างชาติ สำหรับบางประเทศเช่นญี่ปุ่นจำเป็นอย่างยิ่งที่จะต้องสร้างความไว้วางใจที่แท้จริงและระบุว่าคุณจริงจังกับการทำธุรกิจที่นั่น
internetross

URL ต้องพูด ดังนั้นถ้าตัวบุ้ง (มักจะ) ชื่อของหน่วยงานหรืออนุกรมวิธานการเขียนใหม่จะต้องคำนึงถึงพหูพจน์บัญชีเช่นเดียวกับการแปล นั่นไม่ใช่ตัวเลือกทั้งสำหรับ SEO และการปฏิบัติที่ดีต่อผู้ใช้ปลายทาง
Luca Reghellin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.