WordPress меняет якорь «?» на «#» в UTM ссылках, как починить?

Когда WordPress обнаруживает символ "?", он автоматически заменяет его на "#" в URL-адресе, что может привести к потере UTM-меток и других параметров запроса. Это происходит из-за функции redirect_canonical(), которая выполняется в WordPress для управления каноническими URL-адресами.

Чтобы предотвратить изменение символов в URL-адресе, можно использовать фильтр redirect_canonical, который позволит вам изменить логику редиректа.

Пример кода для исправления проблемы с заменой символа "?" на "#" в UTM ссылках:

function custom_redirect_canonical($redirect_url, $requested_url) {
    if (is_404()) {
        return $redirect_url;
    }

    $utm_parameters = array('utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content');

    foreach ($utm_parameters as $param) {
        if (strpos($requested_url, $param . '=') !== false) {
            $redirect_url = add_query_arg($param, get_query_var($param), $redirect_url);
        }
    }

    return $redirect_url;
}

add_filter('redirect_canonical', 'custom_redirect_canonical', 10, 2);

Этот код применяет фильтр custom_redirect_canonical, который проверяет параметры запроса и, если обнаруживает UTM-метки, добавляет их обратно в URL-адрес перенаправления.

Чтобы использовать этот код, его можно добавить в файл functions.php темы или в файл плагина для пользовательских функций. После добавления кода, символ "?" в UTM ссылках не будет заменяться на "#".

Такой подход позволит сохранить UTM-метки и другие параметры запроса в URL-адресе, не допуская их автоматической перезаписи WordPress.