web-dev-qa-db-ja.com

現在のサブカテゴリを表示

問題があります。

<?php query_posts('category_name=events&posts_per_page=2&offset=1'); ?>
<?php while (have_posts()) : the_post(); ?>
<div>
<?php $children = get_categories('child_of=3');
foreach ($children as $child) {
    $child = get_category($child);
    echo $child->cat_name;
}; ?>
</div>
<?php endif; ?>
<?php endwhile; ?>

任意の親カテゴリから現在のサブカテゴリ名を表示したいです。

これで私はただ指定された親からすべてのサブカテゴリ名を出力することに成功しています...

私はthe_category()を使用しませんでした。なぜなら、それはリストにラップされたサブキャット名を出力するからで、マークアップを使わないで欲しいのです。

2
user52339

多くの新規ユーザーが陥る誤解に陥ったのではないかと疑っていますが、実現することはめったにありません。

私はあなたがこれをやったと思う:

a screenshot with the parent and child categories selected at the same time

これは悪いことであり、カテゴリがどのように機能するかについての理解の欠如を示唆しています。また、仮定が物事の現実と一致しない場合、コードに問題が発生します。しかし、心配しないで、誰もがこの間違いを犯します(私も含めて)。

たとえば、家は建物でもあると人々に伝えず、家は建物の一種であることをすでに知っています。そして、猫と犬は彼らが知るための動物であると言う必要はありません。サブカテゴリ「会議」または「関心グループ」に既にある場合、投稿が「イベント」カテゴリにあることをWordPressに伝える必要がないのと同じ方法。 「イベント」カテゴリにはそれらが含まれます。

すべきであったことはこれです:

a screenshot showing only the child category

ここでは、子カテゴリのみにチェックマークを付けましたが、子の下の投稿も親カテゴリのアーカイブ内に表示されます「親」には「子」が含まれているため

子カテゴリは親カテゴリの子孫ではありません。子カテゴリは親カテゴリに含まれています。

あなたの場合、あなたはこれらの問題にぶつかって、投稿の現在のカテゴリーをつかみます:

  • 投稿が含まれるカテゴリに言及しますが、投稿は単一のカテゴリではなく、複数のカテゴリに属する​​ことができます
  • あなたがつかんだカテゴリーは子カテゴリーであると仮定しますが、親カテゴリーもチェックしたので、おそらくあなたがつかんだ親カテゴリーであり、子カテゴリーは次のものです
  • あなたはそれが子カテゴリーであると仮定しましたが、そうではありません。そして今、あなたは親の親カテゴリーを見つけようとしていて、カテゴリーがないので失敗しています。

するべきこと:

  • query_postsの使用をやめて、真剣に、入力時にエディターに叫び声をあげさせ、USBおもちゃに泡のミサイルを発射させ、デスクトップの壁紙を血のプールにしてください絶対に使用しないそれを使用する言い訳はありません。無し。
  • 階層全体のすべての用語のチェックを停止し、必要なサブカテゴリをチェックするだけです。カテゴリには、その特定のボックスをチェックしたサブカテゴリだけでなく、すべてのサブカテゴリが含まれます。
  • 投稿には複数のカテゴリがあり、親/サブカテゴリがなくても、注意してください
  • foreachループは最後にセミコロンを必要としません

だからコード

これはあなたの現在のコードです:

$children = get_categories('child_of=3');
foreach ($children as $child) {
    $child = get_category($child);
    echo $child->cat_name;
}

これにより、すべてのカテゴリ名がリストされます。この例では、親カテゴリと子カテゴリがチェックされているため、次のように出力されます。

parentchild

まず、より汎用的なより優れた関数を使用して、タグとカスタム分類を処理します。

$categories = wp_get_object_terms( get_the_ID(), 'cat');

次に、投稿に実際にカテゴリがあることを確認する必要があります。

if(!empty($categories)){

そして、それはエラーではなかった:

    if(!is_wp_error( $categories )){

だからあなたの用語をループし、ニースリストに入れましょう:

        echo '<ul>';
        foreach($product_terms as $term){

それらを印刷します。

            echo '<li><a href="'.get_term_link($term->slug, 'product').'">'.$term->name.'</a></li>'; 

そしてループを閉じます:

        }
        echo '</ul>';
    }

}

