Как сделать ссылку по id?

Ссылка скопирована
1 ответ

Не кидайтесь тухлыми помидорами, прошу.
Вводные:
Есть страница WP, на этой странице есть две вкладки "Было" и "Будет"
По умолчанию, при переходе на страницу из пункта меню, активная вкладка "Будет".
Задача:
Делаю кнопку на главной странице, для вкладки "Было"
Вопрос:
Как вывести (создать) ссылку по ID что бы при переходе по ссылке, активная вкладка была "Было"?
Другими словами:
Из пункта меню переходим на страницу - в этом случае, активная вкладка "Будет";
Переход по кнопке с главной страницы - активная вкладка "Было".
Проблема:
ссылка вида: домен/страница/#id не работает как надо мне
Вот сам код:

<div class="tabs">   <ul class="tab-menu tab-list">     <li class="tab-list__item active"><a href="#will-be">Будет</a></li>     <li><a href="#was">Было</a></li>   </ul>    <div class="tab-content active" id="will-be">     <div class="rotate-block">       <?php       $args = array(         'post_type' => 'cards', // Тип записи         'meta_type' => 'DATETIME',         'meta_query' => array(           array(             'key' => 'data_cont', // Поле даты             'value' => date('Y-m-d'), // Только даты, которые еще не наступили             'compare' => '>=',             'type' => 'DATETIME'           )         ),         'posts_per_page' => -1,         'orderby' => 'meta_value_num',         'meta_key' => 'data_cont',         'order' => 'ASC'       );       $query = new WP_Query($args);        if ($query->have_posts()) :         while ($query->have_posts()) : $query->the_post();           get_template_part('template-parts/content', 'cards');         endwhile;         wp_reset_postdata();       else :         echo '<p>Нет записей для отображения</p>';       endif;       ?>     </div>    </div>    <div class="tab-content" id="was">     <div class="rotate-block">       <?php       $args = array(         'post_type' => 'cards', // Тип записи         'meta_type' => 'DATETIME',         'meta_query' => array(           array(             'key' => 'data_cont', // Поле даты             'value' => date('Y-m-d'), // Только даты, которые уже прошли             'compare' => '<',             'type' => 'DATETIME'           )         ),         'posts_per_page' => -1,         'orderby' => 'meta_value_num',         'meta_key' => 'data_cont',         'order' => 'DESC'       );       $query = new WP_Query($args);        if ($query->have_posts()) :         while ($query->have_posts()) : $query->the_post();           get_template_part('template-parts/content', 'cards');         endwhile;         wp_reset_postdata();       else :         echo '<p>Нет записей для отображения</p>';       endif;       ?>     </div>     <div class="load">       <button id="show-more">Показать ещё</button>     </div>   </div> </div>

<div class="tabs"> <ul class="tab-menu tab-list"> <li class="tab-list__item active"><a href="#will-be">Будет</a></li> <li><a href="#was">Было</a></li> </ul> <div class="tab-content active" id="will-be"> <div class="rotate-block"> <?php $args = array( 'post_type' => 'cards', // Тип записи 'meta_type' => 'DATETIME', 'meta_query' => array( array( 'key' => 'data_cont', // Поле даты 'value' => date('Y-m-d'), // Только даты, которые еще не наступили 'compare' => '>=', 'type' => 'DATETIME' ) ), 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'meta_key' => 'data_cont', 'order' => 'ASC' ); $query = new WP_Query($args); if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); get_template_part('template-parts/content', 'cards'); endwhile; wp_reset_postdata(); else : echo '<p>Нет записей для отображения</p>'; endif; ?> </div> </div> <div class="tab-content" id="was"> <div class="rotate-block"> <?php $args = array( 'post_type' => 'cards', // Тип записи 'meta_type' => 'DATETIME', 'meta_query' => array( array( 'key' => 'data_cont', // Поле даты 'value' => date('Y-m-d'), // Только даты, которые уже прошли 'compare' => '<', 'type' => 'DATETIME' ) ), 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'meta_key' => 'data_cont', 'order' => 'DESC' ); $query = new WP_Query($args); if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); get_template_part('template-parts/content', 'cards'); endwhile; wp_reset_postdata(); else : echo '<p>Нет записей для отображения</p>'; endif; ?> </div> <div class="load"> <button id="show-more">Показать ещё</button> </div> </div> </div>

и js:

<script> 	document.addEventListener("DOMContentLoaded", function() { 		const tabMenuItems = document.querySelectorAll('.tab-menu li'); 		const tabContentItems = document.querySelectorAll('.tab-content');  		tabMenuItems.forEach((item, index) => { 			item.addEventListener('click', () => { 				// Удаляем класс active у всех элементов 				tabMenuItems.forEach((menuItem) => { 					menuItem.classList.remove('active'); 				}); 				tabContentItems.forEach((contentItem) => { 					contentItem.classList.remove('active'); 				});  				// Добавляем класс active к выбранной вкладке 				item.classList.add('active'); 				tabContentItems[index].classList.add('active'); 			}); 		}); 	}); </script>

<script> document.addEventListener("DOMContentLoaded", function() { const tabMenuItems = document.querySelectorAll('.tab-menu li'); const tabContentItems = document.querySelectorAll('.tab-content'); tabMenuItems.forEach((item, index) => { item.addEventListener('click', () => { // Удаляем класс active у всех элементов tabMenuItems.forEach((menuItem) => { menuItem.classList.remove('active'); }); tabContentItems.forEach((contentItem) => { contentItem.classList.remove('active'); }); // Добавляем класс active к выбранной вкладке item.classList.add('active'); tabContentItems[index].classList.add('active'); }); }); }); </script>

Дополнительно:

Очевидно, зависит от того как сделаны вкладки.

  • Aetae,
    <div class="tabs">   <ul class="tab-menu tab-list">     <li class="tab-list__item active"><a href="#will-be">Будет</a></li>     <li><a href="#was">Было</a></li>   </ul>      <div class="tab-content active" id="will-be">     <div class="rotate-block">       <?php       $args = array(         'post_type' => 'cards', // Тип записи         'meta_type' => 'DATETIME',         'meta_query' => array(           array(             'key' => 'data_cont', // Поле даты             'value' => date('Y-m-d'), // Только даты, которые еще не наступили             'compare' => '>=',             'type' => 'DATETIME'           )         ),         'posts_per_page' => -1,         'orderby' => 'meta_value_num',         'meta_key' => 'data_cont',         'order' => 'ASC'       );       $query = new WP_Query($args);        if ($query->have_posts()) :         while ($query->have_posts()) : $query->the_post();           get_template_part('template-parts/content', 'cards');         endwhile;         wp_reset_postdata();       else :         echo '<p>Нет записей для отображения</p>';       endif;       ?>     </div>   </div>    <div class="tab-content" id="was">     <div class="rotate-block">       <?php       $args = array(         'post_type' => 'cards', // Тип записи         'meta_type' => 'DATETIME',         'meta_query' => array(           array(             'key' => 'data_cont', // Поле даты             'value' => date('Y-m-d'), // Только даты, которые уже прошли             'compare' => '<',             'type' => 'DATETIME'           )         ),         'posts_per_page' => -1,         'orderby' => 'meta_value_num',         'meta_key' => 'data_cont',         'order' => 'DESC'       );       $query = new WP_Query($args);        if ($query->have_posts()) :         while ($query->have_posts()) : $query->the_post();           get_template_part('template-parts/content', 'cards');         endwhile;         wp_reset_postdata();       else :         echo '<p>Нет записей для отображения</p>';       endif;       ?>     </div>   </div>

    <div class="tabs"> <ul class="tab-menu tab-list"> <li class="tab-list__item active"><a href="#will-be">Будет</a></li> <li><a href="#was">Было</a></li> </ul> <div class="tab-content active" id="will-be"> <div class="rotate-block"> <?php $args = array( 'post_type' => 'cards', // Тип записи 'meta_type' => 'DATETIME', 'meta_query' => array( array( 'key' => 'data_cont', // Поле даты 'value' => date('Y-m-d'), // Только даты, которые еще не наступили 'compare' => '>=', 'type' => 'DATETIME' ) ), 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'meta_key' => 'data_cont', 'order' => 'ASC' ); $query = new WP_Query($args); if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); get_template_part('template-parts/content', 'cards'); endwhile; wp_reset_postdata(); else : echo '<p>Нет записей для отображения</p>'; endif; ?> </div> </div> <div class="tab-content" id="was"> <div class="rotate-block"> <?php $args = array( 'post_type' => 'cards', // Тип записи 'meta_type' => 'DATETIME', 'meta_query' => array( array( 'key' => 'data_cont', // Поле даты 'value' => date('Y-m-d'), // Только даты, которые уже прошли 'compare' => '<', 'type' => 'DATETIME' ) ), 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'meta_key' => 'data_cont', 'order' => 'DESC' ); $query = new WP_Query($args); if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); get_template_part('template-parts/content', 'cards'); endwhile; wp_reset_postdata(); else : echo '<p>Нет записей для отображения</p>'; endif; ?> </div> </div>

  • Aetae, согласен с Вами! Добавил код, которым реализованы табы.
    Понимаю, что следовало раньше это сделать.
  • Ответы:

    Если я правильно понял, и проблема в том что на лендинге есть два блока и нужно пролистать до нужного до добавьте для блока id, а для кнопки href="id кнопки"

    • Доброго дня. Благодарю за ответ.
      Вы почти правы, за исключением того, что это не лендинг, и вкладки находятся на бругой странице.
    • I_want_to_know, возможно нужно добавить небольшой js код, который будет считывать "id" из адресной строки и открывать нужную вкладку
    • maksam07, Мне кажется в этом нет необходимости. Пропишите в href="названиестраницы.html/id блока"
    • Я добавил код, которым реализованы табы.
      Понимаю, что следовало раньше это сделать.

    Как сделать ссылку по id?

    Как я понял переход не скролом к блоку идет, а блоки в виде табов
    Можно тогда использовать запросы типо домен/страница/?blok=bylo
    Потом на странице смотрим пришло нам blok=bylo или нет, и тогда уже делаем что надо
    И через php можно и через js

    • Я добавил код, которым реализованы табы.
      Понимаю, что следовало раньше это сделать.
    • I_want_to_know,
      Делаем 2 ссылки
      <a href="домен/страница/">Будет</a> <a href="домен/страница/?was">Было</a>

      <a href="домен/страница/">Будет</a> <a href="домен/страница/?was">Было</a>

      А вот сам код, может не самый элегантный, но рабочий

      <? $uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2); ?>  <div class="tabs">   <ul class="tab-menu tab-list">     <li<?php if($uri_parts != 'was'){ echo ' class="tab-list__item active"'; ?>><a href="#will-be">Будет</a></li>     <li<?php if($uri_parts == 'was'){ echo ' class="tab-list__item active"'; ?>><a href="#was">Было</a></li>   </ul>    <div class="tab-content<?php if($uri_parts != 'was'){ echo ' active'; ?>" id="will-be">     <div class="rotate-block">       <?php       $args = array(         'post_type' => 'cards', // Тип записи         'meta_type' => 'DATETIME',         'meta_query' => array(           array(             'key' => 'data_cont', // Поле даты             'value' => date('Y-m-d'), // Только даты, которые еще не наступили             'compare' => '>=',             'type' => 'DATETIME'           )         ),         'posts_per_page' => -1,         'orderby' => 'meta_value_num',         'meta_key' => 'data_cont',         'order' => 'ASC'       );       $query = new WP_Query($args);        if ($query->have_posts()) :         while ($query->have_posts()) : $query->the_post();           get_template_part('template-parts/content', 'cards');         endwhile;         wp_reset_postdata();       else :         echo '<p>Нет записей для отображения</p>';       endif;       ?>     </div>    </div>    <div class="tab-content<?php if($uri_parts == 'was'){ echo ' active'; ?>" id="was">     <div class="rotate-block">       <?php       $args = array(         'post_type' => 'cards', // Тип записи         'meta_type' => 'DATETIME',         'meta_query' => array(           array(             'key' => 'data_cont', // Поле даты             'value' => date('Y-m-d'), // Только даты, которые уже прошли             'compare' => '<',             'type' => 'DATETIME'           )         ),         'posts_per_page' => -1,         'orderby' => 'meta_value_num',         'meta_key' => 'data_cont',         'order' => 'DESC'       );       $query = new WP_Query($args);        if ($query->have_posts()) :         while ($query->have_posts()) : $query->the_post();           get_template_part('template-parts/content', 'cards');         endwhile;         wp_reset_postdata();       else :         echo '<p>Нет записей для отображения</p>';       endif;       ?>     </div>     <div class="load">       <button id="show-more">Показать ещё</button>     </div>   </div> </div>

      <? $uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2); ?> <div class="tabs"> <ul class="tab-menu tab-list"> <li<?php if($uri_parts != 'was'){ echo ' class="tab-list__item active"'; ?>><a href="#will-be">Будет</a></li> <li<?php if($uri_parts == 'was'){ echo ' class="tab-list__item active"'; ?>><a href="#was">Было</a></li> </ul> <div class="tab-content<?php if($uri_parts != 'was'){ echo ' active'; ?>" id="will-be"> <div class="rotate-block"> <?php $args = array( 'post_type' => 'cards', // Тип записи 'meta_type' => 'DATETIME', 'meta_query' => array( array( 'key' => 'data_cont', // Поле даты 'value' => date('Y-m-d'), // Только даты, которые еще не наступили 'compare' => '>=', 'type' => 'DATETIME' ) ), 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'meta_key' => 'data_cont', 'order' => 'ASC' ); $query = new WP_Query($args); if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); get_template_part('template-parts/content', 'cards'); endwhile; wp_reset_postdata(); else : echo '<p>Нет записей для отображения</p>'; endif; ?> </div> </div> <div class="tab-content<?php if($uri_parts == 'was'){ echo ' active'; ?>" id="was"> <div class="rotate-block"> <?php $args = array( 'post_type' => 'cards', // Тип записи 'meta_type' => 'DATETIME', 'meta_query' => array( array( 'key' => 'data_cont', // Поле даты 'value' => date('Y-m-d'), // Только даты, которые уже прошли 'compare' => '<', 'type' => 'DATETIME' ) ), 'posts_per_page' => -1, 'orderby' => 'meta_value_num', 'meta_key' => 'data_cont', 'order' => 'DESC' ); $query = new WP_Query($args); if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); get_template_part('template-parts/content', 'cards'); endwhile; wp_reset_postdata(); else : echo '<p>Нет записей для отображения</p>'; endif; ?> </div> <div class="load"> <button id="show-more">Показать ещё</button> </div> </div> </div>

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Ирина WP Ответ

    Обычная ссылка вида /stranica/#id только прокручивает страницу к элементу с таким ID. Она сама не переключит вкладку, если ваша логика вкладок работает по классу active. Нужно при загрузке страницы прочитать hash из URL и активировать нужную вкладку JavaScript-ом.

    Пример HTML:

    <ul class="tab-menu">
      <li><a href="#will-be" data-tab="will-be">Будет</a></li>
      <li><a href="#was" data-tab="was">Было</a></li>
    </ul>
     
    <div id="will-be" class="tab-panel active">...</div>
    <div id="was" class="tab-panel">...</div>

    <ul class="tab-menu"> <li><a href="#will-be" data-tab="will-be">Будет</a></li> <li><a href="#was" data-tab="was">Было</a></li> </ul> <div id="will-be" class="tab-panel active">...</div> <div id="was" class="tab-panel">...</div>

    JS:

    function activateTab(tabId) {
      document.querySelectorAll('.tab-panel').forEach(function (panel) {
        panel.classList.toggle('active', panel.id === tabId);
      });
     
      document.querySelectorAll('.tab-menu a').forEach(function (link) {
        link.classList.toggle('active', link.dataset.tab === tabId);
      });
    }
     
    document.addEventListener('DOMContentLoaded', function () {
      const initialTab = window.location.hash.replace('#', '') || 'will-be';
      activateTab(initialTab);
     
      document.querySelectorAll('.tab-menu a[data-tab]').forEach(function (link) {
        link.addEventListener('click', function (event) {
          event.preventDefault();
          const tabId = link.dataset.tab;
          activateTab(tabId);
          history.replaceState(null, '', '#' + tabId);
        });
      });
    });

    function activateTab(tabId) { document.querySelectorAll('.tab-panel').forEach(function (panel) { panel.classList.toggle('active', panel.id === tabId); }); document.querySelectorAll('.tab-menu a').forEach(function (link) { link.classList.toggle('active', link.dataset.tab === tabId); }); } document.addEventListener('DOMContentLoaded', function () { const initialTab = window.location.hash.replace('#', '') || 'will-be'; activateTab(initialTab); document.querySelectorAll('.tab-menu a[data-tab]').forEach(function (link) { link.addEventListener('click', function (event) { event.preventDefault(); const tabId = link.dataset.tab; activateTab(tabId); history.replaceState(null, '', '#' + tabId); }); }); });

    Теперь ссылка с главной может вести на /stranica/#was, и вкладка «Было» станет активной после загрузки.

    Если вкладки делает плагин или конструктор, у него может быть свой API или формат ссылок. Тогда лучше использовать его штатный способ. Но принцип тот же: hash в URL должен быть связан с переключением активного таба, а не только с якорной прокруткой.

    Если вкладки находятся ниже по странице, после активации нужной вкладки можно дополнительно прокрутить пользователя к блоку вкладок. Но не делайте это мгновенно до загрузки изображений и шрифтов: иногда браузер промахивается по позиции. Безопаснее вызывать прокрутку после активации таба с небольшой задержкой или использовать scrollIntoView() для контейнера вкладок.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

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

    Вам также может быть интересно