多语言/站点上下文中相同页面的唯一标识符

时间:2013-04-16 作者:Luca Reghellin

我总是有同样的问题。如果我为多语言目的编写多站点,我无法找到不更改每种语言的页面链接的方法。我的意思是,假设我有一个英文版名为“活动”的页面。然后是意大利语版本,同一页被称为“Attivita”。如果菜单外有手动设置的链接,请说:

get_page_by_title(\'Activity\')
然后我必须在it主题中进行翻译:

get_page_by_title(\'Actività\')
其他语言也是如此。

那么,有没有办法避免检查每种语言中的所有链接?

非常感谢。

5 个回复
最合适的回答,由SO网友:Luca Reghellin 整理而成

我发现另一个答案可能是只使用is\\u page\\u模板标记。

由于我预先确定需要定制css和/或js的php模板文件的名称在所有语言中都是相同的(都使用多站点方式或WPML),我可以说

if(is_page_template(\'that-page.php\')) do this..
简单快速。

SO网友:Capiedge

对于我这样的人来说,来到这个线程,寻找解决方案,pll\\u get\\u post()是您的函数。我认为这是解决这个问题最简单的方法。

    $the_translated_page = get_page_by_title( \'Custom page\' );
    $the_translated_page = pll_get_post( $the_translated_page->ID );
    $the_translated_page_URL = get_permalink( $the_translated_page );
我很确定这个函数(pll\\u get\\u post)最近包含在插件中,或者至少在2013年不存在。。。

希望有帮助!

SO网友:fuxia

在查询标题之前翻译标题:

get_page_by_title( __( \'Activity\', \'your_text_domain\' ) );
或者将帖子之间的关系存储在一个单独的表中,就像多语言出版社那样。然后在该表中查找相关的帖子。

SO网友:Luca Reghellin

我的问题解决方案:自定义字段。基本上,您可以创建一个自定义字段(使用默认的管理工具),并将其称为“类”,或任何您想要的名称。然后,您可以为它指定一个值,该值对于同一页面的所有语言都是相同的。好的是,事实上,如果使用默认的xml export>import工具复制所有语言/站点中的页面结构,则会保留自定义字段,因此每页只需编写一次。

也就是说,我还制作了两个原始和小型函数,我想与大家分享。

我使用这个而不是is\\u page(),来设置不同的css和js文件:

function has_page_class($page_class){
global $wpdb;
$id = get_queried_object_id();

$check = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*)  
FROM $wpdb->postmeta m 
WHERE m.post_id = %d and m.meta_key = \'class\' and m.meta_value = %s",
$id, $page_class));

if($check) return true;

return false;
}
我用这个来代替get\\u permalink()或get\\u page\\u by\\u title():

function get_link_by_page_class($page_class){
global $wpdb;
    //Since the meta SHOULD be unique once per language I could use get_var.
    //But I keep get_results and take the first found page with that meta for programming reasons.
$pages = $wpdb->get_results($wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta m WHERE m.meta_key = \'class\' AND m.meta_value= %s", $page_class));

if($pages && isset($pages[0])){
    $p = $pages[0];
    echo get_permalink($p->post_id);
}
}
通过将“class”自定义字段分配给一种语言的页面,然后在主题代码中使用这些函数,我可以复制所有语言的主题(或者在某些情况下只使用相同的..)不用担心在使用页面名称的函数中切换页面名称。

SO网友:Luca Reghellin

UPDATE (polylang plugin):

这是原始函数的修订版本,这次用于polylang plugin:

//assume polylang as multilingual plugin
function get_link_by_template($template,$lang_slug = null){
    global $wpdb;
    $joins = "";
    $wh = "";

    if($lang_slug){
        $joins = " INNER JOIN $wpdb->term_relationships tr ON meta.post_id = tr.object_id
        INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
        INNER JOIN $wpdb->terms t ON tt.term_id = t.term_id ";

        $wh = " AND t.slug = %s";
    }

    $pages = $wpdb->get_results($wpdb->prepare(
        "SELECT post_id
        FROM $wpdb->postmeta meta " . $joins . "
        WHERE meta.meta_key = %s AND meta.meta_value= %s" . $wh,
            \'_wp_page_template\',
            $template,
            $lang_slug
    ));

    if($pages && isset($pages[0])){
      $p = $pages[0];
      echo get_permalink($p->post_id);
    }

}//get_link_by_template

usage:

//no language
get_link_by_template(\'contacts.php\');

//current language
get_link_by_template(\'contacts.php\',pll_current_language());

//manual language
get_link_by_template(\'contacts.php\',\'it\');
pll\\u current\\u language()返回当前语言。看见polylang codex.

<小时>

OLD (for wpml):

我添加了另一个答案,以解决链接问题。我制作了另一个函数,用于“is\\u page\\u template”方式:

 //assume wpml as multilingual plugin
function get_link_by_template($template,$check_lang = false){
    global $wpdb;

    //if there\'s the need of adding lang vars on the URL
    $lang_join_string = (!$check_lang) ? "" : " left join ". $wpdb->prefix ."icl_translations tr on meta.post_id = tr.element_id ";
    $lang_where_string =  (!$check_lang) ? "" : " AND tr.language_code = \'" . ICL_LANGUAGE_CODE . "\'";

    $pages = $wpdb->get_results($wpdb->prepare(
        "SELECT post_id 
        FROM $wpdb->postmeta meta" . $lang_join_string . "
        WHERE meta.meta_key = \'_wp_page_template\' AND meta.meta_value= %s" . $lang_where_string, 
    $template));

    if($pages && isset($pages[0])){
        $p = $pages[0];
        echo get_permalink($p->post_id);
    }
}//get_link_by_template

结束

相关推荐

MultiSite:使用子博客的虚拟文件夹

我们学校使用wordpress网络。主域提供对一般信息的访问,子站点是由学生管理的特定项目。我想所有的子网站都有一个虚假的文件夹名称附加其url。example假设主要领域是学校。埃杜我的子网站是school.edu/project1/ school.edu/project2/ 我希望它变成:school.edu/projects/project1/ school.edu/projects/project2/ 我该怎么做?UPDATE 1我尝试将此规则添加到。htacc