Как сделать ссылку по id?
Не кидайтесь тухлыми помидорами, прошу.
Вводные:
Есть страница 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>
Дополнительно:
Очевидно, зависит от того как сделаны вкладки.
<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>
Понимаю, что следовало раньше это сделать.
Ответы:
Если я правильно понял, и проблема в том что на лендинге есть два блока и нужно пролистать до нужного до добавьте для блока id, а для кнопки href="id кнопки"
- Доброго дня. Благодарю за ответ.
Вы почти правы, за исключением того, что это не лендинг, и вкладки находятся на бругой странице. - I_want_to_know, возможно нужно добавить небольшой js код, который будет считывать "id" из адресной строки и открывать нужную вкладку
- maksam07, Мне кажется в этом нет необходимости. Пропишите в href="названиестраницы.html/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>
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Обычная ссылка вида
/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>
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()для контейнера вкладок.