尝试在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
,其中包含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>
看,它看起来不正确。我无法弄清楚逻辑。
解决方案!!
好吧,经过几个小时的谷歌搜索这个问题,最后我可以解决它。所以,基本的想法是条件声明,检测当前帖子是否有子女发帖,并检查当前帖子是否是顶级帖子。谢谢{{3我借用和编辑它的真棒片段,所以它可以适合我的问题。我将post类型args添加到产品发布类型的函数
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(); ?>
答案 0 :(得分:0)
您需要在第一个</li>
之后添加一个结束列表项标记... <li>
,并为您的无序列表添加一个结束标记。在产品化学6儿童之后,您需要在打开另一个</ul>
之前添加<ul>
。