web-dev-qa-db-ja.com

ワードプレスの分類用語のget_categories()をフィルタリング

(カスタム)投稿がそのカテゴリ内にあり、かつその投稿のregion = $ nameの場合にのみカテゴリを表示します。

だから、例えば。 "Mamma Mia"という名前のカスタム投稿(タイプ "business")が、子カテゴリ "pizzerias"(および親カテゴリ "food")にあり、地域 "Rotterdam"(カスタム分類: "region"、カスタム)にあります分類学用語:「ロッテルダム」)。

=>表示カテゴリ "pizzerias"(および親カテゴリ "food")

唯一、これを達成する方法がわかりません。私はこのパズルの助けをいただければ幸いです。

<?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
Henk Jan

意図はカテゴリのリストを表示することですが、カスタム分類領域がロッテルダムに設定されている投稿があるカテゴリのみを表示します。

これは 複数の分類法の問い合わせ pluginで行われます。

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

2
scribu

一般的なアイデア - 特定の投稿セットを検索し、それらのカテゴリをすべて収集し、フィルタをかけ、それらを機能的に形にします。

一般的なコード:

$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
));

問題は - 私が覚えているように、複数の分類法に対するまともなクエリはWP 3.1だけになるでしょう、そしてこれは非常に集中的になるかもしれないので(おそらくそれぞれのregionに対して)キャッシングを取ります。

1
Rarst

私が使っているwordpressのバージョンでは、バージョン3.1.2です。もし 'taxonomy' => 'taxonomy_term'を引数の配列に追加するのであれば、うまくいくはずです。そのため、配列に分類法を含めるように元のコードを修正します。使用しようとしている分類名を知らないでください。

<?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
Jay Sauce
<?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現在の猫IDを取得し、このIDを動的にchild_of=$cat_idに渡し、選択した猫の子私は私のサイトのサイドバーでそれを使用しています。

0
user2565

私が何かを逃したならば私を許してください、しかしそれはそれほど単純ではないでしょう。

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

管理者は、投稿を '両方のチェックボックスをクリックして' 'pizzerias'と 'food'の両方にアタッチするのですか、それとも 'pizzerias'だけですか。

後者の場合、the_category()はデフォルトで 'Food'を表示しないので、あなたは自分でカテゴリー階層をつかむ必要があります。

0
TheDeadMedic

私は@ rarstの答えを上記の3つのカスタム分類法を使うように修正しました。ループ内の1つ以上の投稿に添付されている用語のみを書き出します。

これが、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
jacobdubail

あなたは小さな機能でカスタム投稿の分類法を返すことができます。

    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-coreの機能を使うことができます。

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

is_tax()で税金を請求できます。 この条件付きタグについてはcodexを参照してください

たぶんこれは、私があなたの問題を正しく理解したときに役立つでしょう。私の悪い英語ですみません。

0
bueltge

手助けをしてくれてありがとう。本当にすばらしい。私が思い付いたことをあなたと共有したいのですが。私はそれが賢い解決策ではないことを知っています。欠点は、この地域のカスタム投稿が添付されていない場合、その地域の親カテゴリが表示されることです(ただし、他の地域のカスタム投稿は添付されています)。

私は地域(分類アーカイブ)ページでこれを使っています。

<?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
Henk Jan