默认 Discuz X 门户支持三级栏目的,但是如果添加四级需要修改程序才可以,具体是
修改 source/admincp/admincp_portalcategory.php 的 751-767 行代码,把

  1.         if($level == 2) {
  2.                 $class = $last ? 'lastchildboard' : 'childboard';
  3.                 $return = '<tr
    id="cat'.$value['catid'].'"><td>&nbsp;</td><td
    ><input type="text"
    name="neworder['.$value['catid'].']" value="'.$value['displayorder'].'"
    /></td><td><div ">'.
  4.                 '<input type="text" name="name['.$value['catid'].']" value="'.$value['catname'].'" />'.
  5.                 '</div>'.
  6.                 '</td><td>'.$value['articles'].'</td>'.
  7.                 '<td>'.(empty($value['disallowpublish']) ? cplang('yes') : cplang('no')).'</td>'.
  8.                 '<td>'.(!empty($value['allowcomment']) ? cplang('yes') : cplang('no')).'</td>'.
  9.                 '<td>'.(empty($value['closed']) ? cplang('yes') : cplang('no')).'</td>'.
  10.                 '<td><input type="radio"
    name="newsetindex" value="'.$value['catid'].'" '.($value['caturl'] ==
    $_G['setting']['defaultindex'] ? 'checked="checked"':'').'
    /></td>'.
  11.                 '<td><a href="'.$value['caturl'].'" target="_blank">'.cplang('view').'</a>&nbsp;
  12.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=edit&catid='.$value['catid'].'">'.cplang('edit').'</a>&nbsp;
  13.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=move&catid='.$value['catid'].'">'.cplang('portalcategory_move').'</a>&nbsp;
  14.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=delete&catid='.$value['catid'].'">'.cplang('delete').'</a>&nbsp;
  15.                 <a
    href="'.ADMINSCRIPT.'?action=diytemplate&operation=perm&targettplname=portal/list_'.$value['catid'].'&tpldirectory='.getdiydirectory($value['primaltplname']).'">'.cplang('portalcategory_blockperm').'</a></td>
  16.                 <td><a
    href="'.ADMINSCRIPT.'?action=article&operation=list&&catid='.$value['catid'].'">'.cplang('portalcategory_articlemanagement').'</a>&nbsp;
  17.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=perm&catid='.$value['catid'].'">'.cplang('portalcategory_articleperm').'</a>'.$publish.'</td></tr>';

