Polylang no-translation Redirection

Polylang redirects to home page when it's not able find a translation for current page. Following code will enable it to stay on the same page but still to update the language cookie.

Refresh instead of Redirection

Path

./plugins/polylang/include/switcher.php

Original Code

$url = empty( $url ) || $args['force_home'] ? $links->get_home_url( $language ) : $url; // If the page is not translated, link to the home page

Replace with

$url = $args['force_home'] ? $links->get_home_url( $language ) : $url;

if ($url = empty( $url )) {
    $terminal_url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $url = $terminal_url;
}

Force updating cookie

if (document.getElementsByClassName("no-translation")[0]){
    document.getElementsByClassName("no-translation")[0].firstElementChild.addEventListener("click",update_language_cookie);
}
function update_language_cookie(){
    switch(document.getElementsByClassName("no-translation")[0].firstElementChild.getAttribute("lang"))
    {
        case 'zh-CN':
            writeCookie('zh', 'pll_language');
        break;
        case 'en-US':
            writeCookie('en', 'pll_language');
        break;
        default:
    }
}
function writeCookie(value, name, key) {
    var Days = 365;
    var exp = new Date();
    exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
    if (key == null || key == "") {
        document.cookie = name + "=" + encodeURI(value) + ";expires=" + exp.toGMTString()+";path=/";
    }
    else {
        var nameValue = getCookie(name);
        if (nameValue == "") {
            document.cookie = name + "=" + key + "=" + encodeURI(value) + ";expires=" + exp.toGMTString() + ";path=/";
        }
        else {
            var keyValue = getCookie(name, key);
            if (keyValue != "") {
                nameValue = nameValue.replace(key + "=" + keyValue, key + "=" +encodeURI ( value));
                document.cookie = name + "=" + nameValue + ";expires=" + exp.toGMTString() + ";path=/";
            }
            else { 
                document.cookie = name + "=" + nameValue + "&" + key + "=" + encodeURI(value) + ";expires=" + exp.toGMTString() + ";path=/";
            }
        } 
    }
}

Force delete translation designation

# find designation
SELECT `object_id`, `wp_term_relationships`.`term_taxonomy_id` 
INTO @object_id, @term_taxonomy_id 
FROM `wp_term_taxonomy` 
    INNER JOIN `wp_term_relationships` 
ON `wp_term_taxonomy`.`term_taxonomy_id` = `wp_term_relationships`.`term_taxonomy_id` 
WHERE `taxonomy` LIKE 'language' && `object_id` = [id];
# delete designation
DELETE FROM `wp_term_relationships` 
WHERE `object_id`=@object_id && `term_taxonomy_id` = @term_taxonomy_id;
# update language page count
UPDATE `wp_term_taxonomy` SET `count` = `count`-1 WHERE `term_taxonomy_id` = @term_taxonomy_id;

Query All Languages

functions.php

/*====== Altering the main query with query_posts() ======*/
add_action('pre_get_posts','alter_query');
function alter_query($query) {
    //gets the global query var object
    global $wp_query;
    if ( !$query->is_main_query() )
        return;
    $query-> set('tax_query','');
}

Reference

js 操作cookie cookie路径问题 Three techniques to alter the query in WordPress

License

Polylang is licensed under GPL V2 + or GPL V3+ licence, so is my work. See https://polylang.pro/terms/. GitHub license