Получение ID текущей категории со страницы поста в WordPress

19 дек. 2013 г., 13:17:46
Просмотры: 24.6K
Голосов: 2

У меня возникла проблема с получением ID категории текущего поста. Мы используем <?php get_the_category( $id ) ?> для определения категории текущего поста. Если пост, например 'demo', имеет 2 категории, такие как cat1 и cat2. Когда я открываю страницу cat1, а затем перехожу на страницу demo, я хочу видеть другую разметку... а когда я открываю страницу cat2, а затем перехожу на страницу demo, я хочу открыть эту страницу demo с другой разметкой. Это можно сделать только когда я определю... из какой категории был вызван пост... но как??

1
Комментарии

Не знаю, получилось ли у вас решить эту проблему, но я только что закончил писать очень подробную функцию навигации по записям для этого, также посмотрите ответ от @G.M. на мой исходный вопрос здесь. Вы можете, взяв код из обоих ответов и объединив их, определить из какой категории пришла одиночная запись, а затем использовать фильтр single_template чтобы задать определенный шаблон

Pieter Goosen Pieter Goosen
8 янв. 2015 г. 09:13:26
Все ответы на вопрос 5
0

В WordPress есть функция wp_get_referer, которая получает URL-адрес источника перехода из HTTP-заголовка. Например, если вы переходите из архива категории на отдельную запись, название категории обычно будет включено в этот URL. Это означает, что вы можете начать ваш single.php следующим образом:

$refer = wp_get_referer();
if (strpos($refer, 'category/cat1') != false) {... делаем что-то ...}
elseif (strpos($refer, 'category/cat2') != false) {... делаем что-то другое ...}
else {... выполняем действие по умолчанию ...}

В зависимости от вашей настройки это решение может потребовать некоторых корректировок, но общая идея, надеюсь, понятна.

3 июл. 2016 г. 19:27:12
8
<?php $categories = get_the_category( $post->ID ); ?>

Это вернет массив категорий, из которого можно получить ID, например так:

$categories[0]-> term_id;

Это будет ID первой категории в массиве, если категорий несколько.

Подробнее об использовании можно узнать в кодексе

19 дек. 2013 г. 14:08:58
Комментарии

Спасибо за информацию. Но мне нужна категория, из которой был вызван пост, а не первая категория.

devjohn devjohn
19 дек. 2013 г. 14:26:29

Извините, возможно, я не совсем понял, что вы имеете в виду под "из которой был вызван пост"?

Gaffen Gaffen
19 дек. 2013 г. 14:27:36

Проще говоря — есть страница категории cat-1, и она отображает все свои посты, например demo. Когда я открываю demo с этой страницы, я хочу, чтобы пост demo открывался в layout-1. А если я открываю пост demo со страницы категории cat-2, то он должен открываться в layout-2.

devjohn devjohn
19 дек. 2013 г. 14:41:53

Я могу сделать это с помощью query string, но не хочу использовать этот способ из-за проблем с URL.

devjohn devjohn
19 дек. 2013 г. 14:45:40

Я бы предложил либо установить категорию как post data, используя либо форму (хотя это не семантично), либо javascript - хотя это не будет работать без javascript, но хотя бы будет плавно деградировать.

Также вам стоит переформулировать ваш вопрос, чтобы лучше отразить, чего вы хотите - изменить макет поста в зависимости от категории, из которой был осуществлен переход - так у вас будет больше шансов получить ответы.

Gaffen Gaffen
19 дек. 2013 г. 15:22:43

Макет поста, чтобы пост выглядел в таком формате (просто внешний вид) или в другом формате.. Если я использую javascript, он также добавляет query string в URL.

devjohn devjohn
20 дек. 2013 г. 07:58:25

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

Gaffen Gaffen
20 дек. 2013 г. 11:46:57

Спасибо за ответ и предложение. Но возможно ли это сделать с использованием каких-то WordPress-трюков, а не PHP?

devjohn devjohn
24 дек. 2013 г. 07:00:01
Показать остальные 3 комментариев
0

Как упомянул Gaffen: "изменение макета записи в зависимости от категории, из которой был осуществлен переход"

Сначала на странице шаблона категории в вашей теме (например, category.php)

получите ID категории и сохраните его в опции WordPress Transient.

global $wp_query;

//получаем ID категории (или название, слаг) и сохраняем в Transient API
$categoryId = $wp_query->queried_object->cat_ID;
set_transient( 'category_id_visited', $categoryId, 1 * HOUR_IN_SECONDS );

Теперь на single.php или на странице шаблона отображения отдельной записи.

получите значение из Transient и измените отображение соответственно

if ( false === ( $category_id_visited = get_transient( 'category_id_visited' ) ) ) {
    // этот код выполняется, если нет установленного валидного transient
    // пока ничего не делаем
} else {
    echo 'Вы перешли из категории: ' . $category_id_visited;
    //удаляем transient, если требуется, иначе он истечет автоматически
    delete_transient( 'category_id_visited' );
}

Надеюсь, это поможет.

21 мар. 2014 г. 11:39:51
0

В вашем файле single.php вы можете использовать, например:

if(has_category('layout-1')) {
  // выполняем действия для категории layout-1 здесь
} elseif (has_category('layout-2')) {
  // действия для layout-2 здесь
} else {
  // действия для всех остальных стилей/обычного контента
}

Еще лучше использовать get_template_part, чтобы не засорять ваш single.php всевозможным лишним кодом.

17 мар. 2015 г. 13:32:17
1

Сначала получаем ID категории:

$cat_id = get_queried_object_id();

Затем получаем название категории:

$cat_name = get_cat_name($cat_id)

Затем в зависимости от названия категории можно определить дальнейшие действия:

if ($cat_name == 'Cat 1') {
   // ... url = layout-1
} elseif ($cat_name == 'Cat 2') {
   // ... url = layout-2
}
17 мар. 2015 г. 17:02:46
Комментарии

$cat_id = get_queried_object_id(); будет возвращать ID записи, а не ID категории, когда вы находитесь на странице записи, как спрашивал автор.

Kevin M Kevin M
15 февр. 2016 г. 23:30:22