在ul中包含嵌套子帖的包装类型帖子

时间:2013-11-02 01:27:30

标签: php html wordpress

尝试在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,其中包含pagehierarchical属性,因此我可以将帖子设置为拥有父级。我在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(); ?>

1 个答案:

答案 0 :(得分:0)

您需要在第一个</li>之后添加一个结束列表项标记... <li>,并为您的无序列表添加一个结束标记。在产品化学6儿童之后,您需要在打开另一个</ul>之前添加<ul>