wordpress ループでこの HTML 構造を実現しようとすると、問題が発生します。
<ul class="dropdown">
<li>Normal Text Without Child</li>
<li>Link Text Without Child</li>
<li class="has-child">
<a href="#">Link Text With Child</a>
<ul>
<li><a href="#">Child Link Text</a></li>
<li><a href="#">Child Link Text</a></li>
<li><a href="#">Child Link Text</a></li>
<li>Child Normal Text</li>
<li>Child Normal Text</li>
<li>Child Normal Text</li>
</ul>
</li>
<li class="has-child">
Normal Text With Child
<ul>
<li><a href="#">Child Link Text</a></li>
<li><a href="#">Child Link Text</a></li>
<li><a href="#">Child Link Text</a></li>
<li>Child Normal Text</li>
<li>Child Normal Text</li>
<li>Child Normal Text</li>
</ul>
</li>
</ul>
このコードは、 と属性Product
を持つカスタム投稿タイプ Called を表示する責任があるため、投稿を親を持つように設定できます。でこのコードを書きます。これが私の試みです:page
hierarchical
taxonomy-product_category.php
<?php
global $post;
$child = false;
$type = get_term_by('slug',get_query_var('term'),get_query_var('taxonomy'));
$loop = new WP_Query(
array(
'post_type' => 'product',
'orderby' => 'title',
'order' => 'ASC',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_category',
'field' => 'slug',
'terms' => $type->slug
)
),
)
);?>
<?php if($loop->have_posts()){while($loop->have_posts()):$loop->the_post();
$post;
$detail = sunterCustomField('detail'); //metabox that will check if this post able to show link or not
$text = ($detail == 1) ? '<a href="'.get_permalink().'">'.get_the_title().'</a>' : get_the_title();
?>
<li>
<?php echo $text;?>
<?php if($post->post_parent <> 0 && $child == false):?>
<ul>
<li><?php echo $text;?></li>
<?php
$child = true;
endif;?>
<?php if($post->post_parent == 0 && $child == true):?>
</ul>
<?php
$child = false;
endif;?>
</li>
<?php endwhile;} ?>
<?php wp_reset_query(); ?>
注:すべての投稿にリンクがあるわけではなく、同じ用語で投稿タイプのみを照会する必要があるため、 wp_list_pages()を使用できません(そのため、 taxonomy-product_category.php に記述します)。上記のコードの結果です。
<ul class="dropdown">
<li>
<a href="#">A product Chemical 1</a>
<li>
A product Chemical 6 child
<ul>
<li>A product Chemical 6 child</li>
<li>A product Chemical 7 child </li>
<li>B product Chemical 2 </li>
</ul>
</li>
<li><a href="#">C product Chemical 3</a>
</ul>
ほら、正しく表示されません。ロジックがわかりません。
解決 !!
さて、この問題について数時間のグーグル検索の後、最終的に私はそれを解決することができます.したがって、基本的なアイデアは、現在の投稿に子投稿があるかどうかを検出し、現在の投稿がトップレベルの投稿であるかどうかを確認する条件ステートメントです.私が借りたこの素晴らしいスニペットをありがとう少し編集して、私の問題に合うようにします。製品の投稿タイプである関数に投稿タイプの引数を追加しています
function has_children() {
global $post;
$args = array(
'child_of' => $post->ID,
'post_type' => 'product'
);
$pages = get_pages($args);
return count($pages);
}
function is_top_level() {
global $post, $wpdb;
$current_page = $wpdb->get_var("SELECT post_parent FROM $wpdb->posts WHERE ID = " . $post->ID);
return $current_page;
}
そうです、上記のコードは functions.php に追加されています。そして、ここに taxonomy-product_catgeory.php のコードがあります
<?php
$loop = new WP_Query(
array(
'post_type' => 'product',
'orderby' => 'title',
'order' => 'ASC',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_category',
'field' => 'slug',
'terms' => $type->slug
)
),
)
);?>
<?php if($loop->have_posts()){while($loop->have_posts()):$loop->the_post();
$detail = sunterCustomField('detail');
$text = ($detail == 1) ? '<a href="'.get_permalink().'">'.get_the_title().'</a>' : get_the_title();
?>
<?php
if (has_children()) {
?>
<li class="has-child">
<?php echo $text;?>
<ul>
<?php
$args = array(
'child_of' => $post->ID,
'parent' => $post->ID,
'post_type' => 'product',
'hierarchical' => 0
);
$pages = get_pages($args);
foreach ($pages as $page) {
$subdetail = get_post_meta( $page->ID, 'detail', true );
$subtitle = ($subdetail == 1) ? '<a href="'.get_permalink($page->ID).'">'.$page->post_title.'</a>' : $page->post_title;
echo '<li>'.$subtitle.'</li>';
}
?>
</ul>
</li>
<?php
}
if(!is_top_level() && !has_children()){
?>
<li><?php echo $text;?></li>
<?php
}
?>
<?php endwhile;} ?>
<?php wp_reset_query(); ?>