Этот небольшой скрипт делает так, чтобы незарегистрированные посетители (гости) не могли видеть и кликать по обычным ссылкам на сайте.
Простыми словами:Если пользователь не авторизован (USER_ID = 0),
то скрипт находит все ссылки с классом link и вместо их текста пишет:[Ссылки могут видеть только зарегистрированные пользователи] А при клике по такой «ссылке» человека перекидывает на страницу /index/3 (это страница регистрации пользователя)


Код
<?if($USER_ID$='0')?>
<script>
e=document.getElementsByTagName('A');
for(k=0; k<e.length;k++) {
if(e[k].className=="link"){
e[k].innerHTML = '[<b>Ссылки могут видеть только зарегистрированные пользователи</b>]';
e[k].href = '/index/3';
}
}
</script><?endif?>


Вот мой вариант
Вот более современный, быстрый и лаконичный вариант на чистом JavaScript (ES6+):
Современный вариант (Vanilla JS)
Этот код сразу выбирает только нужные элементы, не тратя ресурсы на остальные ссылки.

Код
<?if($USER_ID$='0')?>  
  <script>  
document.addEventListener("DOMContentLoaded", () => {  
// Выбираем только ссылки с классом 'link'  
const guestLinks = document.querySelectorAll('a.link');  

guestLinks.forEach(link => {  
link.href = '/index/3';  
link.innerHTML = '[<b>Ссылки могут видеть только зарегистрированные пользователи</b>]';  

// Дополнительно: можно убрать title, чтобы не всплывала старая ссылка  
link.removeAttribute('title');  
});  
});  
  </script>  
  <?endif?>


Что изменилось и почему это лучше:
* querySelectorAll('a.link'): Вместо того чтобы перебирать тысячи ссылок через getElementsByTagName и проверять каждую условием if, мы сразу просим браузер найти только те, у которых есть нужный класс. Это гораздо быстрее.

* DOMContentLoaded: Мы оборачиваем код в обработчик события. Это гарантирует, что скрипт сработает только тогда, когда весь текст страницы загрузился, и не «пропустит» ни одну ссылку.

* forEach: Более читаемый и современный способ перебора массива по сравнению с классическим циклом for.

Можно ли сделать еще лучше?
Если вы хотите, чтобы ссылки скрывались мгновенно (еще до того, как скрипт сработает), можно добавить небольшой CSS-код:

Код
<?if($USER_ID$='0')?>  
  <style>  
/* Скрываем содержимое ссылок, пока JS их не обработает, чтобы не было «мигания» контента */  
a.link { font-size: 0; }  
a.link::before {
content: '[Загрузка...]';
font-size: 14px;
color: gray;  
}  
  </style>  
  <?endif?>