web-dev-qa-db-ja.com

ナメクジを変えずに分類用語を翻訳可能にするためのベストプラクティスは?

私は、国や州と1つのカスタム分類法を持っています。これらの用語を翻訳可能にしたいのですが、これを達成するための最良の方法が何であるかわかりません。まず第一に、私はナメクジを変更したくない、ラベルだけ、そしておそらく説明文字列を変更したい。

私は二つの方法を考えました。 WPMLを使用している可能性があります。しかし、WPMLはあなたに各言語のスラッグを変えることを強制しているようで、それは私が望まないことです。もう一つは wp_insert_term() かもしれませんが、それが効率的であるかどうか、または正しいやり方であるかどうかはわかりません。管理者/編集者に独自の用語を追加させ、すべての用語をハードコーディングしてもそれができなくなり、さらに効率的ではないと感じるようになると私はもっと実用的になるでしょう。分類法)...

何か手がかりはありますか?

更新1:WPML

私はWPMLサポートに連絡しました、彼らはWPMLがそれぞれの言語のために新しい分類学用語を作成して、そのように各々の用語が独特のスラグを持っていなければならないと説明しました。例えばタームエイリアス

更新2:wp_insert_term()

私はこれを見つけました: http://tommcfarlin.com/programmatic-create-categories/ そしてそれは'after_theme_setup'またはafter_switch_themeアクションのフック内でwp_insert_term()を実行することを提案します。しかし、それでも翻訳の問題は解決されません。フックアクションはテーマの設定後にのみ起動されるため、すべての用語に文字列のラベルが付けられていても、テーマの設定時の言語のみが考慮されます。

4
unfulvio

私はWPMLとそれが翻訳をどのように処理するかについて本当に最新ではありませんが、私の一般的な理解はほとんどの場合、それは単に各言語の重複エントリを作成し、それらを「オリジナル」とリンクします。

しかし、最近、名前を単数で入力するデフォルトのフィールドとは対照的に、用語名の「複数化」バージョンを追加する機能が必要になるという同様の問題を抱えていました。 <taxonomy>_add_form_fields<taxonomy>_edit_form_fieldsedited_<taxonomy>、およびcreate_<taxonomy>にフックすることでこれを解決しました。

解決策#1-カスタム分類フィールドを追加する

define('TERM_PLURAL_NAME_KEY', 'term_name_plural');

function setup_taxonomies() {
    $taxonomy_name = 'my_tax';

    add_action( $taxonomy_name . '_add_form_fields', 'my_tax_add_plural_name_field', 10, 2 );
    add_action( $taxonomy_name . '_edit_form_fields', 'my_tax_edit_plural_name_field', 10, 2 );

    add_action( 'edited_' . $taxonomy_name, 'save_my_tax_meta', 10, 2 );
    add_action( 'create_' . $taxonomy_name, 'save_my_tax_meta', 10, 2 );
}
add_action('init', 'setup_plural_taxonomies')


function my_tax_add_plural_name_field() {
    ?>
        <div class="form-field">
            <label for="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]"><?php _e( 'Plural name', 'i18n_key' ); ?></label>
            <input type="text" name="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" id="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" value="">
            <p class="description"><?php _e( 'A pluralized version of the term title, to be used when multiple objects are referred to.', 'i18n_key' ); ?></p>
        </div>
    <?php
}

function my_tax_edit_plural_name_field($term) {
        $t_id = $term->term_id;
        $term_meta = get_option( "taxonomy_$t_id" ); ?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]"><?php _e( 'Plural name', 'i18n_key' ); ?></label></th>
            <td>
                <input type="text" name="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" id="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" value="<?php echo esc_attr( $term_meta[TERM_PLURAL_NAME_KEY] ) ? esc_attr( $term_meta[TERM_PLURAL_NAME_KEY] ) : ''; ?>">
                <p class="description"><?php _e( 'A pluralized version of the term title, to be used when multiple objects are referred to.', 'i18n_key' ); ?></p>
            </td>
        </tr>
    <?php
}

function save_my_tax_meta($term_id) {
    if ( isset( $_POST['term_meta'] ) ) {
        $t_id = $term_id;
        $term_meta = get_option( "taxonomy_$t_id" );
        $cat_keys = array_keys( $_POST['term_meta'] );
        foreach ( $cat_keys as $key ) {
            if ( isset ( $_POST['term_meta'][$key] ) ) {
                $term_meta[$key] = $_POST['term_meta'][$key];
            }
        }
        update_option( "taxonomy_$t_id", $term_meta );
    }
}

上記のコードは、複数ではなく名前のローカライズされた文字列を保持するように簡単に変更できます。次に、WPMLのアクティブ化された言語のリストと各言語のフィールドをループします(上記のすべての機能を調整する必要があります)。ただし、WPMLで多くの言語が有効になっていて、エディターが非常に乱雑な場合、これは非実用的かもしれません。

代替実装も想像できる理由です...

解決策2-「ローカライズされた」用語を「デフォルト言語」用語に接続する

WPMLが自動的にこれを行うかどうかはわかりませんが、そうでない場合は、各言語のローカライズされた用語を作成し、用語を指定すると、その用語のローカライズされた言語インスタンスを返す関数を作成できます。次に、上記の例と同じフックを使用してこの関係を作成できますが、代わりに2つのフィールドを追加します-最初の用語はデフォルトの言語バージョン(wp_dropdown_categoriesを使用)を保持し、もう1つはローカライズの言語を保持します期間。

先ほど述べたように、WPMLの経験はほとんどなく、このタイプの機能はプラグイン自体に既に実装されているため、この方法を検討する前に調査することをお勧めします。

4
Simon

あなたはいつでもカスタムフィールドを用語に追加することができ、それぞれのカスタムフィールドは翻訳を表します。私はこのテーマに関して 良いチュートリアル を見つけました。

0
Alex Sancho

どのようにしてこれらの用語を扱う予定があるのか​​わかりませんが、同じスラッグを維持できない場合でも、WPMLネイティブの方法で用語の翻訳を処理することができると思います。

スラッグという用語を扱う必要があるときは、icl_object_id()関数に頼ることができます。

たとえば、デフォルトの言語として英語、第2言語としてイタリア語があるとします。 「ローマ」という用語をスラッグ「ローマ」で定義します。それを "Roma"に変換すると、スラグは "roma"になります。同じスラグを使おうとすると "rome-2"になります。

現在の用語で作業する必要があるときは、次のようなものを使用できます。

global $sitepress;

$taxonomy_name = 'cities';
$current_term_slug = 'roma'; //so, that's Italian, for instance;

$current_term = get_term_by( 'slug', $current_term_slug, $taxonomy_name );

//Term exists
if($current_term) {
    $default_language = $sitepress->get_default_language();
    $current_language = $sitepress->get_current_language();

    $term_id = $current_term->term_id;
    if ( $default_language != $current_language ) {
        //Here you get the default language term id
        $term_id = icl_object_id( $term_id, $taxonomy_name, false, $default_language );
    }
}

これはほんの一例ですが、与えられた分類用語のスラッグを常にデフォルトの言語で定義されたものに変換する方法を示すことは十分に明らかであると思います。

0