微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 WordPress 中使用 Timber/Twig 将父子类别与帖子和显示分组在一起

如何解决在 WordPress 中使用 Timber/Twig 将父子类别与帖子和显示分组在一起

我有以下 wordpress 查询代码在我的 Timber 主题中工作,但我在如何转换为 Timber/Twig 格式方面苦苦挣扎。

$args = array(
  'taxonomy' => 'category','parent' => '7','orderby' => 'name','order' => 'ASC','hide_empty' => false,);
$terms = get_terms( $args );

foreach ( $terms as $term ) {
  $termId = $term->term_id;

  // Output first level of children of parent category ID 7
  echo '<p>' . $term->name . '</p>';

  $args = array(
    'taxonomy' => 'category','child_of' => $termId,);
  $childTerms = get_terms( $args );

  foreach ( $childTerms as $childTerm ) {
    $childTermId = $childTerm->term_id;

    // Output second level of children of parent category ID 7
    echo '<p>' . $childTerm->name . '</p>';

    $args = array(
      'cat' => $childTermId,'orderby' => 'title','posts_per_page' => -1,);

    $query = new WP_Query( $args );
    while( $query->have_posts() ) : $query->the_post();
      // Output posts assigned to second level children categories
      echo '<p><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></p>';
    endwhile;
    wp_reset_postdata();

    // $posts = Timber::get_posts( $args );
  }
}

功能不完整的 Timber/Twig 代码示例

{% for term in terms %}
<div class="category">
  <h3>
    {{ term.name }}
  </h3>
  {% for childTerm in terms %}
    {% if childTerm.parent == term.term_id %}
    <div class="category__child">
      <h4>{{ childTerm.name }}</h4>
      <!-- Output posts from child terms here -->
    </div>
    {% endif %}
  {% endfor %}
</div>
{% endfor %}

HTML 嵌套输出示例

父类

父类

父类

非常感谢任何帮助。

解决方法

首先,您必须更改要发送到视图的数据。 将孩子与父母分组,并将帖子与相应的孩子分组。这可以通过以下方式实现:

<?php
    $data = [];

    $terms = get_terms([
        'taxonomy' => 'category','parent' => '7','orderby' => 'name','order' => 'ASC','hide_empty' => false,]);

    foreach ($terms as $term) {
        /**
        *  Assign parent term to array and initiate children array
        *  Use term id so you can match the children easier with their parent
        **/
        $data[$term->term_id] = [
            'name'      => $term->name,'children'  => [],];

        $childTerms = get_terms([
            'taxonomy' => 'category','child_of' => $term->term_id,]);

        foreach ($childTerms as $childTerm) {
            /**
            *  Assign child term to parent inside array and initiate post array
            *  Use child term id so you can match the post easier with the correct child
            **/
            $data[$term->term_id]['children'][$childTerm->term_id] = [
                'name' => $childTerm->name,'posts' => [],];

            $query = new WP_Query([
                'cat' => $childTerm->term_id,'orderby' => 'title','posts_per_page' => -1,]);

            while($query->have_posts()) {
                $query->the_post();
                $data[$term->term_id]['children'][$childTerm->term_id]['posts'][] = [
                    'url'   => get_the_permalink(),'title' => get_the_title(),];
            }
            wp_reset_postdata();
        }
    }

这将创建一个嵌套数组,它更容易在树枝内部使用,例如

<ul>
{% for parent in data %}
    <li>
        {{ parent.name }}
        {% if parent.children|default %}
            <ul>
            {% for child in parent.children %}
                <li>
                    {{ child.name }}
                    {% if child.posts|default %}
                    <ul>
                    {% for post in child.posts %}
                        <li><a href="{{ post.url }}" title="{{ post.title }}">{{ post.title }}</a></li>
                    {% endfor %}
                    </ul>
                    {% endif %}
                </li>
            {% endfor %}
            </ul>
        {% endfor %}
    </li>
{% endfor %}
</ul>

demo


注意:没有测试 wordpress 部分,因为我不使用 wordpress

,

这是我的 PHP 和 Twig 代码以及@DarkBee 提供的有用解决方案。我希望这对使用 Timber for WordPress 的人有所帮助。

页面故事 PHP

$context = Timber::context();
$timber_post = new Timber\Post();

$data = [];

$terms = get_terms([
  'taxonomy' => 'category',]);

foreach ( $terms as $term ) {  
  /**
   *  Assign parent term to array and initiate children array
   *  Use term id so you can match the children easier with their parent
   **/
  $data[$term->term_id] = [
    'name' => $term->name,'slug' => $term->slug,'children' => [],];

  $childTerms = get_terms([
    'taxonomy' => 'category',]);

  foreach ( $childTerms as $childTerm ) {    
    /**
     *  Assign child term to parent inside array and initiate post array
     *  Use child term id so you can match the post easier with the correct child
     **/
    $data[$term->term_id]['children'][$childTerm->term_id] = [
      'name' => $childTerm->name,];

    $query = new WP_Query([
      'cat' => $childTerm->term_id,]);

    while($query->have_posts()) {
      $query->the_post();
      $data[$term->term_id]['children'][$childTerm->term_id]['posts'][] = [
        'url' => get_the_permalink(),'date' => get_the_date(),];
    }
    wp_reset_postdata();
  }
}

$context['data'] = $data;
Timber::render( array( 'page-' . $timber_post->post_name . '.twig','page.twig' ),$context );

Page Stories Twig

{% for parent in data %}
<div class="category">
  <h3 id="{{ parent.slug }}">
    {{ parent.name }}
  </h3>
  {% if parent.children|default %}
    {% for child in parent.children %}
      <div class="category__child">
        <h4>
          {{ child.name }}
        </h4>
        {% if child.posts|default %}
          {% for post in child.posts %}
          <div class="story">
            <a href="{{ post.url }}" title="{{ post.title }}">
              {{ post.title }}
            </a>
            <span>
              {{ post.date }}
            </span>
          </div>
          {% endfor %}
        {% endif %}
      </div>
    {% endfor %}
  {% endif %}
</div>
{% endfor %}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。