Из этой статьи вы узнаете, как сделать специальную кнопку возврата назад на JS или PHP, чтобы помочь заблудившимся посетителям попасть на предыдущую страницу. А также, как скрыть эту кнопку, если в браузере посетителя отсутствует история переходов по сайту.

Способы создания кнопки «назад» на JavaScript

Чтобы при нажатии кнопки заставить браузер переместиться на одну страницу назад, воспользуемся JavaScript методом history.back(). Объект history отвечает за историю переходов, которые пользователь совершил в переделах одной вкладки браузера. Эти переходы браузер сохраняет в сессию текущего окна. Если предыдущая страница отсутствует, данный вызов метода не делает ничего.

Способ 1

Самый простой способ сделать кнопку «назад» — прописать событие onclick="history.back(); непосредственно в HTML теге. Событие – это сигнал от браузера о том, что что-то произошло. Все DOM-узлы подают такие сигналы.

Скопируйте этот код, вставьте в любом месте своей страницы и протестируйте. Если такой вариант вам подходит, добавьте немного CSS и используйте где угодно.

<a href="#" onclick="history.back();return false;" class="history-back">Вернуться назад</a>

Способ 2

Несмотря на удобство 1 способа всё же правильнее будет настроить события из кода JavaScript методом addEventListener.

Скопируйте этот скрипт и вставьте его на нужную страницу.

<script>
	document.getElementById('history-button').addEventListener('click', () => {
	  history.back();
	});
</script>

В том месте, где требуется установить кнопку, добавьте HTML код:

<button id="history-button">Вернуться назад</button>

Как скрыть кнопку «Вернуться назад» при прямом посещении

Если посетитель сделает прямой переход к странице содержащей кнопку «назад» и воспользуется этой кнопкой, то ничего не произойдёт, так как переходить будет некуда, либо его вернёт обратно на пустую вкладку. Поэтому логичнее будет эту кнопку скрыть.

Для этого будем использовать свойство history.length которое возвращает количество переходов (шагов) вперёд или назад, выполняемых в пределах текущей вкладки или окна.

Рассмотрим несколько возможностей history.length и поведение пользователя:

  • Пользователь посещает страницу с новой вкладки браузера, тогда history.length = 2. Если он кликнет по кнопке «назад», то перейдет на пустую вкладку.
  • Пользователь открывает страницу на новой вкладке или окне, кликая по ссылке, тогда history.length = 1. В этом случае возвращаться будет некуда, т.к. это новая сессия.
  • Пользователь переходит на страницу после посещения нескольких страниц, в этом случае history.length > 2 и теперь мы можем ему показать кнопку «назад». В скрипте применим этот вариант.

Добавим кнопке класс, чтобы скрыть её при прямом заходе с помощью CSS, а когда посетитель выполнит переход с предыдущей страницы — удалим указанный класс методом classList.remove.

Скопируйте скрипт и вставьте на странице, где будет установлена кнопка. Если используете WordPress, то скрипт можно разместить в блоке «Произвольный HTML» редактора Гутенберг.

<script>
	window.addEventListener("load", function() {
		let elem = document.querySelector('#history-button');
		if (window.history.length > 2) {
			elem.addEventListener('click', () => {
				history.back();
			})
			
			elem.classList.remove("history-hide");
		}
	});
</script>

HTML код кнопки будет таким:

<button id="history-button" class="history-hide">Вернуться назад</button>

Стили кнопки:

.history-hide {
	display: none!important;
}
#history-button {
	background: #61a229;
	border-radius: 4px;
	color: #fff;
	font-size: 13px;
	padding: .5em 1em;
	display: inline-block;
	line-height: 1.2;
	margin-bottom: 30px;
	cursor: pointer;
	border: 1px solid #ccc;
}

Ещё свойства объекта history, которые можно использовать для создания кнопок вперёд/назад:

  • history.go(n) — свойство, позволяющее перемещаться по истории. В качестве аргумента передается смещение, относительно текущей позиции. Например, history.go(-2) вернёт вас на две страницы назад. Данный метод сработает только если страница, на которую нужно вернуться, существует в журнале;
  • history.forward() — идентично вызову history.go(-1), т.е. загружает следующую страницу, если она есть в истории. Можно использовать вместе с history.back().

Кнопка возврата назад на PHP

Данный способ подходит для сайтов на PHP, в том числе и для WordPress. Установите этот код в файл с расширением .php в том месте, где требуется вывести кнопку:

