web-dev-qa-db-ja.com

親に基づいてさまざまなカテゴリを表示するためのカテゴリテンプレート

わかりましたので、私はこのようなセットアップのようなカテゴリを持っています。

Products
   Category A
       Sub Category 1
       Sub Category 2
   Category B
   Category C

私が必要としているのは、メインカテゴリ(A、B、C)を表示している商品カテゴリページを持つことです。

サブカテゴリ(1,2)を示すメインのカテゴリページ(A、B、C)。

それから私のカスタム投稿タイプを示すサブカテゴリ(1,2)、すなわち実際の商品。

私はcategory-slug.phpテンプレートを使わないようにしたいのです。なぜなら誰かが新しいカテゴリーを追加するとき、私はそれが親が何であるかに基づいて正しいページに自動的に表示させたいからです。

Category.phpテンプレートを使用することを考えましたが、これが1つのテンプレートで可能かどうか、または必要なコードはわかりません。

最初のカテゴリページ(商品)には、メインのカテゴリ(A、B、C)のみが表示されます。メインセクションにカテゴリリンクのリストだけの投稿は表示されません。だから彼らはページ上の大きなボタンのようにそれらをスタイルすることができます。カテゴリーA、B、Cについても同じです。サブカテゴリを表示します。

最後のカテゴリページ(サブカテゴリ1、2)では、私のカスタム投稿タイプ(実際の商品)が何らかの種類のリストに表示されます。このページには、メインセクションの製品だけで他のカテゴリは表示されません。

私はこれを達成することができる方法についての任意の助けはいただければ幸いです。

ありがとう

更新:私は、正しいカテゴリを表示するためのカテゴリテンプレートを手に入れました。動作しているようですが、まだ正しくテストされていません。

私が今抱えている問題は私のカスタム投稿タイプを最も深いレベルのカテゴリーに表示することです。そのため、カスタム投稿タイプのタイトル、サムネイル、おそらく抜粋などが表示されます。

これが私が使っているコードです。

<?php // list child categories
$cat_id = get_query_var('cat');

$catlist = wp_list_categories('depth=1&hide_empty=0&echo=0&orderby=id&title_li=&child_of=' . $cat_id);

if ($catlist) {
echo $catlist;
} else {
echo "Please don't print No categories";
} ?>

現在、最も深いレベルのカテゴリページには、「カテゴリなし」と表示されています。そのページにそのカテゴリに属する​​私のカスタム投稿タイプを表示させる必要があります。

1
Corbula

しばらくの間インターネットを検索した後、私はついにそれが機能するようになった。

これはfunctions.phpに入ります

function category_has_children() {
global $wpdb;
$term = get_queried_object();
$category_children_check = $wpdb->get_results(" SELECT * FROM wp_term_taxonomy WHERE parent = '$term->term_id' ");
     if ($category_children_check) {
          return true;
     } else {
          return false;
     }
}

これはcategory.phpテンプレートに入ります

<?php

if (!category_has_children()) {?>
<?php foreach(get_the_category() as $category) {
$cat = $category->cat_ID; }?>
<?php query_posts('post_type=Product&cat=' .$cat .'&order=ASC'); ?>
            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
            <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
                    <?php endwhile;?>
        <?php endif; ?> 
<?php get_template_part('loop', 'index');
} else {?>

<?php 
$cat_id = get_query_var('cat');
$catlist = get_categories('child_of=' . $cat_id);
if ($catlist) {
wp_list_categories('depth=1&hide_empty=0&echo=1&orderby=id&title_li=&child_of=' . $cat_id);
} 
}
?>

このコードは、カテゴリにサブカテゴリがある場合はサブカテゴリを表示します。サブカテゴリがない場合は、そのカテゴリの投稿を表示します。私の場合は商品です。カテゴリにサブカテゴリがなく、投稿もない場合は、何も表示されません。

0
Corbula

私はあなたが説明しているようなことをなんとかすることができました、しかしカスタム分類学のために..余分なコードの小さな断片で。コードを書くためのもっと良い方法があることは間違いありません、そしてそれに加えて、これを達成するためのもっともっと効率的な方法がおそらくあるでしょう。

