WordPress と jQuery Mobile で構築したサイトで Infinite Scroll を使ってみた際のメモ。
WordPress で構築したサイトで Infinite Scroll を使うのとそれほど違いはないが、いくつか気づいた点。
Infinite Scroll のインストール:「WordPress で Infinite Scroll を使ってみる」
jQuery Mobile のインストール:「WordPress のテーマを jQuery Mobile でスマートフォン対応に」
以下は、header.php で読み込んで記述する例。この場合、infinitescroll のコールバック関数で jQuery Mobile の関数を記述することが可能。
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title></title> <link rel="stylesheet" href="<?php echo get_stylesheet_uri(); ?>?ver=20131001" type="text/css" /> <!-- jQuery Mobile の CSS の読み込み --> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jquery.mobile.structure-1.3.2.min.css" /> <!-- jQuery の読み込み --> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <!-- infinitescroll.min.js の読み込み --> <script src="<?php echo get_template_directory_uri(); ?>/js/jquery.infinitescroll.min.js"></script> <script> $(document).bind("mobileinit", function(){ $.mobile.ajaxEnabled = false; }); $(document).bind("mobileinit", function(){ $.mobile.pushStateEnabled = false; }); //infinitescroll の記述 jQuery(function($){ $('#content').infinitescroll({ navSelector : ".pagenavi", // ナビゲーション要素を指定 nextSelector : ".pagenavi a:last", // ナビゲーションの「次へ」の要素を指定 itemSelector : ".work" // 表示させる要素を指定 }); }); .....(省略)..... </script> <!-- jQuery Mobile の読み込み --> <script src="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js"></script> <?php wp_head(); ?> </head> <body <?php body_class(); ?>>
上記の「$.mobile.ajaxEnabled = false」や「$.mobile.pushStateEnabled = false」の指定は、必要ではないと思うが、この環境で作成したので一応記述。
以下は functions.php で Infinite Scroll を読み込んで、Infinite Scroll を実行するテンプレートファイルに記述する例。
//functions.php function add_my_scripts() { if(is_admin()) return; wp_enqueue_script('jquery'); //WordPress内蔵の jQuery をロード if(is_post_type_archive('works') || is_tax('works_tag')){ wp_enqueue_script('infinite', //「infinitescroll」をロード get_template_directory_uri(). '/js/jquery.infinitescroll.min.js', array('jquery'), '20130926' ); } } add_action('wp_print_scripts', 'add_my_scripts');
テンプレートに記述した例。この場合、infinitescroll のコールバック関数で jQuery Mobile の関数を記述するには、$.getScript() など何らかの方法で「jquery.mobile-1.3.2.min.js」を読み込む必要がある。
<?php get_header(); ?> <div id="content"> <?php if(have_posts()): while(have_posts()): the_post(); ?> <div class="work"><!-- この部分をロードする--> <h3><a href="<?php the_permalink(); ?>" ?>"><?php the_title(); ?></a></h3> ・・・省略・・・ </div><!-- end of .work --><!-- ここまで--> <?php endwhile; endif; ?> <?php wp_reset_postdata(); ?> <?php pagenavi(); ?> </div><!-- end of #content --> <?php get_sidebar(); ?> <?php get_footer('xxxx'); ?> <script type="text/javascript"> //infinitescroll の記述 jQuery(function($){ $('#content').infinitescroll({ navSelector : ".pagenavi", // ナビゲーション要素を指定 nextSelector : ".pagenavi a:last", // ナビゲーションの「次へ」の要素を指定 itemSelector : ".work" // 表示させる要素を指定 }); }); </script> </body> </html>
jquery.mobile-1.3.2.min.js を「$.getScript()」で読み込んでコールバックで jQuery Mobile の関数を使用する例。(この方法が効率的かどうかは別)
<script type="text/javascript"> jQuery(function($){ //jquery.mobile-1.3.2.min.js の読み込み $.getScript('http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js'); $('#content').infinitescroll({ navSelector : ".pagenavi", // ナビゲーション要素を指定 nextSelector : ".pagenavi a:last", // ナビゲーションの「次へ」の要素を指定 itemSelector : ".work" // 表示させる要素を指定 }, function () //コールバック関数 { $( "div[data-role=page]" ).page( "destroy" ).page(); }); }); </script>
Infinite Scroll で読み込んだ(ロードした)コンテンツは、jQuery Mobile での処理がないため jQuery Mobile がリンク要素に付けるクラスなどが付かない。そのため、リンク要素の色が適用されない。
Infinite Scroll ではコールバック関数が利用できるので、ロードしたコンテンツに jQuery Mobile が付けるクラスを付加することができる。以下はロードしたコンテンツのリンク要素にクラス「ui-link」を付ける例。
jQuery(function($){ $('#content').infinitescroll({ navSelector : ".pagenavi", nextSelector : ".pagenavi a:last", itemSelector : ".recent_work" }, function (){ $('.work a').each(function(n){ $(this).attr('class','ui-link' ); }); }); });
または、jQuery Mobile の page() などを使って以下のようにしても可能。冒頭の「$.getScript」は head 内に他の jQuery Mobile の設定などと記述する場合は不要。
jQuery(function($){ $.getScript('http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js'); $('#content').infinitescroll({ navSelector : ".pagenavi", nextSelector : ".pagenavi a:last", itemSelector : ".recent_work" }, function (){ $( "div[data-role=page]" ).page( "destroy" ).page(); //または $( "div[data-role=page]" ).trigger('create'); }); });
今回 Infinite Scroll を利用したサイトでは、ナビゲーションメニューが下部にあるため、ロードするコンテンツが多い場合、ナビゲーションメニューになかなか到達しない。そのためロードしたコンテンツの間にリンクを追加。
jQuery(function($){ var extra_menu = "<ul class='extra_menu'><li class='fLeft'><a class='ui-link' href='<?php echo home_url(); ?>'>ホーム</a></li><li class='fRight'><a class='ui-link' data-rel='back' href='<?php echo home_url(); ?>'>戻る</a></li></ul>"; $('#content').infinitescroll({ navSelector : ".pagenavi", nextSelector : ".pagenavi a:last", itemSelector : ".work", errorCallback: function () {$('ul.extra_menu').remove(); } }, function (){ $('.work a').each(function(n){ $(this).attr('class','ui-link' ); }) $('.work:last').after(extra_menu); }); });