Отфильтруйте get_categories () для термина таксономии в WordPress

Я хочу показать категорию, только если (пользовательское) сообщение находится в той категории И регионе = $name для того сообщения.

Так, например, у Меня есть пользовательское сообщение (введите "бизнес"), названный "Мамой Mia" в дочерней категории: "пиццерии" (и в родительской категории "еда"), и в регионе "Роттердам" (пользовательская таксономия: "регион", пользовательский термин таксономии: "Роттердам").

=> отображают категорию "пиццерии" (и родительскую категорию "еда")

Только, у меня нет подсказки, как выполнить это. Я ценил бы любую справку на этой загадке.

<?php 

// $filter = array('region'=>$name); 

$categories = get_categories(); 
foreach ($categories as $cat) 
{ 
    if($cat->parent < 1) 
    { 
    $cat_name = $cat->cat_name; 
    $catid = get_cat_ID( $cat_name ); 
    echo $cat_name. '<br/>'; 

    $args=array( 
      'orderby' => 'name', 
      'order' => 'ASC', 
      'child_of' => $catid 
      ); 
    $categories=get_categories($args); 
      foreach($categories as $category) {  
        echo '<a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a><br/>'; 
        }  

    } 
} 

// print_r($categories);  


?>
2
01.12.2010, 09:36
8 ответов

намерение состоит в том, чтобы показать список категорий, но только те категории, которые имеют сообщения, где пользовательский регион таксономии установлен на Роттердам

Это сделано в Запросе Несколько плагин Taxonomies:

http://plugins.trac.wordpress.org/browser/query-multiple-taxonomies/trunk/core.php?rev=308185#L10

2
19.02.2020, 22:28
  • 1
    И более конкретно, в его виджете навигации развертки.Отлично! Теперь это только должно быть расширено для показа родительских категорий также: если сообщение присоединено Pizzerias Я также вижу его, когда я просматриваю Food, но Food не показан в виджете, если сообщение явно не присоединено к нему. –  Jan Fabry 08.12.2010, 09:27

Общее представление - запрашивает для определенного набора сообщений, собирает все их категории, фильтр, позволило функциональному удару их в форме.

Общий код:

$posts = get_posts(array(
    'tag' => 'linux'
));

$categories = array();

foreach( $posts as $post ) {

    $cats = get_the_category($post->ID);

    foreach($cats as $c)
        $categories[] = $c->term_id;
}

$categories = array_unique($categories);
sort($categories);
$categories = implode(',', $categories);

$result = get_categories(array(
    'include' => $categories
));

Проблемы - поскольку я помню, что достойные запросы для нескольких taxonomies только прибудут в WP 3.1, и это могло бы стать очень интенсивным, так возьмет кэширование (вероятно, для каждого region).

