“slugs”的主题本地化(自定义帖子类型、分类)

时间:2011-10-02 作者:unfulvio

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

例如,在定义自定义post类型“product”参数的slug时:

\'rewrite\' => array( \'slug\' => \'product\' ),
有没有办法通过采购订单/生产任务单文件翻译“slug”?我可以这样说吗:

\'rewrite\' => array( \'slug\' => __(\'product\', \'mytextdomain\') )
否则就不行了?目前的鼻涕虫本地化做法是什么?

6 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

我不会试图定位你的鼻涕虫。相反,为什么不给用户一个选项,通过在永久链接设置页面中添加另一个字段来更改它们呢?

钩入load-options-permalink.php 设置一些东西来捕捉$_POST 用于保存slug的数据。还向页面添加设置字段。

<?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

EDIT: Another Option

您还可以根据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];
}
然后在注册自定义帖子类型的地方获取slug。

<?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 );
}

SO网友:Bendoh

我正是在我们正在开发的主题中这样做的。它有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) 它没有利用permalink机制。这可能会被扩展,以便为所有语言生成适当的permalink规则,并且无需parse\\u请求,但要为所有语言执行此操作,需要在循环中加载一个又一个MO文件,我不知道这是否得到了很好的支持。

2) 如果翻译器更改了slug,则链接将无效。

SO网友:chifliiiii

如果这不起作用,为什么不简单地做:

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

SO网友:Junior Mayhé

你可以在你的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;
});
?>
如图所示here

SO网友:Xriuk

我实际上遇到了这个问题,这是我的解决方案,当你事先知道网站的语言时,它就会起作用。假设您有一个名为“电影”的CPT,您的网站有3种语言。您需要为每种语言重写您的CPT permalink。您也可以动态执行此操作。

add_action("init", "rewrite_cpt", 10, 0);
function rewrite_cpt(){    
    add_rewrite_rule(\'^movie/([^/]*)/?\', \'index.php?post_type=movie&name=$matches[1]\', \'top\'); // English
    add_rewrite_rule(\'^film/([^/]*)/?\', \'index.php?post_type=movie&name=$matches[1]\', \'top\');  // Italian
    add_rewrite_rule(\'^фильм/([^/]*)/?\', \'index.php?post_type=movie&name=$matches[1]\', \'top\'); // Russian
}
现在,您只需重建永久链接:转到“设置”>“永久链接”,然后按“保存”

下一部分是为你的CPT重写URL,如果你有一个翻译过的CPT,你需要获得文章的语言,在我的例子中,我使用的是Polylang。在URL中对外来字符进行编码很重要

add_filter("post_type_link", "x_tours_postlink", 10, 2);
function x_tours_postlink($post_link, $post){
    $urls = array(
        "en" => "movie",
        "it" => "film",
        "ru" => "фильм"
    );
    if(get_post_type($post) == "movie")
        $post_link = str_replace("movie", urlencode($urls[pll_get_post_language($post->ID)]), $post_link);
    return $post_link;
}

SO网友:Chip Bennett

我会推荐not making slugs translatable.

翻译针对面向用户的网站内容。slug是在内部使用的,通过URL重写,它只是略微“面向公众”,URL也不应该是可翻译的。

所以:不要管你的鼻涕虫,就像你定义它们一样。仅生成用于public consumption.

结束

相关推荐

Show Custom Taxonomy Slug(s)?

有人能帮我吗?我需要打印自定义分类法的slug,可以吗?下面这类代码很有用,但它只显示了名称,而不是我需要的用于类目的的slug。。<?php $terms = get_the_terms( $post->ID , \'area\' ); foreach( $terms as $term ) {print $term->name; unset($term);}?> 有没有办法为我的自定义分类法“区域”获取slug??非常感谢您的帮助:)