私のテーマでは、それぞれ独自のカスタマイズされたスラッグを持つ一連のカスタム投稿タイプとカスタム分類を定義したいと思います。私のテーマの基本言語は英語です、したがってナメクジは英語になります
例えば、カスタム投稿タイプ "product"引数のスラッグを定義している間:
'rewrite' => array( 'slug' => 'product' ),
po/moファイルを使って "slug"を翻訳する方法はありますか?私はそれを置くことができます:
'rewrite' => array( 'slug' => __('product', 'mytextdomain') )
それともうまくいきませんか?ナメクジをローカライズするための現在の慣習は何ですか?
私はあなたのナメクジをローカライズしようとしないでしょう。代わりに、パーマリンク設定ページに別のフィールドを追加してユーザーを変更するオプションをユーザーに与えないでください。
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 );
}
私たちが開発しているテーマの中でまさにそうしています。それは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)翻訳者がスラグを変更すると、リンクは無効になります。
それでもうまくいかない場合
$post_slug= __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
あなたは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;
});
?>
見たとおり ここ