2.2.9以降、アコーディオンツリー モバイルメニューが表示されない

Simplicityの特徴 フォーラム 不具合報告 2.2.9以降、アコーディオンツリー モバイルメニューが表示されない

  • このトピックには7件の返信、2人の参加者があり、最後にhidekichiにより9年、 1ヶ月前に更新されました。
7件の返信スレッドを表示中
  • 投稿者
    投稿
    • #45620
      t.kizawa
      ゲスト

      初めて質問します。失礼あればご容赦ください。

      当サイトではモバイル用メニューをアコーディオンツリーとしておりますが、
      本日2.2安定版⇒2.3安定版に更新したところモバイルメニューが表示されない状態となりました。

      現在までの切り分け状況は下記のとおりです。
      ・過去のバージョン 2.2.8迄は問題なく、2.2.9以降で発生している事象である
      ・完全レスポンシブの設定有無は関係ない
      ・メニュー形式を他(アコーディオン、モーダル)にした場合は表示される

      WordPressのバージョンは 4.6.1–ja となります。
      当方サイト https://kizawa.info

      確認すべき点をご教示いただければ幸いです。
      よろしくお願いします。

    • #45624
      technote
      ゲスト

      私の環境では footer-slicknav.php を修正することで解決しました。

      /js/jquery.slicknav.min.js" defer
      =>
      /js/jquery.slicknav.min.js"

    • #45625
      hidekichi
      ゲスト

      他のトピックでjQuery lazyloadが動作しないと言うのがありまして、そこでスクリプトタグにdefer/asyncを入れる処理が入ったらしいのですが、一部deferの所がasyncに入って問題が発生すると言う質問がありました。

      サイトを見せてもらったら、slickNav部分が読み込めてないんですけれども、おそらくはjQueryの読み込み順で問題が出ているように思います。

      作業1) デフォルトに戻す作業

      親テーマのfunctions.phpにて、おそらく最後のほうだろうと思いますが、
      function defer_async_scripts( $tag, $handle, $src )

      こういう関数を見つけて、$async_scriptsの中に'jquery-lazyload-js'があればそれをまずdeferの方へ移動します。これはひとまず予防のためです。

      $async_defer = array {
        //'jquery-core',
      }

      の中身を上記のようにコメントアウトして、

      $defer_scripts = array(
        'jquery',
        'admin-bar',
        'simplicity-js',
        'simplicity-child-js',
      );

      などとして書き換えて試してみてください。通常jqueryは上記のハンドルでイケると思うんですけれども、もしかすると、$async_deferの中に書いてあるような書き方でないとダメなのかも知れません。ここらは試してもらうしか無いんですが、最悪、子テーマfunctions.phpで

      remove_filter('script_loader_tag', 'defer_async_scripts', 10, 3 );

      と書けば、デフォルトになるかと思います。その後、

      footer-slicknav.phpにて、

      参考: ここもスクリプトタグの部分を書いてましたが投稿できないのでjsFiddleにて

      と言う具合にdeferを取ります。これで元通りです。

      作業2) 根本的な解決方法
      slicknavは直でスクリプトタグで読み込んでいるので、ここを

      参考: htmlでもscriptタグが入っていると投稿できないのでjsFiddleにて

      このようにしてコメントアウトして、子テーマfunctions.phpにて、

      function addScript_slickNav() {
      	if (is_mobile_menu_type_accordion_tree()) {
      		wp_enqueue_style( 'slicknav-css', get_template_directory_uri() . '/css/slicknav.css');
      		wp_enqueue_script( 'slicknav-js', get_template_directory_uri() . '/js/jquery.slicknav.min.js', array( 'jquery' ), '20160927', true );
      	}
      }
      add_action('wp_enqueue_scripts', 'addScript_slickNav');

      これを追記します。こうすると、直接スクリプトを読むのではなく、jQueryが読み込まれてから読み込むようになります。かつ、設定で読み込むようになっている時だけ読み込みます。
      この状態になっていれば、作業1でremove_filter等をせずとも、親テーマの関数部分で、

      $defer_scripts = array(
          'jquery',
          'admin-bar',
          'simplicity-js',
          'jquery-lazyload-js',
          'simplicity-child-js',
          'slicknav-js', //←ハンドル追加
          //'crayon_js',
      );

      とすることでスクリプトタグにdeferを入れることが可能になり正常に動作すると思います。

    • #45631
      アバター画像わいひら
      キーマスター

      ご報告ありがとうございます。
      とりあえず、取り急ぎ修正した2.3.0eをアップしておきました。
      https://wp-simplicity.com/downloads/downloads2/

    • #45640
      hidekichi
      ゲスト
      function addScript_slickNav() {
      	if (is_mobile() && is_mobile_menu_type_accordion_tree()) {
      		wp_enqueue_style( 'slicknav-css', get_template_directory_uri() . '/css/slicknav.css');
      		wp_enqueue_script( 'slicknav-js', get_template_directory_uri() . '/js/jquery.slicknav.min.js', array( 'jquery' ), '20160927', true );
      	}
      }
      add_action('wp_enqueue_scripts', 'addScript_slickNav');

      作業2で書いた関数にちょっと追加・修正します。
      おそらくモバイルの時と条件が必要かと思うので、モバイルでslicknavの設定があった時と言う条件にしました。
      slicknavってモバイルの時だけですよね?

      で、footer-slicknav.phpの部分で以下のようにします。
      //グローバルナビのCSSセレクタを指定する

      (function($){
        $(function(){
          $('#navi .menu > ul, #navi ul.menu').slicknav({
            label: 'MENU',
            allowParentLinks: true,
          });
        });
      })(jQuery);

      つまり、document.readyを待ってから実行です。これがないといつslicknavが動作するかは不明になり、だいたいの場合はjqueryより先に読み込んでエラーが出ます。

      ややこしくなってきたのでまとめ。

      footer-slicknav.phpでは、
      ・直接スクリプトタグで読み込んでいるのをコメントアウト
      ・slicknavを設定するjQuery部分にdocument.readyの指定を入れる
      このすぐ上のスクリプトのようにする。
      document.readyは$(function(){…})と略して書けます。

      子テーマfunctions.phpでは、
      ・footer-slicknav.phpで直で読んでいた本体をwp_enqueue_scriptでjqueryの後で読み込むようにする
      ・これらはモバイルの時だけ読み込むようにする
      このレス一番はじめの関数

    • #45646
      t.kizawa
      ゲスト

      わいひらさん、hidekichiさん、technoteさん

      早速のご回答、ご対応ありがとうございました!
      取り急ぎ、最新2.3.0gにて解消していることを確認しました。

      hidekichiさんの修正案は追って確認したいと思います。
      ありがとうございました。

    • #45648
      アバター画像わいひら
      キーマスター

      動作報告ありがとうございます!
      他環境でも、ちゃんと動作しているのがわかり、助かります。

    • #45651
      hidekichi
      ゲスト

      footer-slicknav.phpを #45640 のようにした場合、jqueryの設定のその上にある

      if ( is_mobile_menu_type_accordion_tree() ): //アコーディオンツリーメニューの時?>
      
      // ↓ のように書き換える
      
      if ( is_mobile() && is_mobile_menu_type_accordion_tree() ): //アコーディオンツリーメニューの時?>

      必要があるのに気がついてしまいました。

7件の返信スレッドを表示中
  • このトピックに返信するにはログインが必要です。
スポンサーリンク
アドセンス(大)
アドセンス(大)