“子弹”的主题本地化(自定义帖子类型,分类法)


17

在我的主题中,我想定义一系列自定义帖子类型和自定义分类法,每个都有自己的自定义标签。我主题的基本语言是英语,因此子弹将使用英语

例如,在定义自定义帖子类型“产品” args的过程中:

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

有什么办法可以通过po / mo文件来翻译“子弹”?我可以这样说吗:

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

还是行不通?目前如何对进行本地化?


我不知道我们是否正在处理相同的问题,但似乎是这样。为了更好地说明这一点,这里有一个指向原始索引页面的链接,该索引页面用于一个自定义帖子类型prensa,该链接的slug设置为prensa。使用WPML,翻译后的页面提示press不再存在prensa/ en / press / 它不会显示任何内容(请注意,现在单击ES链接不会使您回到/ prensa /)。但是,如果您访问/ zh / prensa /,它确实起作用...
Naoise Golden 2011年

我决定将页面从/ en / press重定向到/ en / prensa,因此该链接可能不再起作用。太糟糕了,我无法使用本地化的标签,但按时工作总比对URL本地化更友好
Naoise Golden 2011年

请参阅我的答案Naoise,我认为它将为您提供一个可行的解决方案。
chrisguitarguy 2011年

我有几个小时的这个问题。我终于找到了一个hack:github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug / ...问候。
Sylvain Tch

Answers:


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为要点上的插件和有据可查的代码。不过,就我而言,它无法达到目的,即不赋予用户权力,而是为自定义帖子类型
-Naoise Golden

1
我不确定我是否理解您为什么要从用户中删除选项。此外,通过翻译过滤器运行一个子弹将为他们提供相同的选择:更改子弹。只是没有填写漂亮的表格字段。
chrisguitarguy 2011年

1
只是出于好奇,为什么wpse30021
瑙伊丝·金

似乎此选项适用于基于WPLANG的本地化。但是,如果您正在使用多语言站点,该怎么办?(例如WPML插件)。问题更多的是关于根据客户端的本地化显示不同的消息,而不是能够从服务器的选项中设置自定义帖子类型的消息。
瑙伊丝·金

wpse = WordPress堆栈交换。30021是URL中的数字。祝您一切顺利!我已经给出了答案。您所添加的额外复杂性,以及原始问题的明显完整变化(最初是关于CPT弹头的),仅允许最终用户选择自己的弹头。
chrisguitarguy 2011年

2

如果那不起作用,为什么不简单呢?

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

这对我不起作用
Naoise Golden

它基本上是另一种风格相同的代码
Naoise金

您是否添加了正确的文本域?<?php load_theme_textdomain(my_text_domain);?>吗?
chifliiiii,2011年

到目前为止,这是最好的解决方案。
Al Rosado

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

我建议不要让翻译

翻译是面向用户的网站内容。子弹在内部使用,并且通过URL重写仅在很小的程度上“面向公众”,并且URL 也不应该是可翻译的

因此:按照您的定义,不要碰您的。仅制作供公众使用的可翻译字符串。


11
翻译蛞蝓,无论是从搜索引擎优化和用户体验的角度来看,做了很多的感...
Naoise金

我不同意,弹头无论如何都会影响用户体验。如果将段塞用作链接的一部分,则链接锚文本将被翻译,因此用户将不知道它们之间的区别。当人们开始在“ SEO”周围折腾时,我通常会认为是“ 蛇油 ”。我不是SEO专家,但我不购买SEO对翻译后的弹头的影响。
Chip Bennett

3
根据经验我不同意。我们内部有外国内容管理员,他们明确指出URL链接应该本地化。这是为外国用户创建完整/本地体验的问题。对于某些国家(例如日本),从根本上建立一种真正的信任,并表示您真的很认真地在此开展业务是至关重要的。
internetross

网址必须讲话。因此,如果该段(通常)是实体或分类的名称,则重写必须考虑复数形式和翻译形式。对于SEO而言,这不是一个选择,对于最终用户而言,这仅仅是一个好的实践。
卡·雷格尔林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.