当我切换语言时,如何更改WordPress网站上的Logo图片?

7
我有一个多语言网站。当我切换到“印度”语言时,是否有一种方法可以更改logo.png为不同的.png?目前我正在使用polylang插件。我尝试了这个解决方案,但它没有起作用-https://support.pojo.me/docs/polylang-change-logo-every-language/。有人知道如何解决这个问题吗? 我的代码:
function pojo_polylang_get_multilang_logo( $value ) {
    if ( function_exists( 'pll_current_language' ) ) {
        $logos = array(
            'en' => 'logo-en.png',
            'in' => 'logo-in.png',
        );
        $default_logo = $logos['en'];
        $current_lang = pll_current_language();
        $assets_url = get_stylesheet_directory_uri() . '/assets/images/';
        if ( isset( $logos[ $current_lang ] ) )
            $value = $assets_url . $logos[ $current_lang ];
        else
            $value = $assets_url . $default_logo;
    }
    return $value;
}
add_filter( 'theme_mod_image_logo', 'pojo_polylang_get_multilang_logo' );

你有收到任何错误吗? - Darsh khakhkhar
@core114 当您更改语言时,$current_lang的值是否会发生变化?因为您的默认徽标设置为$logos ['en'],而$current_lang的值也是en,所以如果$current_lang的值不变,则徽标不会更改。 - Darsh khakhkhar
先生,我不太清楚。您能否使用我的代码给出答案? - core114
你使用的是什么主题?你是否已经将标志上传到子主题文件夹中的正确路径? - Ali_k
我找不到关于 theme_mod_image_logo 的文档。这不是特定于某个主题吗?你使用那个主题吗? - PaulH
显示剩余8条评论
6个回答

2
我们在一个包含14个类别的博客上做了几乎相同的事情,每个类别都需要显示自己的标志。
在我们的情况下,我们使用了自定义的php代码,在检查url并相应地覆盖主题中的标志显示的同时,从数据库中获取标志路径。
在您的情况下,应该更容易,因为语言变量很容易访问,所以在您的主题header.php中只需围绕标志加上if语句,同时根据语言从数据库(最好是从选项表)中获取标志图像。
//fetch the current language ( you can use https://polylang.pro/doc/function-reference/)

$current_language = pll_current_language();

//while fetching the logo for the current language, it's best if you add a fallback to the default language in case the option for the current language is not set

$logo_image = get_option("logo_".$current_language,"logo_".$pll_default_language());

?> <img class="logo" src="<?php echo $logo_image; ?>"

希望这是你要找的内容。

1
如果您的页面是SEO友好的,并且您更改了<html lang=''>以适应不同的语言,则可以通过jQuery在客户端上更改标志。

1

我不建议在PHP中这样做,因为这会使您的缓存无效,进而影响性能。相反,您应该使用JavaScript、JQuery根据您的语言属性更改徽标。

编辑: 看起来WPML实际上通过安装WPML字符串翻译扩展程序允许这样做。


不确定为什么,但有人对这个答案进行了负评。能否给出解释将会很好。 - EmilCataranciuc
也许是因为没有办法使用JS从服务器获取该标志图像?我很菜,可能完全错误。 - Yoav Vollansky

1
在你的代码中,你已经设置了$default_logo = $logos['en'];并且你的$current_lang值也是'en',因此当你改变语言时,你的$current_lang值需要根据所选语言的简码进行更改,否则你的$default_logo和$value将会相同。

1
function pojo_polylang_get_multilang_logo( $value ) {
if ( function_exists( 'pll_current_language' ) ) {
    $logos = array(
        'en' => 'logo-en.png',
        'in' => 'logo-in.png',
    );
    $default_logo = $logos['en'];
    $current_lang = pll_current_language();
    $assets_url = get_stylesheet_directory_uri() . '/assets/images/';
    if ( isset( $logos[ $current_lang ] ) )
        $value = $assets_url . $logos[ $current_lang ];
    else
        $value = $assets_url . $default_logo;
}
return $value;
}
add_filter( 'theme_mod_image_logo', 'pojo_polylang_get_multilang_logo' );

如果您从 $assets_url $return $value 查看,您将看到一个if语句:
        $assets_url = get_stylesheet_directory_uri() . '/assets/images/';
    if ( isset( $logos[ $current_lang ] ) )
        $value = $assets_url . $logos[ $current_lang ];
    else
        $value = $assets_url . $default_logo;
}
return $value

从我所看到的,我发现if语句中没有包含{},也许如果你改成以下内容就可以工作了?

        $assets_url = get_stylesheet_directory_uri() . '/assets/images/';
    if ( isset( $logos[ $current_lang ] ) ) {
        $value = $assets_url . $logos[ $current_lang ];
    } else {
        $value = $assets_url . $default_logo;
    }
}
return $value

1
你可以轻松地注册一个名为LOGO的字符串,并将所有链接(或名称)放入其中! 步骤1:在functions.php中添加以下代码。
pll_register_string("LOGO","example.com/path/to/images/logo.png"); // this url for default language
步骤2:现在在您的wp-admin中,在Languages下的“string translations”中,您可以在所有语言中使用“LOGO”字段。

preview

第三步: 获取标志URL(所有语言)只需使用此代码:

<?php pll_e("LOGO"); ?>

注意:如果您只想在此字段中放置标志名称,则代码应如下所示:

<?php 
$assets_url = get_stylesheet_directory_uri() . '/assets/images/';
echo $assets_url; pll_e("LOGO"); ?>

不错的想法,但出于某种原因,我只能在标志应该出现的位置打印出单词LOGO。我在header.php中使用它,而不是the_custom_logo();。 - Yoav Vollansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接