これにより、投稿のすべてのカテゴリの完全なリストが表示されます。さて、あなたが問題を抱えている部分について。サブカテゴリのみを表示します。そのため、カテゴリを表示する前にサブカテゴリであるかどうかを確認する必要がありますが、これは行いません。

そう:

echo the term

になる:

if the term has no parent
    echo the term

以下を実行することで、用語に親があるかどうかを確認できます。

if ( $term->parent != 0 ) {

また、気付いていない問題もあります。2つではなく3つのレベルのカテゴリがある場合はどうなりますか?サブサブカテゴリはどうですか?これを処理するには、おそらく最下位レベルのみを表示するか、サブカテゴリではなくサブカテゴリのみを表示します。そのためには、カテゴリ用語に子があるかどうかを知る必要があります。

また、次の操作を実行して、用語に子があるかどうかを確認できます。

if ( !empty( $term->children ) ) {

最終的なコードのアセンブリは読者のタスクとして残しますが、言われたことを理解すれば、何をする必要があるか(そしてどの行をどこに貼り付けるか)を理解できます。

これにより、両方のカテゴリをチェックするユーザーが修正されることはありませんので、注意する必要があります。これを回避する方法には、ユーザーが標準のチェックボックスUIの代わりにカスタムラジオボックスUIを使用して親カテゴリをチェックできないようにすることが含まれます。

これが、カテゴリアーカイブにサブカテゴリのすべての投稿も含まれている理由でもあります。

用語集

  • タクソノミー-物事を分類するシステム、例えばカテゴリー、タグ、色、カースト、形状
  • Term-分類法の分類子。 「赤」は「色」分類の用語、「パンツ」は「衣類」分類の用語、「猫」は「動物」分類の用語、または「ポップ」は「音楽」の用語ジャンルの分類。用語はそれ自体のものではないことに注意してください。たとえば、ポップソングは「音楽ジャンル」分類の「ポップ」用語に属します
  • カテゴリとタグ-WordPressに付属する2つの組み込み分類法
  • Object-通常は投稿しますが、ユーザーとコメントを用語と分類に入れることもできますが、分類用語に適合するもの
  • -
5
Tom J Nowell

まず最初に、あなたはカスタムクエリを実行するために query_posts を使うべきではありません。コーデックス自体から)

注:この関数はプラグインやテーマで使用するためのものではありません。後で説明するように、メインクエリーを変更するためのより優れた、より高性能なオプションがあります。それは非効率的で(SQLクエリを再実行します)、そして状況によっては完全に失敗するでしょう(特に投稿ページ付けを扱うとき)しばしば最近のWPコードこの目的のために、pre_get_postsフックを使用するなど、より信頼性の高い方法を使用する必要があります。

このカスタムクエリには WP_Query を使用する必要があります。

$args = array(
   'category_name' => 'events',
   'posts_per_page' => 2,
   'offset' => 1
);

 $myquery = new WP_Query( $args );

 while ($myquery->have_posts()) : $myquery->the_post();

 <-----YOUR LOOP CONTENTS----->

endwhile;

wp_reset_postdata();

EDIT 1&EDIT 2

--SCRAPPED--

編集3

これは wp_list_categories() からのコードの回避策です。

最初に get_the_category() を使って親カテゴリのIDを取得する必要があります。

$categories = get_the_category();
$parentid = $categories[0]->category_parent;

この親IDをwp_list_categories()に渡して、その特定の親の子カテゴリのみを表示することができます。子カテゴリが存在しない場合は親カテゴリ名を返し、そうでない場合は親が子を持つ場合は子カテゴリを返します。

これが完全な機能です

<?php 
$taxonomy = 'category';

// get the term IDs assigned to post.
$post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );
// separator between links
$separator = ', ';
$categories = get_the_category();
$parentid = $categories[0]->category_parent;

if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {

    $term_ids = implode( ',' , $post_terms );
    $terms = wp_list_categories( 'title_li=&style=none&echo=0&child_of=' . $parentid . '&taxonomy=' . $taxonomy . '&include=' . $term_ids );
    $terms = rtrim( trim( str_replace( '<br />',  $separator, $terms ) ), $separator );

    // display post categories
    echo  $terms;
}
?>
4
Pieter Goosen