“Salyangozlar” ın tema lokalizasyonu (özel posta tipleri, sınıflandırmalar)


17

temamda, her biri kendi özelleştirilmiş bilgi kaynağına sahip bir dizi özel yazı türü ve özel taksonomi tanımlamak istiyorum; temamın temel dili ingilizce, bu nedenle sümüklü böcekler İngilizce olacak

örneğin, özel ürün türü "ürün" argümanlarının ayrıntılarını tanımlarken:

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

po / mo dosyaları aracılığıyla "slug" çevirmek için herhangi bir yolu var mı? şöyle koyabilir miyim:

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

yoksa işe yaramaz mı? Sümüklü böcekleri lokalize etmek için şu anki uygulama nedir?


Aynı sorunla ilgilenip ilgilenmediğimizi bilmiyorum ama öyle görünüyor. Burada daha iyi açıklamak için , slug olarak ayarlanmış özel bir yazı türü için orijinal bir dizin sayfasına bir bağlantıdır . WPML'yi kullanarak çevrilmiş sayfa bilgi dosyası tekrar olamaz : / tr / press / hiçbir şey göstermez (şimdi ES bağlantısını tıklattığınızda sizi / prensa / öğesine geri döndürmez). AMA, eğer ziyaret / tr / prensa / işe yarıyor ...prensaprensapressprensa
Naoise Golden

/ En / press'den / en / prensa'ya sayfaları yönlendirmeye karar verdim, böylece bağlantı muhtemelen daha önce bahsedildiği gibi çalışmayacak. Çok kötü yerelleştirilmiş slug kullanamadım ama zamanında çalışma url yerelleştirme dostu daha iyidir
Naoise Golden

Cevabımı gör Naoise, bence sana çalışan bir çözüm getirecek.
chrisguitarguy

Saatlerce bu sorunu yaşadım. Sonunda bir hack buldum: github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/… Saygılarımızla.
Sylvain Tch

Yanıtlar:


19

Sümüklü böcekleri lokalize etmeye çalışmazdım. Bunun yerine, kullanıcılarınıza kalıcı bağlantı ayarları sayfasına başka bir alan ekleyerek onları değiştirme seçeneği vermiyorsunuz?

Bağlayın load-options-permalink.phpve $_POSTsülük kurtarmak için veri yakalamak için bazı şeyler ayarlayın . Ayrıca sayfaya bir ayarlar alanı ekleyin.

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

Ardından ayarlar alanı için geri arama işlevi:

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

Sonra yazı tipini kaydettiğinizde, sülük ile kapmak get_option. Orada yoksa, varsayılanınızı kullanı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 );
}

İşte ayarlar alanı kısmı eklenti olarak https://gist.github.com/1275867

DÜZENLEME: Başka Bir Seçenek

Slug'u WPLANGsabitte tanımlananlara göre de değiştirebilirsiniz .

Verileri tutan hızlı bir işlev yazmanız yeterlidir ...

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

Ardından, özel gönderi türünüzü kaydettiğiniz yeri slug alı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 );
}

En iyi seçenek olan IMO, kullanıcıya bir seçenek sunmak ve sağlam varsayılanlar sağlamak olacaktır:

<?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
Gist eklentisi ve iyi belgelenmiş kod için +1. Benim durumumda, yine de, kullanıcıya güç vermek değil , özel yazı türleri
Naoise Golden

1
Neden bir seçeneği kullanıcınızdan kaldırmak istediğinizi anladığımdan emin değilim. Dahası, bir çeviri filtresinden sümüklü böcek çalıştırmak onlara aynı seçeneği sunar: Doldurmak için güzel bir form alanı ile değil.
chrisguitarguy

1
sadece merak için, neden wpse30021?
Naoise Altın

Bu seçenek WPLANG tabanlı bir yerelleştirme için gibi görünüyor. Peki ya çok dilli bir siteyle çalışıyorsanız? (örneğin WPML eklentisi). Soru, istemcinin yerelleştirmesine bağlı olarak, sunucunun seçeneklerinden özel bir yazı tipi bilgi dosyası ayarlayabilmekten daha farklı bir bilgi görüntülemekle ilgilidir .
Naoise Golden

