Lokalisasi tema "siput" (jenis posting khusus, taksonomi)

17

dalam tema saya, saya ingin mendefinisikan serangkaian jenis posting kustom dan taksonomi kustom, masing-masing memiliki siput disesuaikan sendiri; bahasa dasar tema saya adalah bahasa Inggris, oleh karena itu siput akan menggunakan bahasa Inggris

misalnya saat mendefinisikan slug jenis pos "produk" khusus:

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

apakah ada cara untuk menerjemahkan "slug" melalui file po / mo? bisakah saya menyebutnya:

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

atau itu tidak akan berhasil? apa praktik saat ini untuk melokalisasi siput?

unfulvio
sumber
Saya tidak tahu apakah kita berurusan dengan masalah yang sama tetapi sepertinya itu. Untuk mengilustrasikannya dengan lebih baik di sini adalah tautan ke halaman indeks asli untuk jenis posting khusus yang disebut prensadengan set siput prensa. Menggunakan WPML halaman slug yang diterjemahkan adalah presskarena tidak bisa prensalagi: / en / press / yang tidak menampilkan apa-apa (perhatikan bahwa sekarang mengklik tautan ES tidak membawa Anda kembali ke / prensa /). TETAPI, jika Anda mengunjungi / id / prensa / itu berfungsi ...
Naoise Golden
Saya memutuskan untuk mengalihkan halaman dari / en / tekan ke / en / prensa sehingga tautannya mungkin tidak akan berfungsi seperti yang disebutkan lagi. Sayang sekali saya tidak bisa menggunakan siput lokal tetapi bekerja tepat waktu lebih baik dari pada url-lokalisasi ramah
Naoise Golden
Lihat jawaban saya Naoise, saya pikir itu akan memberi Anda solusi yang berfungsi.
chrisguitarguy
Saya punya masalah ini selama berjam-jam. Saya akhirnya menemukan sebuah retasan : github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/… Salam.
Sylvain Tch

Jawaban:

19

Saya tidak akan mencoba melokalisasi siput Anda. Alih-alih, mengapa tidak memberi pengguna Anda opsi untuk mengubahnya dengan menambahkan bidang lain ke halaman pengaturan permalink?

Kaitkan ke dalam load-options-permalink.phpdan atur beberapa hal untuk menangkap $_POSTdata untuk menyimpan siput Anda. Tambahkan juga bidang pengaturan ke halaman.

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

Kemudian fungsi panggil kembali untuk bidang pengaturan:

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

Kemudian ketika Anda mendaftarkan jenis posting Anda, ambil siput dengan get_option. Jika tidak ada, gunakan default Anda.

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

Inilah bagian bidang pengaturan sebagai plugin https://gist.github.com/1275867

EDIT: Opsi Lain

Anda juga bisa mengubah siput berdasarkan apa yang didefinisikan dalam WPLANGkonstanta.

Cukup tulis fungsi cepat yang menyimpan data ...

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

Lalu dapatkan siput tempat Anda mendaftarkan jenis posting khusus Anda.

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

Opsi terbaik, IMO, adalah memberi pengguna opsi dan memberikan default yang solid:

<?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 );
}
chrisguitarguy
sumber
2
+1 untuk plugin pada intisari dan kode yang didokumentasikan dengan baik. Namun, dalam kasus saya, ini mengalahkan tujuannya, yaitu untuk tidak memberikan kekuatan kepada pengguna tetapi untuk membuat url yang sadar lokalisasi (seo friendly) untuk jenis posting khusus
Naoise Golden
1
Saya tidak yakin saya mengerti mengapa Anda ingin menghapus opsi dari pengguna Anda. Terlebih lagi, menjalankan slug melalui filter terjemahan memberi mereka opsi yang sama: untuk mengubah slug. Hanya saja tidak dengan isian form cantik untuk diisi.
chrisguitarguy
1
hanya karena penasaran, mengapa wpse30021?
Naoise Golden
Sepertinya opsi ini untuk lokalisasi berbasis WPLANG. Tetapi bagaimana jika Anda bekerja dengan situs multi-bahasa? (misalnya plugin WPML). Pertanyaannya lebih lanjut tentang menampilkan siput yang berbeda tergantung pada lokalisasi klien daripada mampu mengatur siput jenis pos kustom dari opsi server.
Naoise Golden
wpse = Pertukaran stack WordPress. 30021 adalah nomor dari URL. Semoga berhasil dengan pencarian Anda; Saya sudah memberikan jawaban saya. Kompleksitas tambahan yang Anda tambahkan, dan perubahan lengkap yang jelas dari pertanyaan asli - aslinya tentang siput CPT, hanya membuat kasus untuk memungkinkan pengguna akhir untuk memilih siput mereka sendiri.
chrisguitarguy
2

