Вопрос или проблема
Отобразить выбранную категорию на странице поста
Предположим, что у нас есть пост, который принадлежит двум или более категориям, и мы хотим отобразить на странице поста выбранную категорию, через которую мы попали на эту страницу. Какой лучший метод? Хранить ID категории в сессии или во временном параметре запроса? Или что-то другое?
Спасибо
Мне лично нравится брать все категории, к которымattached пост, и добавлять к ним активный класс. Вот код, который я нашел и в данный момент использую.
/** Активная категория **/
// Только для одиночных постов
function singlePostActiveCat ($CatText) {
global $post;
if (is_singular()) {
$categories = wp_get_post_categories($post->ID);
foreach ($categories as $category_id) {
$category = get_category($category_id);
$CatText = preg_replace(
"/class=\"(.*)\"><a ([^<>]*)>$category->name<\/a>/",
' class="$1 current-cat"><a $2>' . $category->name . '</a>',
$CatText);
}
}
return $CatText;
}
add_filter('wp_list_categories', 'singlePostActiveCat');
Чтобы получить только категорию, через которую вы попали на пост, вы можете использовать переменные запроса:
$category_name = get_query_var( 'category_name', 'Нет категории' );
echo ('Категория: ' . $category_name);
Второй аргумент для get_query_var — это значение по умолчанию, которое используется, когда никакая категория не возвращается.
Надеюсь, это поможет!
Я знаю, что это старый вопрос, но мне показалось, что я все равно могу высказать свое мнение.
Думаю, я бы сделал это с помощью GET-запроса.
Ниже приведенный код не был протестирован.
Итак, в вашем файле category.php
добавьте ID категории, из которой пришел посетитель, следующим образом:
$category = get_the_category();
$link_to_the_post="<a href="" . the_permalink() . '?cat_id=' . $category['ID'] . '">Ссылка на пост</a>';
А затем проверьте этот параметр в single.php
, следующим образом:
if( !empty( $_GET['cat_id'] ){
$category = get_the_category( $_GET['cat_id'] );
echo 'Категория: ' . $category['name'];
} else {
// Резервный вариант, показывающий все категории (в случае, если посетитель пришел из другого места)
the_category();
}
Ответ или решение
Чтобы отобразить выбранную категорию на страницах постов, нам следует рассмотреть несколько подходов. Наилучшим решением будет использование параметра запроса (query string) для передачи идентификатора категории, от которой пришел пользователь, а затем извлечение и отображение этой информации на странице поста.
Пример реализации
- Передача идентификатора категории через ссылку
На странице категорий (например, category.php
) мы можем создать ссылку на пост с передачей идентификатора категории в URL. Ниже приведён пример кода:
$categories = get_the_category();
foreach ($categories as $category) {
$link_to_the_post = '<a href="' . get_permalink() . '?cat_id=' . $category->term_id . '">Ссылка на пост</a>';
echo $link_to_the_post;
}
- Получение и отображение выбранной категории на странице поста
На странице одиночного поста (например, single.php
) мы можем проверить наличие переданного параметра cat_id
и отобразить соответствующую категорию следующим образом:
if (!empty($_GET['cat_id'])) {
$category_id = intval($_GET['cat_id']); // Приведение к целому числу для безопасности
$category = get_category($category_id);
if ($category) {
echo 'Категория: ' . esc_html($category->name);
}
} else {
// Показать все категории в случае, если не передан параметр
echo 'Категории: ';
the_category(', ');
}
Альтернатива: использование сессий
Если вы хотите, чтобы выбранная категория сохранялась между страницами или сессиями пользователя, вы можете рассмотреть использование PHP-сессий, однако это может быть избыточным для данной задачи. Примерный код добавления идентификатора категории в сессию может выглядеть так:
session_start();
if (!empty($_GET['cat_id'])) {
$_SESSION['selected_category'] = intval($_GET['cat_id']);
}
А на странице поста проверяйте сессию:
if (!empty($_SESSION['selected_category'])) {
$category_id = $_SESSION['selected_category'];
$category = get_category($category_id);
if ($category) {
echo 'Категория: ' . esc_html($category->name);
}
} else {
// Показать все категории
echo 'Категории: ';
the_category(', ');
}
Заключение
Использование параметра запроса (GET
) является наилучшим и простым решением для этой задачи. Он позволяет легко передавать информацию о категории без необходимости в дополнительных хранилищах, таких как сессии. Выбор метода должен зависеть от ваших задач и предпочтений, однако указанные подходы достаточно просты в реализации и эффективно решают проблему отображения выбранной категории на странице поста.