1
19.02.2020, 22:28
  • 1
    Как делает include влияние параметра иерархические результаты? Если существуют некоторые сообщения в Pizzerias, но ни одно непосредственно присоединенное к его родителю Food, будет Food быть отображенными? Или отправляет автоматически присоединены к родительским категориям также? –  Jan Fabry 06.12.2010, 16:24
  • 2
    @Jan Fabry протестировал, если только дочерний идентификатор категории передается get_categories() затем родительская категория не получена.:( Таким образом, еще один шаг должен был бы циклично выполниться через категории и получить родителей. Еще большая путаница. –  Rarst 06.12.2010, 16:34
  • 3
    я думаю, что мы должны посмотреть в направлении пользовательского SQL-запроса, присоединившись к нескольким таблицам таксономии. И кэширование, действительно. –  Jan Fabry 06.12.2010, 16:41

На версии Wordpress я использую, который является версией 3.1.2. Если бы необходимо было добавить 'таксономию' => 'taxonomy_term' к массиву args, то это должно работать. Таким образом, вот модификация к Вашему исходному коду для включения таксономии в массив. Не знайте имя таксономии, которое Вы пытаетесь использовать или не хотя:

<?php 

// $filter = array('region'=>$name); 

$categories = get_categories(); 
foreach ($categories as $cat) 
{ 
    if($cat->parent < 1) 
    { 
    $cat_name = $cat->cat_name; 
    $catid = get_cat_ID( $cat_name ); 
    echo $cat_name. '<br/>'; 

    $args=array( 
      'taxonomy' => 'taxonomy_term', 
      'orderby' => 'name', 
      'order' => 'ASC', 
      'child_of' => $catid 
      ); 
    $categories=get_categories($args); 
      foreach($categories as $category) {  
        echo '<a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a><br/>'; 
        }  

    } 
} 

// print_r($categories);  
?>
1
19.02.2020, 22:28

Простите мне, если я пропустил что-то, но был бы он не быть столь же простым как;

if (is_object_in_term($post->ID, 'region', 'rotterdam'))
    the_category(); // displays categories associated with current post

В администраторе Вы присоединяете сообщение к обеим 'пиццериям' и 'еде' (путем отметки обоих флажков) или просто 'пиццериям'?

Если последний, the_category() не покажет 'Еды' по умолчанию, таким образом, необходимо будет захватить иерархию категории сами.

0
19.02.2020, 22:28
  • 1
    Нет, намерение состоит в том, чтобы показать список категорий, но только те категории, которые имеют сообщения где пользовательская таксономия region установлен на Rotterdam. На этом вопросе также задали Так, между прочим. –  Jan Fabry 06.12.2010, 13:28
  • 2
    Если я не неправильно понимаю, это походит на подходящий ответ. Если Mamma Mia pizzeria в rotterdam затем по определению существуют пиццерии в Роттердаме, и категория должна быть отображена. Иначе я не понимаю, как категория, как предполагается, подключена к региону. –  Rarst 06.12.2010, 14:11
  • 3
    @Rarst: путем я понял, что вопрос состоит в том, что список категории нельзя показать только на странице сообщения, но например на region/rotterdam/: для всех сообщений, которые используют этот пользовательский термин таксономии, дайте мне одно дерево всех категорий, они присоединяются также. Использование OP get_categories(), который не ограничен категориями текущего сообщения. спасибо –  Jan Fabry 06.12.2010, 14:48

можно возвратить taxonomie для пользовательского сообщения с маленьким funtion:

    function get_the_taxonomy( $taxonomy, $id = FALSE ) {
        global $post;

        $id = (int) $id;
        if ( !$id )
            $id = (int) $post->ID;

        $categories = get_object_term_cache( $id, $taxonomy );
        if ( FALSE === $categories ) {
            $categories = wp_get_object_terms( $id, $taxonomy );
            wp_cache_add($id, $categories, $taxonomy . '_relationships');
        }

        if ( !empty( $categories ) )
            usort( $categories, '_usort_terms_by_name' );
        else
            $categories = array();

        foreach ( (array) array_keys( $categories ) as $key ) {
            _make_cat_compat( $categories[$key] );
        }

        return $categories;
    }

Также можно использовать функцию wp-ядра:

$taxonomys = get_the_term_list($id, YOUR_CUSTOM_POST_TYPE, '', ', ', '' );

и можно попросить налог с is_tax(), см. кодекс для этого условного тега

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

0
19.02.2020, 22:28
  • 1
    я думаю Henk Jan, хочет получить список категорий, независимых от текущего сообщения. Просто все категории, которые имеют сообщения в них присвоенный пользовательскому термину rotterdam. –  Jan Fabry 07.12.2010, 00:41
  • 2
    Спасибо за подсказку; я думаю это возможный использовать пользовательский запрос с пользовательским термином. Сообщение отдает все условия, и запрос должен использовать все или первый срок для списка в цикле всего сообщения к этому термину. Также возможно возвратить все категории сообщениям в запросе thuis. –  bueltge 07.12.2010, 10:11

Спасибо всем за то, что выручили меня - это является действительно большим. Я хотел бы совместно использовать с Вами, что я придумал. Я знаю, что это не самое умное решение. Недостаток состоит в том, что родительскую категорию показывают для региона, когда нет никакого пользовательского сообщения, присоединенного к ней для этого региона (но существует пользовательское сообщение, присоединенное к ней для другого региона).

Я использую это на регионе (архив таксономии) страница.

<?php
$categories = get_categories();
foreach ($categories as $cat)
{
    if($cat->parent < 1)
    {
        $cat_name = $cat->cat_name;                         
        $catid = get_cat_ID( $cat_name );

        echo '<div class="indexcolumn-top">';

        $img = $taxonomy_images_plugin->get_image_html( 'fullsize', $cat->term_taxonomy_id );
        if( !empty( $img ) )
            print $img;
        else 
            echo '<h2>' .$cat_name. '</h2>';

        $input = array();
        $args=array(
          'child_of' => $catid,
          'orderby' => 'name',
          'order' => 'ASC'
          );

        $categories = get_categories($args);
        foreach ($categories as $cat)
        {
            $cat_name = $cat->cat_name;
            $catid = get_cat_ID( $cat_name );

            $args = array(
                'post_status' => 'publish',
                'taxonomy_name' => 'region',
                'taxonomy_term' => $name,
            );
            $custom_posts = get_posts_by_taxonomy($args);
            if ($custom_posts):
                foreach ($custom_posts as $post):
                    setup_postdata($post);
                    $postcategory = get_the_category(); $postcat = $postcategory[0]->cat_name;
                    if ($postcat == $cat_name):
                        $category = get_the_category(); 
                        $input[] = $catid;
                    endif;
                endforeach;
            endif;
        }
        echo '<br/>';
        $output = array_unique($input);
        if (empty($output)):
            echo '<p>Geen bedrijven</p>';
            echo '</div>';
        else :
            echo '<ul class="port-box">';
            foreach ($output as $output) {
                $cat_name = get_cat_name($output);  
                echo '<li><a href="' . get_category_link($output) . '" title="' . sprintf( __( "View all posts in %s" ), $cat_name ) . '" ' . '>' . $cat_name .'</a></li>';                             
            }
            echo '</ul></div>';
        endif;
    }                                                   
}
?>
0
19.02.2020, 22:28
  • 1
    я не думаю, что это - эффективный способ сделать это: Вы делаете много запросов, и я не понимаю внутренний цикл сообщения: если сообщение найдено в текущей категории, можно ли, вероятно, просто добавить что категория к списку без цикличного выполнения через все сообщения? –  Jan Fabry 08.12.2010, 14:58
  • 2
    @Jan: Я знаю, что это не самое умное решение. Я не понимаю Ваш комментарий о внутреннем цикле сообщения все же. Вам будет нужен внутренний цикл сообщения для нахождения соответствия - или нет. Или, можно ли выйти из цикла в случае хита? Но, как Вы сделали бы это затем? –  Henk Jan 08.12.2010, 16:32
  • 3
    Nevermind, я думал Ваш get_posts_by_taxonomy() функция выбрана и таксономией и категорией. Следующий вопрос состоит в том, почему Вы повторяете этот запрос много раз, вместо того, чтобы делать его однажды и снова использовать результаты. И почему проверка только первая категория? Если бизнес находится в обоих Pizzeria и French Fries, только один из них будет возвращен, таким образом, Вы возможная мисс один в конце. –  Jan Fabry 08.12.2010, 16:45
  • 4
    @Jan: хорошо. Я только проверяю первую категорию, потому что мои компании могут быть в одной категории только. Я не получаю Ваш первый вопрос. Если ($custom_posts): endif; может быть отброшен. Но, необходимо будет циклично выполниться для нахождения соответствия - или нет. Что Вы имеете в виду с многократным использованием? –  Henk Jan 08.12.2010, 17:20
<?php $cat_id = $_GET["cat"];?>     
      <li id="category-active"><a><?php if ($cat_id){echo get_the_category_by_id($li_id);}else{ echo "Selectedcategory";}?></a></li>            <?php   $subcategories1 = wp_list_categories("title_li&child_of=$cat_id&hide_empty");
                wp_list_categories("title_li=&current_category="); ?>
                    </ul><?php ?>

спасибо за помощь.

но я думаю их, не никакая потребность foreach или любого цикла, мы можем получить ребенка любой категории при помощи этого простого кода сначала $li_id получите текущий идентификатор кошки, и мы динамично передали этот идентификатор child_of=$cat_id и это показывает выбранную кошку childs, я использую его на своей боковой панели сайта.

0
19.02.2020, 22:28

Я адаптировал ответ @rarst сверху для использования 3 пользовательских taxonomies. Я только хочу выложить условия, которые присоединены к одному или нескольким сообщений в цикле.

Вот моя функция, которую я добавил к functions.php:

function dv_setup_sidebar_cats() {
    global $wp_query;

    $designers = array();
    $sizes     = array();
    $colors    = array();

    foreach( $wp_query->posts as $post ) {

        $des   = get_the_terms($post->ID, 'designer');
        $siz   = get_the_terms($post->ID, 'size');
        $col   = get_the_terms($post->ID, 'color');    

        foreach($des as $d) {
            $designers[] = $d->term_id;
        }

        foreach($siz as $s) {
            $sizes[] = $s->term_id;
        }

        foreach($col as $c) {
            $colors[] = $c->term_id;
        }

    }

    if ( !empty($designers) ) {
        $designers = array_unique($designers);
        sort($designers);
        $designers = implode(',', $designers);

        $dresult   = get_categories(array(
            'include'  => $designers,
            'taxonomy' => 'designer'
        ));
    }

    if ( !empty($sizes) ) {
        $sizes = array_unique($sizes);
        sort($sizes);
        $sizes = implode(',', $sizes);

        $sresult   = get_categories(array(
            'include'  => $sizes,
            'taxonomy' => 'size'
        ));
    } 

    if ( !empty($colors) ) {
        $colors = array_unique($colors);
        sort($colors);
        $colors = implode(',', $colors);

        $cresult   = get_categories(array(
            'include'  => $colors,
            'taxonomy' => 'color'
        ));
    }

    $return = array(
        'size'     => $sresult,
        'color'    => $cresult,
        'designer' => $dresult
    );


    return $return;

}

Надежда это помогает кому-то еще.

- J

0
19.02.2020, 22:28

Теги

Похожие вопросы