Jika itu tidak berhasil. Mengapa tidak Anda lakukan saja:

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
chifliiiii
sumber
ini tidak berhasil untuk saya
Naoise Golden
itu pada dasarnya kode yang sama dalam gaya lain
Naoise Golden
Sudahkah Anda menambahkan domain teks yang tepat? <? php load_theme_textdomain (my_text_domain);?>?
chifliiiii
Sejauh ini, ini adalah solusi terbaik.
Al Rosado
2

Saya melakukan hal itu dalam sebuah tema yang sedang kami kembangkan. Ini tersedia dalam 5 bahasa yang berbeda, dan setiap bahasa memiliki seperangkat kategori yang diterjemahkan. Komponen pertama URL dalam tema diuraikan untuk menentukan bahasa mana yang digunakan, dalam format bahasa negara:

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

Dan kemudian kategori yang diterjemahkan diuraikan sebagai komponen lebih lanjut dari URL.

URL diuraikan dalam parse_requestfase:

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

Contoh ini tidak memiliki pemeriksaan yang diperlukan, tetapi dimaksudkan hanya sebagai contoh.

Tentu saja ada kelemahan pada pendekatan ini, tetapi memungkinkan URL alami dalam semua bahasa. Kelemahan utama yang saya lihat adalah:

1) Itu tidak menggunakan mekanisme permalink. Ini mungkin dapat diperpanjang sehingga aturan permalink yang tepat untuk semua bahasa dihasilkan dan parse_request tidak diperlukan, tetapi untuk melakukannya untuk semua bahasa akan melibatkan memuat satu file MO demi satu dalam satu lingkaran, dan saya tidak tahu seberapa baik didukung itu.

2) Jika penerjemah mengubah siput, maka tautannya akan batal.

Bendoh
sumber
0

Anda dapat mencoba ini di 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;
});
?>

seperti yang terlihat di sini

Junior M
sumber
-1

Saya akan merekomendasikan untuk tidak membuat siput dapat diterjemahkan .

Terjemahan untuk konten situs yang menghadap pengguna . Siput digunakan secara internal , dan hanya sedikit "menghadap publik" melalui penulisan ulang URL - dan URL juga tidak boleh diterjemahkan .

Jadi: tinggalkan siput Anda sendiri, saat Anda mendefinisikannya. Hanya buat string yang dapat diterjemahkan yang dimaksudkan untuk konsumsi publik .

Chip Bennett
sumber
11
siput yang diterjemahkan, baik dari sudut pandang seo maupun pengalaman pengguna, sangat masuk akal ...
Naoise Golden
Saya tidak setuju bahwa siput memengaruhi pengalaman pengguna dengan cara apa pun. Jika siput digunakan sebagai bagian dari tautan, teks jangkar tautan akan diterjemahkan, sehingga pengguna tidak akan tahu bedanya. Dan ketika orang mulai membolak-balik "SEO", saya biasanya berpikir, " minyak ular ". Saya bukan ahli SEO, tapi saya tidak membeli dampak SEO sehubungan dengan siput yang diterjemahkan.
Chip Bennett
3
Saya tidak setuju berdasarkan pengalaman. Kami memiliki pengelola konten asing di-rumah yang secara eksplisit menyatakan bahwa siput URL harus dilokalkan. Ini masalah menciptakan pengalaman lokal yang lengkap untuk pengguna asing. Untuk beberapa negara, seperti Jepang, sangat penting untuk membangun kepercayaan yang otentik dan menunjukkan Anda benar-benar serius melakukan bisnis di sana.
internet di
url harus berbicara. Jadi, jika siput adalah (sesering) nama entitas atau taksonomi, penulisan ulang harus mempertimbangkan bentuk jamak serta terjemahan. Itu bukan pilihan, baik untuk SEO dan hanya praktik yang baik terhadap pengguna akhir.
Luca Reghellin