Подсчитать все посты с несколькими дочерними терминами в пользовательской таксономии - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть пользовательская иерархическая таксономия, пример ниже:

Filmmaking(?)
--->Production(1)
--->Post-Production (?)
------->VFX (3)
------->Editing(2)
--->Distribution(0)

Я хочу, чтобы счетчик рядом с Filmmaking был счетчиком всех сообщений во всех его дочерних терминах Тем не менее, вложенными они будут. Так что в этом примере это должно читаться как 6 ;

  • Производство 1 сообщение
  • VFX 3 Сообщения
  • Редактирование 2 сообщений.

Аналогично, Post-production будет читать 5

В моем текущем коде счетчик вместо этого подсчитывает, сколько дочерних терминов имеют посты (так что 3 для кинопроизводства), а не сколько постов у них есть .

$getParents = [
    'taxonomy'     => $taxonomy,
    'parent'        => 0,
    'number'        => 0,
    'hide_empty'    => false  
];

$parent_terms = get_terms( $getParents );  

    foreach ( $parent_terms as $parent_term ) {   

    if ( hasChildren($parent_term) ) {

        printIndexHasChildren( $parent_term);
        echo '<ul>';

        echo '<li><a id="'.$parent_term->slug.'" href="'. get_term_link( $parent_term ) .'"> All '. $parent_term->name.'</a></li>';

        //Loop through child items and output name
        foreach ( get_terms( 'kernal_category', array( 'hide_empty' => false, 'parent' => $parent_term->term_id ) ) as $child_term) {                   

            if ( hasChildren( $child_term ) ) {

              printIndexHasChildren( $child_term);
              echo '<ul>';

            //If child has second child
            foreach ( get_terms( 'kernal_category', array( 'hide_empty' => false, 'parent' => $child_term->term_id ) ) as $second_child_term) {

              printIndexNoChildren( $second_child_term );

            }

            echo '</ul>';
            echo '</li>';       

          } else {

            printIndexNoChildren( $child_term );              

          }
        }

        echo '</ul>';
        echo '</li>';

      } else {
        printIndexNoChildren( $parent_term);             
      }     

      }

  }  else {

   ... do something 
  }   
}

Две функции, которые на самом деле записывают меню:

//Printing Independent List Elements
function printIndexNoChildren($term) {
  echo '<li><a id="'.$term->slug.'" href="'. get_term_link( $term ) .'">'. $term->name.' ('.$term->count.')</a></li>';
}


//Print List Elements With Children
function printIndexHasChildren($term) {
  echo '<li><a id="'.$term->slug.'" href="'. get_term_link( $term ) .'">'. $term->name.' ('.$term->count.')</a>';
}

1 Ответ

0 голосов
/ 28 апреля 2020

Редактировать: Недоволен исходным ответом при условии, что я полностью переделал его в виде новой функции с именем countDescendentTerms.

Я вызвал это из двух предыдущих функций printIndexNoChildren и printIndexHasChildren.

function countDescendentTerms($term) {

   if (!$term) 
      return false;

   //Define Arguments to Send to get_terms
      $getTerms = [
        'taxonomy'     => 'kernal_category',
        'parent'        => $term->term_id,
        'hide_empty'    => false  
      ];

   $descendentTerms = get_terms( 'kernal_category', $getTerms  );

   if( !is_wp_error($descendentTerms)) {

      $parentCountX = $term->count;   

      foreach ( $descendentTerms as $firstChildTermX ) {

         if (  hasChildren($firstChildTermX)  ) {           

            foreach ( get_terms(  'kernal_category', array( 'hide_empty' => false, 'parent' => $firstChildTermX->term_id  )  ) as $secondChildTermX  ) {

               if (  hasChildren(   $secondChildTermX    )  ) {

                  foreach ( get_terms(  'kernal_category', array( 'hide_empty' => false, 'parent' => $secondChildTermX->term_id  )  ) as $thirdChildTermX  ) {

                     $thirdChildCountX += $thirdChildTermX->count;                

                  }
               }

               $secondChildCountX += $secondChildTermX->count;

            }

         $totalThirdChildCountX += $thirdChildCountX;
         $thirdChildCountX = 0;

         }

         $firstChildCountX += $firstChildTermX->count;

      }

      $totalPostCountx  = $parentCountX + $firstChildCountX + $secondChildCountX + $totalThirdChildCountX;
      $secondChildCountX = 0;
      return $totalPostCountx;



   } else {
      print_r('Error');
   }  

}

Я вызывал это из двух предыдущих функций printIndexNoChildren и printIndexHasChildren.

//Printing Independent List Elements
function printIndexNoChildren($term) {

   $postCountX = countDescendentTerms( $term );   

   echo '<li><a id="'.$term->slug.'" href="'. get_term_link( $term ) .'">'. $term->name.' ('.$postCountX.')</a></li>';
}

//Print List Elements With Children
function printIndexHasChildren($term, $array = null) { 


   $postCountX = countDescendentTerms( $term );  

   echo '<li><a id="'.$term->slug.'" href="'. get_term_link( $term ) .'">'. $term->name.' ('.$postCountX.')</a>';   
}
...