7

WordPress を CMS のようなブログ プラットフォームとして使用して、Web サイトを構築しています。カスタム投稿タイプとカスタム分類法を多用しました。最後になりましたが、WPML プラグインを使用して多言語化しました。

CPT 宣言の間、文字列とスラッグをラップしgettextて、WPML 内で翻訳できるようにしました。

CPT 宣言の例は次のとおりです。

register_post_type('rooms',
    array(
        'label' => __('Rooms','valletta'),
        'description' => __('','valletta'),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'capability_type' => 'post',
        'hierarchical' => true,
        'rewrite' => array('slug' => __('rooms','valletta')),
        'query_var' => true,
        'exclude_from_search' => false,
        'menu_position' => 25,
        'supports' => array('title','editor','excerpt','custom-fields','comments',),
        'taxonomies' => array('features','typology',),
        'labels' => array (
            'name' => __('Rooms','valletta'),
            'singular_name' => __('room','valletta'),
            'menu_name' => __('Rooms','valletta'),
            'add_new' => __('Add room','valletta'),
            'add_new_item' => __('Add New room','valletta'),
            'edit' => __('Edit','valletta'),
            'edit_item' => __('Edit room','valletta'),
            'new_item' => __('New room','valletta'),
            'view' => __('View room','valletta'),
            'view_item' => __('View room','valletta'),
            'search_items' => __('Search Rooms','valletta'),
            'not_found' => __('No Rooms Found','valletta'),
            'not_found_in_trash' => __('No Rooms Found in Trash','valletta'),
            'parent' => __('Parent room','valletta'),
        )
    )
);

ご覧のとおり、スラッグ用語もラップしましたが、これは (私にとって) 完全に理にかなっています。私が達成したかったのは、ユーザーがイタリア語の「標準」Web サイトにアクセスすると、/camere/nome-camera/ を介して部屋の CPT ページに到達し、英語のユーザーは /rooms/room-name/ を介して取得することでした。これはイタリア語でスムーズに機能し、WPML は英語版のスラッグも正しく翻訳するため、イタリア語の Web サイトでルーム CPT を表示しているときに英語版に切り替えると、WordPress が /rooms/ に移動し、唯一の問題が発生します。 404 を示します。

WPML の Web サイトを確認したところ、スラッグの翻訳はまだ進行中であり、プラグインの次のバージョンでおそらくリリースされる機能であることを認めています。OK、それは大丈夫です。

私が達成しようとしているのは、WPML の更新がプラグインである間に使用するハックです。私の考えは、.htaccess にいくつかのカスタム書き換えルールを設定し、それらの CPT ページの URL を書き換えることです。スラッグ翻訳を削除して、両方の言語に単一のスラッグを作成し、誰かが入力すると翻訳されたスラッグが代わりに「標準」スラッグを取得するという書き換えルールを作成できると考えましたが、少なくとも内容は正しいです。ブラウザはページをリダイレクトせずに URL を書き換えるだけなので、ユーザーは何も気付かないでしょう。

問題は、どうすればこれをすべて行うことができるかということです。スラッグ翻訳を削除することは問題ありません。WPML バックエンドで削除するだけですが、書き換えルールなどにあまり慣れていないので、目標を達成するのを手伝ってくれる人を探しています。最終的には、達成するためのより良い方法を示します。私には必要です (そして、私のアイデアが理にかなっているかどうかにかかわらず、当然フィードバックがあります)。

私が何かを逃した場合は申し訳ありません。さらに情報が必要な場合は、私が提供します。

4

2 に答える 2

1

可能です。

WPML プラグインを使用しているため、php 定数にICL_LANGUAGE_CODE現在の言語を指定します。次に、投稿タイプを登録する投稿時に、次のコードを使用します。

 $args = array (

    'labels'            => array (
        'name'              => _x( 'Destination','post type general name',TT_CPT_DOMAIN ),
        'singular_name'     => _x( 'Destination','post type singular name',TT_CPT_DOMAIN ),
        'add_new'           => _x( 'Add Destination','post type general name',TT_CPT_DOMAIN ),

        'edit_item'         => __( 'Edit Destination',TT_CPT_DOMAIN ),
        'not_found_in_trash' => __( 'No Destination found in Trash',TT_CPT_DOMAIN ),
        'taxonomies'        => __('post_tag','category'),
        'parent_item_colon' => '',
        'menu_name'         => __( 'Destination',TT_CPT_DOMAIN ) 
    ),

    'has_archive'       => true,
    'hierarchical'      => true,
    'menu_position'     => 3,
    'supports'          => array ('title'),
    'menu_icon'         => TT_CPT_PLUGIN_URL. 'images/News.png',  
    'rewrite'           => array('slug' => ( (ICL_LANGUAGE_CODE=='sv')? 'resor':'reiser' ) ),
    'menu_icon'              => TT_CPT_PLUGIN_URL . '/cpts/images/icon_news.png'        

);

行に注意してください

rewrite'           => array('slug' => ( (ICL_LANGUAGE_CODE=='sv')? 'resor':'reiser' ) ),

自分で言語を処理したり、他のプラグインを使用したりする場合は、同様のロジックを使用できます。幸運を!

于 2013-08-08T10:21:02.267 に答える
1

基本的に、flush_rewrite_rules()ページの読み込みごとに実行すると、ページのスラッグを意図したとおりにローカライズできると思いますが、.htaccessページの読み込みごとにファイルを書き込み、物事が非常に遅くなり、本当に奇妙な結果をもたらす可能性があるため、これは非常に貧弱な解決策です。複数のユーザーがサイトにアクセスすると、結果が表示されます。ドキュメントを見ると、 .htaccess の書き込みを無効にする最初の引数として指定できるように見えますがfalse、ドキュメントには次のようにも記載されているため、これはまだ良い解決策ではありません。

重要: 書き換えルールのフラッシュは高価な操作です。「init」フックで実行することを提案するチュートリアルと例があります。これは悪い習慣です。代わりに、プラグインのアクティベーション フックで書き換えルールをフラッシュするか、書き換えルールを変更する必要があることがわかっている場合 (コードに新しい分類法や投稿タイプを追加する場合など) にフラッシュする必要があります。

私自身この問題に遭遇するたびに、両方の言語で機能する permlink 構造を使用することになりましたが、それもあまり良い解決策ではありません。

良い出発点は、チェックアウトして/wp-includes/rewrite.php、フィルターを介して特定の投稿タイプのパーマリンクをオーバーライドし、ユーザーの言語設定に従ってスラッグを返すことができるかどうかを確認することです。別のオプションとして、言語ごとに 2 つ目のパーマリンクを追加して、カスタム投稿タイプの各投稿が で指定されたパーマリンクと他の場所で指定されたパーマリンクから利用できるようにするregister_post_typeこともできます。を使用するか、 .htaccess にWP_Rewriteいくつかのディレクティブを追加することで、これを実行できる場合があります。mod_rewrite後者の場合、次のようなものが機能する可能性があります。

$data = 'Rewrit­eRule ^/localized-type-name/(.*)$ /type-name/$1 [R,NC,L]';
// You might want to do a little more work on the actual rewrite rule, it's very much from the top of my head so it might not even work
insert_with_markers( ABSPATH . '/.htaccess', 'NAME OF YOUR MARKER', $data );
$wp_rewrite->flush_rules();

更新:このスレッドをチェックしてみてください。

于 2012-10-29T13:43:43.973 に答える