🐈

footerのliをn個ずつwrapする用メモ

2024/01/11に公開

フッターカスタマイズ

①カスタムウォーカー
②wp_get_nav_menu_object
③力技

このうちカスタムウォーカー以外について書いていきます

wp_get_nav_menu_objectを使用してliをn個ずつwrapする例

functions.php
function my_menu_init() {
  register_nav_menus(
    array(
      'footer' => 'フッターメニュー',
    )
  );
}
add_action( 'init', 'my_menu_init' );
footer
<footer class="footer">
<?php
$location_name = 'footer'; //insert location name
$locations = get_nav_menu_locations(); //get location of all navigation menus
$footer_id = $locations[$location_name]; //get menu id
$footer_object = wp_get_nav_menu_object($footer_id); //get menu object
$footer_items = wp_get_nav_menu_items($footer_object->term_id); //get menu items
$footer_item_length = count($footer_items);

//divで囲むアイテム数
$encloseNum = 5;

echo '<ul class="footer__menu">';
  if (is_front_page() || is_home()) { //フロントページ
    for ($i = 0; $i < $footer_item_length; $i += $encloseNum) {
      echo '<div class="footer__items">';
      for ($j = 0; $j < $encloseNum; $j++) {
        echo '<li class="footer__item">';
	echo '<a href="' . $footer_items[$i + $j]->url . '">' . $footer_items[$i + $j]->title  . '</a>';
	echo '</li>';
      }
      echo '</div>';
    }
  }
echo '</ul>';
?>
</footer>
footer.php
<footer class="footer">
<?php 
  wp_nav_menu( array( 
    'theme_location' => 'footer',
    'menu_class' => 'footer__menu', //ul class
    'add_li_class' => 'footer__item js-footer-item', //li class
  ) ); 
?>
</footer>
main.js
wrapItem({
  targetsClass: "js-footer-item",
  wrapperClass: "footer__items",
  num: 4,
});

function wrapItem(obj) {
  if(!obj.targetsClass || !obj.wrapperClass) return;
  
  document.addEventListener("DOMContentLoaded", () => {
    const targets = document.querySelectorAll(`.${obj.targetsClass}`);
    const targetsLen = targets.length;
    if(targetsLen === 0) return;
  
    //何個ずつ囲むか、数の設定
    const encloseNum = obj.num ? obj.num : 5;
  
    for(let i = 0; i < targetsLen; i += encloseNum) {
      //アイテム囲むdivを生成
      let wrapper = document.createElement("div");
      wrapper.classList.add(obj.wrapperClass);
  
      //アイテムを複製して生成したdivに挿入
      for(let j = 0; j < encloseNum && i + j < targetsLen; j++) {
        wrapper.appendChild(targets[i + j].cloneNode(true));
      }
  
      //wrapperを元のリストに置き換える
      targets[i].parentNode.insertBefore(wrapper, targets[i]);
    }
  
    //元々あった要素を削除
    targets.forEach(t => t.remove());
  });
}

Discussion