替换为

  1.         if ($level == 3) {
  2.                 $class = $last ? 'lastthirdboard' : 'thirdboard';
  3.                 $return = '<tr
    id="cat'.$value['catid'].'"><td>&nbsp;</td><td
    ><input type="text"
    name="neworder['.$value['catid'].']" value="'.$value['displayorder'].'"
    /></td><td><div ">'.
  4.                 '<input type="text" name="name['.$value['catid'].']" value="'.$value['catname'].'" />'.
  5.                 '</div>'.
  6.                 '</td><td>'.$value['articles'].'</td>'.
  7.                 '<td>'.(empty($value['disallowpublish']) ? cplang('yes') : cplang('no')).'</td>'.
  8.                 '<td>'.(!empty($value['allowcomment']) ? cplang('yes') : cplang('no')).'</td>'.
  9.                 '<td>'.(empty($value['closed']) ? cplang('yes') : cplang('no')).'</td>'.
  10.                 '<td><input type="radio"
    name="newsetindex" value="'.$value['catid'].'" '.($value['caturl'] ==
    $_G['setting']['defaultindex'] ? 'checked="checked"':'').'
    /></td>'.
  11.                 '<td><a href="'.$value['caturl'].'" target="_blank">'.cplang('view').'</a>&nbsp;
  12.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=edit&catid='.$value['catid'].'">'.cplang('edit').'</a>&nbsp;
  13.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=move&catid='.$value['catid'].'">'.cplang('portalcategory_move').'</a>&nbsp;
  14.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=delete&catid='.$value['catid'].'">'.cplang('delete').'</a>&nbsp;
  15.                 <a
    href="'.ADMINSCRIPT.'?action=diytemplate&operation=perm&targettplname=portal/list_'.$value['catid'].'&tpldirectory='.getdiydirectory($value['primaltplname']).'">'.cplang('portalcategory_blockperm').'</a></td>
  16.                 <td><a
    href="'.ADMINSCRIPT.'?action=article&operation=list&&catid='.$value['catid'].'">'.cplang('portalcategory_articlemanagement').'</a>&nbsp;
  17.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=perm&catid='.$value['catid'].'">'.cplang('portalcategory_articleperm').'</a>'.$publish.'</td></tr>';
  18.         }elseif($level == 2) {
  19.                 $class = $last ? 'lastchildboard' : 'childboard';
  20.                 $return = '<tr
    id="cat'.$value['catid'].'"><td>&nbsp;</td><td
    ><input type="text"
    name="neworder['.$value['catid'].']" value="'.$value['displayorder'].'"
    /></td><td><div ">'.
  21.                 '<input type="text" name="name['.$value['catid'].']" value="'.$value['catname'].'" />'.
  22.                 '<a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=add&upid='.$value['catid'].'">'.cplang('portalcategory_addfourthcategory').'</a></div>'.
  23.                 '</td><td>'.$value['articles'].'</td>'.
  24.                 '<td>'.(empty($value['disallowpublish']) ? cplang('yes') : cplang('no')).'</td>'.
  25.                 '<td>'.(!empty($value['allowcomment']) ? cplang('yes') : cplang('no')).'</td>'.
  26.                 '<td>'.(empty($value['closed']) ? cplang('yes') : cplang('no')).'</td>'.
  27.                 '<td><input type="radio"
    name="newsetindex" value="'.$value['catid'].'" '.($value['caturl'] ==
    $_G['setting']['defaultindex'] ? 'checked="checked"':'').'
    /></td>'.
  28.                 '<td><a href="'.$value['caturl'].'" target="_blank">'.cplang('view').'</a>&nbsp;
  29.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=edit&catid='.$value['catid'].'">'.cplang('edit').'</a>&nbsp;
  30.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=move&catid='.$value['catid'].'">'.cplang('portalcategory_move').'</a>&nbsp;
  31.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=delete&catid='.$value['catid'].'">'.cplang('delete').'</a>&nbsp;
  32.                 <a
    href="'.ADMINSCRIPT.'?action=diytemplate&operation=perm&targettplname=portal/list_'.$value['catid'].'&tpldirectory='.getdiydirectory($value['primaltplname']).'">'.cplang('portalcategory_blockperm').'</a></td>
  33.                 <td><a
    href="'.ADMINSCRIPT.'?action=article&operation=list&&catid='.$value['catid'].'">'.cplang('portalcategory_articlemanagement').'</a>&nbsp;
  34.                 <a
    href="'.ADMINSCRIPT.'?action=portalcategory&operation=perm&catid='.$value['catid'].'">'.cplang('portalcategory_articleperm').'</a>'.$publish.'</td></tr>';
  35.                         for($i=0,$L=count($value['children']); $i<$L; $i++) {
  36.                         $return .= showcategoryrow($value['children'][$i], 3, $i==$L-1);
  37.                 }

然后再在 staticimageadmincpadmincp.css 的 317 行后添加

  1.         .thirdboard{ padding-left:165px; background:url(bg_repno.gif) no-repeat -130px -550px; }
  2.         .lastthirdboard{ padding-left:165px; background:url(bg_repno.gif) no-repeat -130px -600px; }

在 sourcelanguagelang_admincp.php 的 6590 下添加

  1.         'portalcategory_addfourthcategory' => '添加四级频道栏目',

这样就可以在频道栏目中就可以看到第四级的栏目设置了