<?php
	if(isset($_SERVER['HTTP_REFERER'])) {
		$urlback = htmlspecialchars($_SERVER['HTTP_REFERER']);
		echo "<a href='$urlback' class='history-back'>Вернуться назад</a>"; 
  }
?>

В данном случае реферер, т.е. URL источника запроса, будет всегда пуст если страница загружается не по ссылке, а путем ввода URL-адреса в адресную строку, соответственно, кнопка не отобразится. Она появится когда реферер будет содержать адрес предыдущей страницы.

Кнопка перехода «Назад» с дочерних страниц на родительскую для WordPress

Если стоит задача установить на дочерних страницах кнопку «вернуться назад» с URL-адресом родительской страницы, скопируйте и вставьте в файл page.php этот код:

<?php
    $parentUrl = get_permalink($post->post_parent);
    $parent_title = get_the_title($post->post_parent);
    $current_post = get_the_title();
    if ($parent_title == $current_post) { $parentUrl = '/'; };
?>
<?php //Проверяем, является ли страница родительской или дочерней
	if (wp_get_post_parent_id(get_the_ID())) {
		echo "<a href='$parentUrl' class='history-back'>Вернуться назад</a>";
	}
?>

Где использовать кнопку «назад»

Кнопка «вернуться назад» особенно часто используют пользователи мобильных приложений и сайтов. Её можно добавить на промежуточные и дочерние страницы, на те страницы где отсутствует постраничная навигация и нет блоков с анонсами статей или карточек товаров.

Комментарии

