WordPress Change logo image when I click to a different language
Asked Answered
O

7

7

I have a multilingual website. Is there a way I can change the logo.png to a different .png after I switch to "India"? I am using polylang plugin at this moment. I tried this solution but it did not work - https://support.pojo.me/docs/polylang-change-logo-every-language/.

Does any one know how to fix this issue?

my code

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' );
Ovenware answered 24/2, 2018 at 7:33 Comment(13)
I recommend taking the code from the link you've tried and editing the question to put it in. You are far more likely to get help if you show people what you've tried. At face value, the code in that article looks fine so you should also paste any errors you're getting. More detail would be good too. As it stands you have barely any detail. Are you actually using the multi-language Polylang plugin mentioned in that link? The code in that link wouldn't work without that plugin active. Stupid question maybe, but how would I know?Categorical
Sit I Updated my questionOvenware
Are You getting any errors??Subrogate
@Darshkhakhkhar Sir no any errors,image not displayed when I switched the languageOvenware
@Ovenware what value are you getting in $current_lang ?Subrogate
@Darshkhakhkhar Sir, English . short code enOvenware
@Ovenware is $current_lang value is changing when you change the language?? because your default logo is set to $logos['en'] and current_lang value is also en so logo won't change if $current_lang value is not changing.Subrogate
Sir,Im not clear Can you put the answer using my codeOvenware
What theme are you using? Do you have the logos uploaded to the correct path in you child theme folder?Eneidaenema
Forgot to ask if you have a child theme. Also, it would be great if you can copy the full code responsible for displaying your logo.Eneidaenema
@Eneidaenema Sir Im used that theme themeforest.net/item/republik-government-wordpress-theme/…Ovenware
I can't find documentation about theme_mod_image_logo. Isn't that specific to a specific theme? Do you use that theme?Felicle
Can you var_dump(pll_current_language()); or write_log(pll_current_language()); to make sure that the Indian language abbreviation is in . Since if it is returning a different language code always the english language will be used.Comines
M
2

We have done almost the same on a blog that contains 14 categories, and each category had to display its own logo.

In our case, we used custom php code, that checks in the url and overrides the logo display in the theme accordingly, while fetching the logo from the logo path from the db.

In your case, it should be easier since the language variable is easily accessible, so all you need to do in your theme's header.php is a if statement around the logo while fetching the logo image from the database (preferably from the options table) depending on the language.

//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; ?>"

Hope this is what you're looking for.

Mccue answered 19/3, 2018 at 17:29 Comment(0)
S
1

in your code you have set the $default_logo = $logos['en']; and your $current_lang value is also 'en' so when you change the language your $current_lang value need to change as per the selected language's short code otherwise your $default_logo and $value will be the same..

Subrogate answered 19/3, 2018 at 9:57 Comment(0)
P
1

You can easily register a string called LOGO and put all links (or names) in it!

Step 1: Add below code in functions.php

pll_register_string("LOGO","example.com/path/to/images/logo.png"); // this url for default language

Step 2: Now in your wp-admin in "string translations" under Languages, you have "LOGO" field available in all languages.

preview

Step 3: To get logo URL (in all languages) just use this code:

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

Note: if you want put only logo name in this field, your code should be like below:

<?php 
$assets_url = get_stylesheet_directory_uri() . '/assets/images/';
echo $assets_url; pll_e("LOGO"); ?>
Phago answered 24/3, 2018 at 19:28 Comment(1)
Nice idea, but for some reason, I only get the word LOGO printed out where the logo should be. I use this in header.php instead of the_custom_logo();Doomsday
A
1

If your page is SEO Friendly and You change <html lang=''> for different language, then You can change logo on client side by jQuery.

Angie answered 24/3, 2018 at 19:35 Comment(0)
O
1

I don't recommend doing this in PHP since that would invalidate your cache and in turn will affect your performance. Instead you should use JavaScript, JQuery to change the logo based on your lang atribute.

Edit: It looks like WPML actually allows this by installing the WPML String Translations extension.

Osvaldooswal answered 25/3, 2018 at 12:4 Comment(2)
Not sure why but someone down voted this answer. Would be nice to get an explanation.Osvaldooswal
Maybe because there is no way to fetch that logo image from the server using JS? I'm new at this, might be totally wrong.Doomsday
R
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' );

if you have a look from $assets_url to $return $value you will see an if statement :

        $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

from what I am looking at I can see an error as the if statement does not include {} maybe if you changed it to the following it might work?

        $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
Rennold answered 25/3, 2018 at 20:47 Comment(0)
N
0

I take a look at the solution of @aidinMC Nice solution but I rectified:

step 1

You put this in functions.php

pll_register_string('example.com/path/to/images/logo.png','LOGO'); // this url for default language

step 2

in the backoffice appears LOGO fields: that's the multiple language url for the logo

enter image description here

step 3 you put this in the header:

<img src="<?php pll_e("LOGO");?>">
Netti answered 5/6 at 11:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.