3

私はこのような配列を持っています:

Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [menu_item_parent] => 0
            [title] => Home
            [url] => http://www.example.com/
        )

    [1] => stdClass Object
        (
            [ID] => 2
            [menu_item_parent] => 0
            [title] => Menu 2
            [url] => http://www.example.com/menu-2/
        )

    [2] => stdClass Object
        (
            [ID] => 3
            [menu_item_parent] => 2
            [title] => Sub Menu 1
            [url] => http://www.example.com/menu-2/sub-menu-1
            [target] => 
        )

    [3] => stdClass Object
        (
            [ID] => 4
            [menu_item_parent] => 0
            [title] => Menu 4
            [url] => http://www.example.com/menu-4/
            [target] => 

        )
)

これで、配列の3番目のアイテムが2番目の配列アイテムの子アイテムであることがわかります(列を参照menu_item_parent)。次に、この配列を使用して、この親アイテムとその子アイテムを表示するにはどうすればよいですか。

4

6 に答える 6

5

最後に、@Matt.Cのリンクを使用して問題を解決します。@Matt.Cに感謝します。解決策は次のとおりです。

まず、メニュー項目をフラット配列として取得します。

<?php
$menu_name = 'main_nav';
$locations = get_nav_menu_locations();
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menuitems = wp_get_nav_menu_items( $menu->term_id, array( 'order' => 'DESC' ) );
?>

次に、メニュー項目の配列を繰り返し処理します。

<nav>
<ul class="main-nav">
    <?php
    $count = 0;
    $submenu = false;

    foreach( $menuitems as $item ):
        // get page id from using menu item object id
        $id = get_post_meta( $item->ID, '_menu_item_object_id', true );
        // set up a page object to retrieve page data
        $page = get_page( $id );
        $link = get_page_link( $id );

        // item does not have a parent so menu_item_parent equals 0 (false)
        if ( !$item->menu_item_parent ):

        // save this id for later comparison with sub-menu items
        $parent_id = $item->ID;
    ?>

最初の親アイテムを書く<li>:

 <li class="item">
        <a href="<?php echo $link; ?>" class="title">
            <?php echo $page->post_title; ?>
        </a>
        <a href="<?php echo $link; ?>" class="desc">
            <?php echo $page->post_excerpt; ?>
        </a>
    <?php endif; ?>

このアイテムの親IDが保存されている親IDと一致することを確認してください。

     <?php if ( $parent_id == $item->menu_item_parent ): ?>
Start sub-menu <ul> and set $submenu flag to true for later referance:

            <?php if ( !$submenu ): $submenu = true; ?>
            <ul class="sub-menu">
            <?php endif; ?>
Write the sub-menu item:

                <li class="item">
                    <a href="<?php echo $link; ?>" class="title"><?php echo $page->post_title; ?></a>
                    <a href="<?php echo $link; ?>" class="desc"><?php echo $page->post_excerpt; ?></a>

次の項目に同じ親IDがなく、サブメニューが宣言されている場合は、サブメニューを閉じます<ul>

<?php if ( $menuitems[ $count + 1 ]->menu_item_parent != $parent_id && $submenu ): ?>
        </ul>
        <?php $submenu = false; endif; ?>

<?php endif; ?>

繰り返しますが、配列内の次のアイテムに同じ親IDがない場合は、<li>

  <?php if ( $menuitems[ $count + 1 ]->menu_item_parent != $parent_id ): ?>
    </li>                           
    <?php $submenu = false; endif; ?>

<?php $count++; endforeach; ?>
  </ul>
</nav> 
于 2013-03-12T14:50:01.643 に答える
2

これを試してください:入力を配列として追加し、質問に従ってオブジェクトに変更します。

$array  = Array( array("ID" => 1,"menu_item_parent" => 0,"title" => "Home","url" => "http://www.example.com/"),
                 array("ID" => 2,"menu_item_parent" => 0,"title" => "Menu 2","url" => "http://www.example.com/menu-2/"),
                 array("ID" => 3,"menu_item_parent" => 2,"title" => "Sub Menu 1","url" => "http://www.example.com/menu-2/sub-menu-1","target" =>"" ),
                 array("ID" => 4,"menu_item_parent" => 0,"title" => "Menu 4","url" => "http://www.example.com/menu-4/","target" => "")
          );

$res   = array();         
foreach($array as $val){
   if($val['menu_item_parent'] != 0){
       $res[$val['menu_item_parent']]['child'][] = $val;
   }
   else{
       $res[$val['ID']] = $val;
   }
}

echo "<pre>";
print_r($res);

出力:

Array
(
    [1] => Array
        (
            [ID] => 1
            [menu_item_parent] => 0
            [title] => Home
            [url] => http://www.example.com/
        )

    [2] => Array
        (
            [ID] => 2
            [menu_item_parent] => 0
            [title] => Menu 2
            [url] => http://www.example.com/menu-2/
            [child] => Array
                (
                    [0] => Array
                        (
                            [ID] => 3
                            [menu_item_parent] => 2
                            [title] => Sub Menu 1
                            [url] => http://www.example.com/menu-2/sub-menu-1
                            [target] => 
                        )

                )

        )

    [4] => Array
        (
            [ID] => 4
            [menu_item_parent] => 0
            [title] => Menu 4
            [url] => http://www.example.com/menu-4/
            [target] => 
        )

)
于 2013-03-12T13:10:50.137 に答える
2

get_submenuこれは、すべてのサブメニュー項目を返す関数を使用したWordpress固有の問題の非常に単純なクラスです。

class NestedMenu
{
    private $flat_menu;
    public $items;

    function __construct($name)
    {
        $this->flat_menu = wp_get_nav_menu_items($name);
        $this->items = array();
        foreach ($this->flat_menu as $item) {
            if (!$item->menu_item_parent) {
                array_push($this->items, $item);
            }
        }
    }

    public function get_submenu($item)
    {
        $submenu = array();
        foreach ($this->flat_menu as $subitem) {
            if ($subitem->menu_item_parent == $item->ID) {
                array_push($submenu, $subitem);
            }
        }
        return $submenu;
    }
}

使用法。インスタンスを作成します。

$menu = new NestedMenu('menu_name');

繰り返します:

foreach ($menu->items as $item) { ...

そして、ループ内のサブメニューを取得します。

$submenu = $menu->get_submenu($item);

サブメニューを表示する前に、サブメニューが存在するかどうかを確認できます。

if ($submenu): ...
于 2014-07-08T17:50:55.530 に答える
1

phpでforeach関数を使用して確認してください。お気に入り

$array = array("apple" => 1, "orange" => 2);
$sep = "";
foreach($array as $key => $value) {
  if($sep) {
    $sep .= "<br/>key:".$key." / value:".$value;
  } else {
    $sep = "key:".$key." / value:".$value;
  }
} 

出力:

key:apple / value:1
key:orange / value:2
于 2013-03-12T13:06:51.170 に答える
1

配列を反復処理し、オブジェクトに親がある場合は、その親の配列に追加しchildrenます。例えば:

$array = array(

  1 => (object) array('menu_item_parent' => 0),
  2 => (object) array('menu_item_parent' => 1),
  3 => (object) array('menu_item_parent' => 0),

);

foreach ($array as $key => $object)
{

  if (0 != $object->menu_item_parent && isset($array[$object->menu_item_parent]))
  {

    if (!property_exists($array[$object->menu_item_parent], 'children'))
    {
        $array[$object->menu_item_parent]->children = array();
    }

    $array[$object->menu_item_parent]->children[] = $object;

    unset($array[$key]);    

  }

}

echo '<pre>' . print_r($array, TRUE) . '</pre>';

変換します:

Array
(
    [1] => stdClass Object
        (
            [menu_item_parent] => 0
        )

    [2] => stdClass Object
        (
            [menu_item_parent] => 1
        )

    [3] => stdClass Object
        (
            [menu_item_parent] => 0
        )

)

に:

Array
(
    [1] => stdClass Object
        (
            [menu_item_parent] => 0
            [children] => Array
                (
                    [0] => stdClass Object
                        (
                            [menu_item_parent] => 1
                        )

                )

        )

    [3] => stdClass Object
        (
            [menu_item_parent] => 0
        )

)

次に、各オブジェクトを繰り返し処理し、必要に応じてその子を表示できます。

foreach ($array as $object)
{

  echo 'Parent: ' . $object->title . '<br>';

  if (property_exists($object, 'children') && !empty($object->children))
  {

    echo '&nbsp;&nbsp;&nbsp;Children: ';

    foreach ($object->children as $child)
    {
      echo $child->title . '<br>';
    }

  }

}
于 2013-03-12T13:08:48.770 に答える
1

これが私の解決策になります。親オブジェクトの下の子をに移動し、親のchildren下にブール値を作成します。has_childこの値は。になります1。最後に、子の設定を解除して、メイン変数から削除します。

$elements = wp_get_nav_menu_items("theme-location");

foreach($elements as $index => $item)
{
    if($item->menu_item_parent != 0)
    {
        foreach($elements as $index2 => $item2)
        {
            if($item2->ID == $item->menu_item_parent)
            {
                $elements[$index2]->has_child = true;

                if(!isset($elements[$index2]->children))
                {
                    $elements[$index2]->children = array();
                }
                $elements[$index2]->children[] = $item;
            }
        }
        unset($elements[$index]);           
    }
}
于 2017-05-13T10:37:13.597 に答える