【问题标题】:Issue with foreach, if, else phpforeach、if、else php 的问题
【发布时间】:2021-10-05 14:34:00
【问题描述】:

我一直在尝试将 else 添加到我的 foreach 循环中,它显示类别和子类别。但是,如果没有可用的类别,那么我希望它显示一个文本,说明类别中没有类别或产品。

现在即使显示了某些类别,它仍然显示类别中没有产品的文本。

<?php

  $taxonomy     = 'product_cat';
  $orderby      = 'menu_order';  
  $show_count   = 0;      // 1 for yes, 0 for no
  $pad_counts   = 0;      // 1 for yes, 0 for no
  $hierarchical = 1;      // 1 for yes, 0 for no  
  $title        = '';  
  $empty        = 1;

  $args = array(
         'taxonomy'     => $taxonomy,
         'orderby'      => $orderby,
         'show_count'   => $show_count,
         'pad_counts'   => $pad_counts,
         'hierarchical' => $hierarchical,
         'title_li'     => $title,
         'hide_empty'   => $empty
  );
 $all_categories = get_categories( $args );
 
      echo '<ul>';
      echo '<div class="category"><h1>CATEGORIES</h1></div>';
 
 foreach ($all_categories as $cat) {
    if($cat->category_parent == 0) {
        $category_id = $cat->term_id; 
        
         echo '<li class="parentcategory">';
        echo '<a href="'. get_term_link($cat->slug, 'product_cat') .'">'. $cat->name .'</a>';
        echo '</li>';
        

        $args2 = array(
                'taxonomy'     => $taxonomy,
                'child_of'     => 0,
                'parent'       => $category_id,
                'orderby'      => $orderby,
                'show_count'   => $show_count,
                'pad_counts'   => $pad_counts,
                'hierarchical' => $hierarchical,
                'title_li'     => $title,
                'hide_empty'   => $empty
        );
        $sub_cats = get_categories( $args2 );
        if($sub_cats) {
            foreach($sub_cats as $sub_category) {
                echo '<li class="subcategory">';
                echo  '<a href="'. get_term_link($sub_category->slug, 'product_cat') .'">'. $sub_category->name .'</a>' ;
                echo '</li>';
            }   
        } 
    }    
else {
          echo '<li>';
          echo '<p>';
          echo 'Currently there is no categories made';
          echo ' or any products in the categories';
          echo '</p>';
          echo '</li>';

   } 
}

 echo '</ul>';
 
?>

【问题讨论】:

  • 我很抱歉这么说,我还没有检查是否有人说过 - 但一致的间距对每个人(包括你)都很重要。我对代码的第一次初始审查让我想知道发生了什么,因为我期待一致的间距。我不在乎您是否需要制表符、3 个空格或 1 个空格(这里有一些情况) - 但请坚持下去。从长远来看,这只会伤害你
  • 实际上,现在我正确地分隔了它 - 我怀疑如果你这样做你会看到你的问题:)

标签: php wordpress if-statement foreach wordpress-theming


【解决方案1】:

您的 if 语句在 foreach 循环中,因此如果有类别,它会写入该类别的名称。如果在最后一个循环中没有类别(或者 category_parrent 不等于 0 [$cat->category_parent ==0]),它会进入 else 语句并告诉您有类别。只需在 foreach 循环之前做一个 if 语句

【讨论】:

    【解决方案2】:

    感谢@Doğuş,我想出了这个解决方案。我在 foreach 循环之前添加了一个if( !empty($all_categories) ){,它似乎按预期工作。它在有类别时显示类别,在没有类别时显示文本。

    如果有人有更好的解决方案,请发布您的答案。

    <?php
    
      $taxonomy     = 'product_cat';
      $orderby      = 'menu_order';  
      $show_count   = 0;      // 1 for yes, 0 for no
      $pad_counts   = 0;      // 1 for yes, 0 for no
      $hierarchical = 1;      // 1 for yes, 0 for no  
      $title        = '';  
      $empty        = 1;
    
      $args = array(
             'taxonomy'     => $taxonomy,
             'orderby'      => $orderby,
             'show_count'   => $show_count,
             'pad_counts'   => $pad_counts,
             'hierarchical' => $hierarchical,
             'title_li'     => $title,
             'hide_empty'   => $empty
      );
     $all_categories = get_categories( $args );
     
          echo '<ul>';
          echo '<div class="categories"><h1>CATEGORIES</h1></div>';
     
     
      if( !empty($all_categories) ){
     
     foreach ($all_categories as $cat) {
        if($cat->category_parent == 0) {
            $category_id = $cat->term_id; 
            
             echo '<li class="parentcategory">';
            echo '<a href="'. get_term_link($cat->slug, 'product_cat') .'">'. $cat->name .'</a>';
            echo '</li>';
            
    
            $args2 = array(
                    'taxonomy'     => $taxonomy,
                    'child_of'     => 0,
                    'parent'       => $category_id,
                    'orderby'      => $orderby,
                    'show_count'   => $show_count,
                    'pad_counts'   => $pad_counts,
                    'hierarchical' => $hierarchical,
                    'title_li'     => $title,
                    'hide_empty'   => $empty
            );
            $sub_cats = get_categories( $args2 );
            if($sub_cats) {
                foreach($sub_cats as $sub_category) {
                    echo '<li class="subcategory">';
                    echo  '<a href="'. get_term_link($sub_category->slug, 'product_cat') .'">'. $sub_category->name .'</a>' ;
                    echo '</li>';
                }   
            } 
        }    
     } }
    else {
         
        
    
              echo '<li>';
              echo '<p>';
              echo 'Currently there is no categories made';
              echo ' or any products in the categories';
              echo '</p>';
              echo '</li>';
       
       } 
    
     echo '</ul>';
     
    ?>
    

    【讨论】:

    • developer.wordpress.org/reference/functions/get_categories get_categories() 无条件返回一个数组。如果数组为空,foreach() 将不会迭代。使用!empty() 毫无意义。 if($sub_cats) { 可以用来检查非空数组。
    • 你是说 if($all_categories) 吗?
    • 对。 if($all_categories)if($sub_cats) { 是不必要的,因为当 $sub_cats 为空时,您没有在 else 中做任何特别的事情。 foreach() 只会在传入的数组非空时迭代。
    • 如果你使用printf(),你可能会发现你的回声更干净。仅举一个例子:stackoverflow.com/a/68116911/2943403 这减少了插值/连接。
    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多