13 Комментариев

  1. Здравствуйте.
    Меня заинтересовал метод "Кнопка перехода «Назад» с дочерних страниц на родительскую".
    post_parent);
    $parent_title = get_the_title($post->post_parent);
    $current_post = get_the_title();
    if ($parent_title == $current_post) { $parentUrl = '/'; };
    ?>

    Если я правильно понимаю, то этот код подходит и для OpenCart (он ведь тоже на PHP сделан), верно?
    Куда именно его нужно вставлять я не совсем понял.

  2. Наталья, сделал по вашему уроку кнопку Назад и скрыл её при прямом посещении, на OpenCart 3. Всё работает отлично! Спасибо за подробное и доступное объяснение!
    Не подскажите, как убрать эту кнопку с Главной страницы? Чтобы она была везде, кроме Главной, даже если есть история переходов.
    Я убрал кнопку с десктопной версии, т.к. она мне нужна была только для мобильных, добавив в css

    @media (min-width: 768px)
    {  #history-button {
         display: none;  }}

    но как это сделать только для Главной страницы не могу разобраться.

    1. Здравствуйте! Чтобы выводить кнопку только для мобильных устройств, вместо CSS, лучше использовать сторонние PHP библиотеки, такие как Mobile_Detect, для определения в OpenCart является ли устройство мобильным, планшетом или десктопом, вот пример:

      require_once 'Mobile_Detect.php';
      $detect = new Mobile_Detect;
      
      if ($detect->isMobile()) {
          // Код для мобильных устройств
      } else {
          // Код для десктопов
      }
      

      Чтобы не выводить кнопку на Главной странице выполните проверку, что пользователь не находится на ней (common/home). В шаблоне продукта или блога это будет, примерно, так:

      if (isset($parent_category_url) && $this->request->get['route'] != 'common/home') {
          <a href="<?php echo $parent_category_url; ?>" rel="nofollow ugc" class="btn btn-primary">Вернуться назад</a>
      }
      
  3. У меня в OpenCart, PHP-код почему-то "комментируется" и видимо поэтому не срабатывает.

    1. PHP будет работать только в файлах php! В самом начале вам нужно было понятнее сформировать вопрос, указать, для каких страниц вам нужна кнопка. В общем, попробуйте так:
      В нужном файле темы twig, удаляете все, что вставляли до того и пишете это:

      <button id="history-button" class="history-hide">Вернуться назад</button>
      <script> 
          window.addEventListener("load", function() {
              let elem = document.querySelector('#history-button');
      
              function checkPage() {
                  // Проверяем, если URL является корневым или содержит 'route=common/home'
                  if (window.location.pathname === '/' || window.location.href.includes('route=common/home')) {
                      elem.classList.add("history-hide");
                  } else if (window.history.length > 2) {
                      elem.classList.remove("history-hide");
                  }
              }
      
              checkPage();
      
              // Добавляем обработчик для истории
              window.addEventListener('popstate', checkPage);
              
              elem.addEventListener('click', () => {
                  history.back();
              });
          });
      </script>
      

      CSS остается тем же, как в статье.
      Проверяйте на уже работающем сайте с доменом, у меня сейчас нет возможности проверить на OpenCart.

      Ежели все заработает, можете угостить кофе.

      1. Отлично! Теперь получилось. Огромное спасибо!
        Кофе угостил)

        1. Как я рада! Спасибо!)

  4. Здравствуйте.
    Пытаюсь теперь добавить кнопку Назад на сайт WordPress, но никак не могу понять в каком файле или каким образом это сделать.
    У меня установлен плагин "Mobile Menu", который отображается только в мобильной версии сайта, вот в нём и хочу установить эту кнопку слева вверху. В настройках самого плагина есть кастомные поля для своих CSS и JS, но вот для HTML такого поля нет.
    Вставить кнопку просто на страницу получается, но хочу добавить её именно в верхнюю плашку, чтобы она была в самом верху, и оставалась там при прокручивании и не перекрывалась ничем.

    1. Здравствуйте! Итак, в документации плагина указано, что в расширенных настройках можно разместить пользовательский jQuery/javascript. Тогда добавьте этот скрипт в Пользовательский JS:

      jQuery(document).ready(function($) {
          // Добавляем кнопку в меню
          let backButtonHtml = '<button id="history-button" class="history-hide"><span>Вернуться назад</span></button>';
          $('#mobmenuleft').append(backButtonHtml);
      
          // Обработка нажатия на кнопку
          window.addEventListener("load", function() {
              let elem = document.querySelector('#history-button');
              if (window.history.length > 2) {
                  elem.addEventListener('click', () => {
                      history.back();
                  });
                  elem.classList.remove("history-hide");
              }
          });
      });
      

      Замените #mobmenuleft на селектор вашего мобильного меню.

      И в Пользовательский CSS добавьте:

      .history-hide {
          display: none!important;
      }
      #history-button {
          /*Тут собственные стили кнопки. Можно разместить иконку, как фон кнопки, тогда текст кнопки (тег <span>) скрыть через свойство clip*/
      }
      
  5. Наталья, здравствуйте!
    а, покажите, как написать админку с редактором типа CKEditor?
    я, как верно и многие, увлекаюсь php самостоятельно.., и
    сожалею, что "открытый код" доступен только
    продвинутым пользователям

    1. Здравствуйте! В сети можно найти уроки по созданию админки от продвинутых, например, поищите "видео PHP. Быстрый старт Админ панель". Чтобы установить CKEditor выполняйте шаги по руководству. Очень легкий метод подключить все из CDN. Или скопировать файлы в папку admin, в нужном месте разместить тег <div id="editor"></div>, подключить скрипты и стили, а потом пишем PHP код для сохранения данных в базу. Также в отдельном файле js нужно написать конфигурацию для подключения плагинов. Не забываем про фильтрацию контента, хотя CKEditor автоматически удаляет небезопасные элементы.

      В другом комментарии вы пишите "Прошу прощения), я прочёл "о вас", и понял, что обратился не по адресу.."

      Согласна. Кстати, если перейдёте на готовое решение административной панели, то в WP или Opencart тоже можно подключить CKEditor.

      1. Спасибо за внимание! Обязательно посмотрю.., и прежде чем переходить на готовые продукты, предпочитаю приготовить сам, чтобы понять как рецепты толковать)..

        1. Спасибо, Егор, за ваш взгляд! Каждый выбирает подход, который ближе к его цели и процессу. Пусть ваш путь принесёт вам не только результат, но и удовольствие от самого процесса.

Оставьте комментарий

Комментарии, считающиеся спамом или исключительно рекламные по своему содержанию, будут удалены. Допускается включение ссылки на соответствующий контент, но текст должен иметь отношение к теме поста. Также будут удалены анонимные, оскорбительные, содержащие ненормативную лексику, вводящие в заблуждение или клеветнические комментарии.

Для публикации кода в комментариях используйте следующие шорткоды -
[php]ваш код[/php] - для PHP, [css]ваш код[/css] - для CSS, [code lang="js"]ваш код[/code] - для HTML или JS, указав соответствующий lang.

Ваш адрес email не будет опубликован. Обязательные поля помечены *