Как получить список категорий, назначенных текущей записи?

19 янв. 2011 г., 17:19:33
Просмотры: 3.92K
Голосов: 1

Приведенные ниже функции предназначены для возврата списка записей, которые имеют те же категории, что и текущий просматриваемый пост в single.php

Однако, когда я делаю var_dump для $cat (должен быть список категорий, назначенных текущему посту), я не получаю ожидаемого результата. Нужно ли мне десериализовать массив перед передачей его в запрос get_posts?

function get_cats()
{
$post_cats= array();
$categories = get_the_category();
foreach($categories as $cat){
array_push($post_cats, $cat->cat_ID);
}
return $post_cats;
}

// Получение связанных записей по категории
function ce4_get_related_by_category()
{
global $post;
$cat = implode(',',get_cats());
$catHidden=get_cat_ID('hidden');
$myqueryCurrent = new WP_Query();
$myqueryCurrent->query(array('cat' => "$cat,-$catHidden",'post__not_in' => get_option('sticky_posts')));
$totalpostcount = $myqueryCurrent->found_posts;
if($totalpostcount > 0)
    {
        echo "<ul>";
        $myposts = get_posts(array('cat' => "$cat,-$catHidden",'numberposts' => $cb2_current_count));
        foreach($myposts as $idx=>$post) 
        {
        ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><?php the_excerpt(); ?></li>
        <?php 
        }
        echo "</ul>";
    }
} 
0
Все ответы на вопрос 2
4

Вы можете использовать get_the_category()

Эта функция вернет массив ID категорий, к которым принадлежит текущая запись.


$post_cats = array(); // Создаем пустой массив для хранения ID категорий
$categories = get_the_category(); // Получаем все категории текущей записи
foreach($categories as $cat) : // Перебираем все категории
    array_push($post_cats, $cat->cat_id); // Добавляем ID категории в массив
endforeach;

После выполнения этого кода массив $post_cats будет содержать список всех ID категорий.

19 янв. 2011 г. 17:22:19
Комментарии

Когда я делаю var_dump(get_the_category($post->ID)); кажется, что я получаю полные объекты категорий. Можно ли передать аргумент, чтобы ограничить вывод только списком cat_id?

Scott B Scott B
19 янв. 2011 г. 17:40:15

Вы не можете ограничить вывод только ID, но можно попробовать что-то вроде этого, чтобы получить массив только с ID. (проверьте мой ответ, отредактировано)

Pippin Pippin
19 янв. 2011 г. 17:43:47

Спасибо, Pippin, я обновил свой вопрос с вашими предложениями. При var_dump($cat) я получаю array(1) { [0]=> NULL }. Ожидаю '10,7'

Scott B Scott B
19 янв. 2011 г. 18:00:16

Должно быть $cat->cat_ID в цикле.

Rarst Rarst
19 янв. 2011 г. 18:13:36
4

Вы можете получить массив только идентификаторов следующим образом с помощью wp_get_object_terms():

wp_get_object_terms($id, 'category', array('fields' => 'ids'))

Обратите внимание, что get_the_category() кэширует результаты, и получение идентификаторов из его возвращаемого значения может быть более эффективным, чем отдельное получение идентификаторов с помощью этой функции.

19 янв. 2011 г. 18:08:23
Комментарии

Спасибо, Rarst, нужно ли десериализовать массив перед передачей в $myqueryCurrent и $myposts?

Scott B Scott B
19 янв. 2011 г. 18:24:46

@Scott B согласно вашему текущему коду вам нужно будет пройтись по массиву, чтобы инвертировать значения и добавить их в строку. Я думаю, будет проще использовать category__not_in вместо cat и просто передать массив ID.

Rarst Rarst
19 янв. 2011 г. 18:27:24

Я отредактировал код. Мне просто нужно было применить метод implode к переменной. Кажется, это работает. Теперь мне нужно только убрать текущий пост из цикла вывода.

Scott B Scott B
19 янв. 2011 г. 18:36:02

@Scott B ах, я немного не так понял, думал, вы хотите исключить их, а не включить. Да, в таком случае implode отлично подойдёт.

Rarst Rarst
19 янв. 2011 г. 18:38:46