Как вызвать метки из определенной категории wordpress
На страницу 1, 2  След.
Новая тема Написать ответ
# Пт Июн 17, 2011 3:31 amDK Зарег.: 18.06.2008 ; Сообщ.: 2425Ответить с цитатой
Допустим есть категория Колеса, нужно получить все метки постов из этой категории.
# Пт Июн 17, 2011 5:36 amm_Stasuk Зарег.: 23.12.2007 ; Сообщ.: 5967Ответить с цитатой
я правильно понял что у тебя есть категория, в ней несколько постов, у этих постов есть куча меток и именно эти метки тебе надо получить? Те которые у постов в данной категории..
# Пт Июн 17, 2011 9:46 amctapbiu Зарег.: 06.01.2008 ; Сообщ.: 328Ответить с цитатой
http://wordpress.org/support/topic/get-tags-specific-to-category

есть там такое решение:
Код:

function get_category_tags($args) {
   global $wpdb;
   $tags = $wpdb->get_results
   ("
      SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name, null as tag_link
      FROM
         wp_posts as p1
         LEFT JOIN wp_term_relationships as r1 ON p1.ID = r1.object_ID
         LEFT JOIN wp_term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
         LEFT JOIN wp_terms as terms1 ON t1.term_id = terms1.term_id,

         wp_posts as p2
         LEFT JOIN wp_term_relationships as r2 ON p2.ID = r2.object_ID
         LEFT JOIN wp_term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
         LEFT JOIN wp_terms as terms2 ON t2.term_id = terms2.term_id
      WHERE
         t1.taxonomy = 'category' AND p1.post_status = 'publish' AND terms1.term_id IN (".$args['categories'].") AND
         t2.taxonomy = 'post_tag' AND p2.post_status = 'publish'
         AND p1.ID = p2.ID
      ORDER by tag_name
   ");
   $count = 0;
   foreach ($tags as $tag) {
      $tags[$count]->tag_link = get_tag_link($tag->tag_id);
      $count++;
   }
   return $tags;
}



в шаблоне использовать так:
Код:

$args = array(
   'categories'            => '12,13,14'
);
$tags = get_category_tags($args);

$content .= "<ul>";
foreach ($tags as $tag) {
   $content .= "<li><a href=\"$tag->tag_link\">$tag->tag_name</a></li>";
}
$content .= "</ul>";
echo $content;



ЗЫ: код не тестировал
# Пт Июн 17, 2011 9:47 amCodd Зарег.: 13.01.2011 ; Сообщ.: 186Ответить с цитатой
В functions.php шаблона
Код:
function get_tags_in_cat($cat_id)
{
    $posts = get_posts( array('category' => $cat_id) );
    $tags = array();
   
    foreach($posts as $post)
    {
        $post_tags = get_the_tags($post->ID);

        if( !empty($post_tags) )
            foreach($post_tags as $tag)
                $tags[$tag->term_id] = $tag;
       
    }

    return $tags;
}



Получение и вывод тегов
Код:

    $tags = get_tags_in_cat(1);

    foreach($tags as $tag)
        $tags_print[] = '<a href="' .get_tag_link($tag->term_id). '">' .$tag->name. '</a>';

    echo implode(',', $tags_print);


Где 1 - ID категории


Последний раз редактировалось: Codd (Пт Июн 17, 2011 10:00 am), всего редактировалось 1 раз
# Пт Июн 17, 2011 9:50 amctapbiu Зарег.: 06.01.2008 ; Сообщ.: 328Ответить с цитатой
текущую кату можно получить так:
Код:

if (is_category() || is_single()) {
   $cat_ID = get_query_var('cat');
}

# Пт Июн 17, 2011 10:15 amctapbiu Зарег.: 06.01.2008 ; Сообщ.: 328Ответить с цитатой
Codd, в этом варианте будут браться тэги только последних 5 постов категории
# Пт Июн 17, 2011 11:17 amCodd Зарег.: 13.01.2011 ; Сообщ.: 186Ответить с цитатой
Цитата:
Codd, в этом варианте будут браться тэги только последних 5 постов категории


Оффтоп:
уже не могу отредактировать сообщение


Вместо
$posts = get_posts( array('category' => $cat_id) );
надо
$posts = get_posts( array('category' => $cat_id, 'numberposts' => -1) );
# Пт Июн 17, 2011 1:31 pmctapbiu Зарег.: 06.01.2008 ; Сообщ.: 328Ответить с цитатой
Codd, только вот при наличии большого кол-ва постов в категории ф-ция get_tags_in_cat сделает еще больше запросов в БД
там на каждый пост приходится по 2 или 3 запроса
хотя и найденный мною запрос далек от оптимальности

алгоритм как бы я сделал: получил одним запросом все ID постов в указанной категории, вторым запросом получил бы все тэги для найденных постов
# Пт Июн 17, 2011 2:04 pmDK Зарег.: 18.06.2008 ; Сообщ.: 2425Ответить с цитатой
только проснулся, еще не тестировал, вобщем суть такая есть категории от 1000 до 10к постов, нужно разом вывести метки для кажой скопипастить на обычную страницу.

Всем спасибо буду пробовать, тока скажите какой код правильныйSmile
# Пт Июн 17, 2011 2:27 pmctapbiu Зарег.: 06.01.2008 ; Сообщ.: 328Ответить с цитатой
DK, я выложенный код не пробовал
если будет время и дойдут руки, то на выходных попробую
код Codd-а должен работать, но вот как он поведет себя на 1К+ постов сказать сложно, зависит от хостинга
но запросов к БД делает много
# Пт Июн 17, 2011 5:20 pmDK Зарег.: 18.06.2008 ; Сообщ.: 2425Ответить с цитатой
у кода заработал скрипт Smile, спасибо, еще не тестировал на 10к но думаю на локлке должно справится
# Пт Июл 08, 2011 12:37 pmDK Зарег.: 18.06.2008 ; Сообщ.: 2425Ответить с цитатой
а что надо подправить чтобы сортировка была по алфавиту?
# Пт Июл 08, 2011 12:52 pmctapbiu Зарег.: 06.01.2008 ; Сообщ.: 328Ответить с цитатой
Код:

$posts = get_posts( array('category' => $cat_id, 'numberposts' => -1, 'orderby'=>'title') );



параметры сортировки: http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters
# Сб Июл 09, 2011 12:15 pmDK Зарег.: 18.06.2008 ; Сообщ.: 2425Ответить с цитатой
пасип, я просто не знал куда вставитьSmile
# Вс Июл 10, 2011 2:47 pmDK Зарег.: 18.06.2008 ; Сообщ.: 2425Ответить с цитатой
хм, как только не пробовал неправильно соритует Smile , Выводит например метку с первой буковой А метка на букву Б в середине

пробовал и так

$query = new WP_Query( array ( 'orderby' => 'title', 'order' => 'DESC' ) );
и
$query = new WP_Query( array ( 'orderby' => 'title', 'order' => 'ASC' ) );
и
$posts = get_posts( array('category' => $cat_id, 'numberposts' => -1, 'orderby'=>'title') );
и
$posts = get_posts( array('category' => $cat_id, 'numberposts' => -1, 'orderby'=>'name') );
:smk:
Новая тема Написать ответ    ГЛАВНАЯ ~ ТЕХНИЧЕСКИЕ ВОПРОСЫ
 На страницу 1, 2  След.
Любое использование материалов, размещенных на ArmadaBoard.com, без разрешения владельцев ArmadaBoard.com запрещено.