「ナメクジ」のテーマのローカライズ(カスタム投稿タイプ、分類法)


16

私のテーマでは、一連のカスタム投稿タイプとカスタム分類を定義します。それぞれに独自のカスタマイズされたスラッグがあります。私のテーマの基本言語は英語なので、ナメクジは英語になります

たとえば、カスタム投稿タイプ「製品」引数のスラッグを定義する場合:

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

po / moファイルを使用して「スラッグ」を翻訳する方法はありますか?次のように配置できますか?

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

またはそれは動作しませんか?ナメクジをローカライズする現在のプラクティスは何ですか?


私たちが同じ問題に対処しているかどうかはわかりませんが、そのように思えます。良いことを示すために、ここで元へのリンクであるインデックスと呼ばれるカスタムポストタイプのページprensaへのスラグセットでprensaWPMLを使用すると、翻訳されたページのスラッグは二度とpressできなくなりますprensa/ en / press / は何も表示しません(ESリンクをクリックしても/ prensa /に戻らないことに注意してください)。しかし、あなたが訪問する場合/ EN /プレンザ/それは仕事...ん
Naoiseゴールデン

私はページを/ en / pressから/ en / prensaにリダイレクトすることを決めたので、リンクはおそらくもう述べたように機能しないでしょう。あまりにも悪い私は、ローカライズされたスラグを使用しますが、ワーキング・オン・タイムは、URL局在フレンドリー良くタントであることができませんでした
Naoiseゴールデン

私の答えをご覧くださいNaoise、私はそれがあなたに実用的な解決策を与えると思います。
chrisguitarguy

私は何時間もこの問題を抱えていました。やっとハックを見つけました:github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/…よろしく。
シルヴァンTch

回答:


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。私の場合は、しかし、それがすることです目的、敗北与えないユーザーに電源をしかしためのローカライズを意識した(SEOに優しい)なURLにするために、カスタムポストタイプ
Naoiseゴールデンの

1
ユーザーからオプションを削除する理由を理解していない。さらに、翻訳フィルタを介してスラッグを実行すると、スラッグを変更するという同じオプションが提供されます。記入するためのきれいなフォームフィールドではありません。
-chrisguitarguy

好奇心のためだけに、なぜwpse30021ですか?
ナオイゴールデン

このオプションはWPLANGベースのローカライズ用であるかのようです。しかし、多言語サイトで作業している場合はどうでしょうか?(WPMLプラグインなど)。問題は、サーバーのオプションからカスタム投稿タイプのスラッグを設定できるというよりも、クライアントのローカライズに応じて異なるスラッグを表示することです。
ナオイゴールデン

wpse = WordPressスタック交換。30021はURLの番号です。あなたの探求で頑張ってください。私は答えを与えました。追加する複雑さが増し、元の質問は明らかに元のCPTスラッグについて完全に変更されているため、エンドユーザーが独自のスラッグを選択できるようになるだけです。
chrisguitarguy

2

それでもうまくいかない場合

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

これは私にはうまく
いき

それは基本的に別のスタイルで同じコードである
Naoiseゴールデン

適切なテキストドメインを追加しましたか?<?php load_theme_textdomain(my_text_domain);?>?
chifliiiii

これは断然、最良の解決策です。
アルロザード

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

ナメクジを翻訳可能にしないことをお勧めしますます。

翻訳は、ユーザー向けのサイトコンテンツ用です。Slugsは内部的に使用され、URL書き換えによってわずかに「公開」されているだけです。URL も翻訳可能であってはなりません

だから、あなたがそれらを定義するとき、あなたのナメクジを放っておきなさい。公共の消費を目的とした翻訳可能な文字列のみを作成します。


11
seoとユーザーエクスペリエンスの両方の観点から翻訳されたナメクジは非常に理にかなっています...
Naoise Golden

とにかく、ナメクジがユーザーエクスペリエンスに影響を与えることに同意しません。スラッグがリンクの一部として使用される場合、リンクアンカーテキストが翻訳されるため、ユーザーは違いを知ることができません。そして、人々が「SEO」の周りを振り回すとき、私は一般的に「ヘビ油」と思います。私はSEOの専門家ではありませんが、翻訳されたスラッグに関してSEOの影響を購入するわけではありません。
チップベネット

3
私は経験に基づいて同意しません。URLスラッグをローカライズする必要があることを明示した外国のコンテンツマネージャーが社内にいます。それは、外国人ユーザーに完全/ローカルな体験を作り出すことです。日本のような一部の国では、文字通り本物の信頼を確立し、そこでビジネスを行うことに真剣であることを示すことが不可欠です。
インターネット

URLは話さなければなりません。したがって、スラッグが(しばしば)エンティティの名前または分類法である場合、書き換えでは、複数形と翻訳を考慮する必要があります。これは、SEOにとっても、エンドユーザー向けの単なる優れたプラクティスにとっても、選択肢ではありません。
ルカレゲリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.