しかし、これはうまくいったし、アクティブなWebサイトに取り組んでいます。私がしたことを説明します。自分のニーズに合わせてコードを変更できます。

私の問題:あなたと同じように、新しい用語ごとにtaxonomy-slug.phpファイルを作成するのではなく、私が送った分類用語を表示するユニバーサルページが欲しいのです。私の分類法では。明確にすると、私のカスタム投稿の種類はビデオ、私のカスタム分類はビデオの種類です。

私の解決策分類法のリストから分類法の用語を取得し(誰かがその用語をクリックしたときに取得)、その特定のカスタム投稿タイプのアーカイブページに送信しました。その用語を読み、そのtaxo0nmy用語を使って投稿タイプを表示するだけです

私のコードこれはウェブのどこかで見つけました。これは関数ファイルに貼り付けられます。

/*add a filter to pass queries to pages
can be sent like so: <?= add_query_arg('t', 'argument', home_url( '/videos/' )); ?>
can be called like so:  $qvar = get_query_var('t');
*/
add_filter('query_vars', 'p_query');

    function p_query($qvars) {
        $qvars[] = 't';
        return $qvars;
    }

ホームページでは、分類の各用語の最新の投稿を表示するためにwp-queryを使用して、クリック可能なリンクとしてさまざまな「ビデオタイプ」をすべてリストしています。

クエリ

$term_args=array(
    'orderby' => 'menu_order',
    'order' => 'DESC'
);
$terms = get_terms($taxonomy,$term_args);
if ($terms) {
  foreach( $terms as $term ) {
    $args=array(
      'post_type' => 'videos',
      'video_types' =>  $term->name ,
      'post_status' => 'publish',
      'posts_per_page' => 1,
      'caller_get_posts'=> 1
      );
    $my_query = null;
    $my_query = new WP_Query($args); 
    if( $my_query->have_posts() ) {  ?>
       <div class="thumb">
        <h3 class="darken"><?php echo $term->name;?></h3>

        <?php
      while ($my_query->have_posts()) : $my_query->the_post(); ?>

リンクループの各項を次のようにリンクにします。

<a href="<?= add_query_arg('t', strtolower($term->name), home_url( '/videos/' )); ?>">
 <h3><?php echo $term->name;?></h3>
</a>

それはそれからarchives-video.phpページへのURLと共にその用語名を送ります。リンクは次のようになります。

http:// thedomainname/videos /?t = theterm

それから、archives-videos.phpページのコードは次のようになります。

アーカイブページ

<?php 

    $taxonomy = 'video_types';
    $qvar = get_query_var('t');
    $orderby      = 'name';
    $show_count   = 0;      // 1 for yes, 0 for no
    $pad_counts   = 0;      // 1 for yes, 0 for no
    $hierarchical = 1;      // 1 for yes, 0 for no
    $title        = '';
    $empty        = 0;

    $term = get_term_by('name', $qvar, $taxonomy);

  $args=array(  
    'taxonomy'     => $taxonomy, 
    'video_types'  => $qvar,
    'orderby'      => $orderby,
    'show_count'   => $show_count,
    'pad_counts'   => $pad_counts,
    'hierarchical' => $hierarchical,
    'title_li'     => $title,
    'hide_empty'   => $empty,
    'posts_per_page' => 8,
    );

        query_posts( $args); ?>




       <div class="vdescription">
        <h3 class="pagetitle"><?php echo $term->name;?></h3>

        <?php
            $termDiscription = $term->description;
                if($termDiscription != '') : ?>
                    <p><?php echo $termDiscription; ?></p>
                <?php endif; ?>
        </div>  <!--.vdescription -->

その下に、その特定の分類学用語のすべてのビデオをリストすることができます。

<?php while (have_posts()) : the_post(); ?>

    <?php the_post_thumbnail(); ?>

<?php endwhile;?>

それで私はそれに私がそれに送るどんなビデオタイプを示すであろう普遍的なページを与える。それはウェブサイトの所有者が彼らが望むどんな新しいビデオタイプも自動的にリンクとしてホームページに表示するものを作ることを許す。

繰り返しになりますが、PHPに関する実用的な知識を持っている人は、これをもっと良い方法で書くことができると思います(ただし、見たいと思います)。

0
endle.winters