wpse = WordPress yığın değişimi. 30021, URL'deki sayıdır. Soruşturmanda başarılar; Cevabımı verdim. Eklediğiniz karmaşıklık ve orijinal sorunun tam olarak değiştirilmesi - aslen CPT sümüklü böcekleri hakkında, sadece son kullanıcının kendi sümüklerini seçmesine izin verme durumu ortaya çıkar.
chrisguitarguy

2

Bu işe yaramazsa Neden basit değilsiniz:

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

Bu benim için çalışmadı
Naoise Golden

temelde başka bir tarzda aynı kod
Naoise Golden

Doğru metin alanını eklediniz mi? <? php load_theme_textdomain (my_text_domain);?>?
chifliiiii

Bu açık ara en iyi çözüm.
Al Rosado

2

Bunu tam olarak bir tema içerisinde geliştirdiğimi yapıyorum. 5 farklı dilde mevcuttur ve her dilin çevrilmiş bir kategori grubu vardır. Temanın URL'sinin ilk bileşeni, ülke dili biçiminde hangi dilin kullanıldığını belirlemek için ayrıştırılır:

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

Ve sonra çevrilen kategoriler URL'nin diğer bileşenleri olarak ayrıştırılır.

URL parse_requestaşamada ayrıştırılır :

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

Bu örnek, gerekli kontrollerden yoksundur, ancak yalnızca örnek amaçlıdır.

Elbette bu yaklaşımın dezavantajları vardır, ancak tüm dillerde doğal URL'lere izin verir. Gördüğüm ana dezavantajlar:

1) Kalıcı bağlantı mekanizmasını kullanmaz. Bu, tüm diller için uygun kalıcı bağlantı kurallarının üretilmesi ve parse_request'in gerekli olmayacağı şekilde genişletilebilir, ancak tüm diller için bunu yapmak bir döngüde bir MO dosyasını birbiri ardına yüklemeyi içerir ve ben bunun ne kadar iyi desteklendiğini bilmek.

2) Bir çevirmen bir bilgi değiştirirse, bağlantılar geçersiz kılınır.


0

Sen-ebilmek denemek o içinde senin 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;
});
?>

burada görüldüğü gibi


-1

Sümüklü böcekleri tercüme etmemeyi tavsiye ederim .

Çeviri, kullanıcılara yönelik site içeriği içindir . Sümüklü böcekler dahili olarak kullanılır ve URL yeniden yazma işlemleri yoluyla yalnızca marjinal olarak "halka açıktır" ve URL'ler de çevrilebilir olmamalıdır .

Yani: sizin belirttiğiniz gibi sümüklü böceklerinizi yalnız bırakın. Yalnızca kamu tüketimine yönelik çevrilebilir dizeler yapın .


11
seo, hem seo hem de kullanıcı deneyimi perspektifinden, çok mantıklı ...
Naoise Golden

Sümüklü böceklerin her durumda kullanıcı deneyimini etkilediğine katılmıyorum . Bir bağlantı bir bağlantının parçası olarak kullanılırsa bağlantı bağlantı metni çevrilir, böylece kullanıcı farkı bilmez. Ve insanlar "SEO" etrafında savurma başladığında, genellikle düşünüyorum, " yılan yağı ". Ben bir SEO uzmanı değilim, ama çevrilmiş sümüklü böcekler için SEO etkisi satın almıyorum.
Chip Bennett

3
Deneyime dayanarak katılmıyorum. Şirket içinde URL salyangozlarının yerelleştirilmesi gerektiğini açıkça belirten yabancı içerik yöneticilerimiz var. Bu, yabancı kullanıcı için eksiksiz / yerel bir deneyim yaratma meselesidir. Japonya gibi bazı ülkeler için, otantik bir güven oluşturmak ve orada iş yapmak konusunda gerçekten ciddi olduğunuzu belirtmek gerçekten önemlidir.
Internetross

url'ler konuşmalıdır. Bu nedenle, bilgi (genellikle) varlığın adı veya sınıflandırma ise, yeniden yazma işlemi çevirilerin yanı sıra çoğulları da dikkate almalıdır. Bu hem SEO için hem de son kullanıcılara yönelik iyi bir uygulama için bir seçenek değil.
Luca Reghellin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.