Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

WordPressの表示件数

3,449 views

Published on

  • Dating direct: ♥♥♥ http://bit.ly/39pMlLF ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ❶❶❶ http://bit.ly/39pMlLF ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ..............ACCESS that WEBSITE Over for All Ebooks ................ ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full EPUB Ebook here { http://bit.ly/2m6jJ5M } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

WordPressの表示件数

  1. 1. WordPressの表示件数WP_Queryを巡る冒険田島 優也プライム・ストラテジー
  2. 2. WordPressの表示件数WordPressには管理画面から、各アーカイブページの表示件数を変えられる機能がデフォルトでついています。たとえば、表示したい投稿数が60件だとして1ページの表示件数を10件とすれば、10件ずつページ送りされて、6つのページに分割することができます。
  3. 3. 管理画面>設定>表示設定
  4. 4. でも場合によっては、それぞれのアーカイブページによって表示件数を変えたい時もある。たとえばカテゴリーページでは5件表示にしたり、トップページでは10件にしたいなどなど。。。さて、どうしよう。
  5. 5. すると、ヒントが!http://www.warna.info/archives/1964/
  6. 6. pre_get_posts• 大曲さんのブログによると、pre_get_postsというフックを利用して、色々やると実現したいことができるらしい。• そこで、WordPressのファイルの中身を探検してみることにします。• なお、以下参照していくコアファイルはWordPress3.5.1のものです。
  7. 7. ./wp-includes/query.php 1919行該当のフックは/wp-includes/query.php 1919行function get_posts() {…略…do_action_ref_array(pre_get_posts, array(&$this));にありました。
  8. 8. get_posts()なお、ここでのget_posts()はWp_Queryクラスのメソッドであるget_posts()であり、テーマのテンプレートでよく使うget_posts()とは別物です。あの便利なget_posts()は/wp-includes/post.phpの1699行目付近に書いてあります。
  9. 9. do_action_ref_arrayhttp://codex.wordpress.org/Function_Reference/do_action_ref_arrayCodexによるとThis function is identical to do_action,but the arguments passed to the functions hooked to$tag are supplied using an array.[意訳]この関数はdo_actionと同一、しかしこのタグにフックされた関数に渡される引数は一つの配列です。
  10. 10. そもそもページの表示件数はどこで決めているのかといえば、WP_Queryクラスのquery_varsプロパティ(配列)。の中のposts_per_pageをキーとする値が1ページの表示件数を決めています。
  11. 11. WP_Queryクラスのquery_varsプロパティ$this->query_vars;コード中ではこのように表記されています
  12. 12. だけど、この時点では。。。つまり、アクションフック、do_action_ref_array(pre_get_posts,array(&$this));の処理の時点では。query_varsの中身にposts_per_pageというキー自体がそもそも存在しない。
  13. 13. 処理を上から追っていってみましょう。•./wp-includes/query.php 1922行$this->parse_query();によって$this->query_varsにいくつかキーが追加されているもののまだ‘posts_per_page‘は未設定。$q = &$this->query_vars;query_varsプロパティを参照変数$qに代入している。ん、参照変数?
  14. 14. 参照とは何?通常、変数に値を代入する時。$a = 10;$b = $a;$b = 20;echo $aの結果は . $a . <br/>;echo $bの結果は . $b;$aの結果は10$bの結果は20とブラウザ上に表示されます。
  15. 15. 参照とは何?しかし。$a = 10;$b =& $a;$b = 20;echo $aの結果は . $a . <br/>;echo $bの結果は . $b;$aの結果は20$bの結果は20と表示されます。
  16. 16. 参照とは何?実は=&(参照代入演算子)を用いて右辺を左辺に代入すると、左辺は右辺のデータを格納する領域を表示する変数を表します。つまり$bは$aは同じ場所を向いているので、$aの変更は$bに、また$bの変更は$aに反映されます。二人の別々の人間が、同じ方向を向いているようなことですね。(参照の内部的な挙動はプログラミング言語によって違うので調べてみると面白いかもしれません)
  17. 17. 戻りますということで、$q = &$this->query_vars;これ以降は$this->query_varsと$qは同じものとみなしてよさそうです。
  18. 18. 更に下に進んでいくと、•./wp-includes/query.php 1922行if ( !isset($q[posts_per_page]) || $q[posts_per_page] == 0 )$q[posts_per_page] = get_option(posts_per_page);という表記が見つかりました。これはつまり$q[‘posts_per_page’]に値がセットされていて、その値がNULLでないまたは0と同値であるような値である場合はwp_optionsテーブル(プレフィックスをwp_に設定してあれば)のoption_nameカラムがposts_per_pageであるoption_valueの値をセットする。
  19. 19. どういうことかというと。管理画面の設定 > 表示設定 > 1ページに表示する最大投稿数がそこにセットされるということです。つまり、すでに $q[posts_per_page]が設定されていたならば、そこの値ではなく前もって$q[posts_per_page]に設定されている値が1ページに表示する最大投稿数に設定される仕組みになっているらしい。だったら前もってここに値を設定しておけば、表示件数を自由にかえられそうです。
  20. 20. pre_get_postsadd_action( pre_get_posts, コールバック関数);コールバック関数の箇所に$q[posts_per_page]を設定する処理をかけばよさそうです。
  21. 21. pre_get_postsコールバックに渡される引数はarray(&$this)つまりこのオブジェクト自身なので。たとえば、アーカイブページの表示を変えたい場合はfunction archive_change_posts_per_page($query) {if ( !is_admin() && $query->is_main_query()){if ( $query->is_archive()) {$query->set( posts_per_page, 5 ) );}}}この関数をコールバックとして渡してやります。
  22. 22. この関数について少し詳しくみていきましょう。引数に渡す$queryの部分は通常、グローバル変数$wp_queryが渡されています。if ( !is_admin() && $query->is_main_query())この部分で管理画面ではない、かつ$query->is_main_queryが真であれば。アクションフック、pre_get_postsは管理画面にも影響を与えます。具体的にいうと、投稿一覧、固定ページ一覧、メディアライブラリ、各カスタム投稿タイプの記事一覧の表示件数などに影響を与えます。(Wp_Queryのインスタンスを利用したプラグインなどを使用していると他にも影響があるかもしれません)各一覧ページの表示させる件数は表示オプションから変更できますが、このフックが有効になっていると表示件数を変えることができないということになるので!is_admin()を条件に加えておきましょう。
  23. 23. $query->is_main_query大曲さんのブログによると、WordPress3.3から使えるようになったようです。is_main_queryメソッドでは何をしているかというと。function is_main_query() {global $wp_the_query;return $wp_the_query === $this;}}現在処理の対象となっているオブジェクト($wp_query)が$wp_the_queryと等値であるかを判別しているようです。
  24. 24. オブジェクトの比較http://www.php.net/manual/ja/language.oop5.object-comparison.phpPHPにおけるオブジェクトの比較については比較演算子(==)を使用する際、オブジェクト変数は、単純に比較されます。つまり、 二つのオブジェクトのインスタンスは、同じ属性と値を有し、同じクラスのインスタンスである場合に、等しいとされます。一方、一致演算子(===)を使用する場合、オブジェクト変数は、同じクラスの同じインスタンスを参照する場合のみ、等しいとされます。つまり、$wp_queryが$wp_the_queryと同じ格納領域を参照しているかどうかの判定結果を返しているようです。
  25. 25. $wp_the_queryとか、$wp_queryとか$wp_the_queryとか、$wp_queryとか話がややこしくなってきました。。./wp-includes/query.phpを一度離れて、WordPressの最初の方の処理からたどってみましょう。するとwp-settings.phpに以下のような記述がありました。
  26. 26. ./wp-settings.php224行目$wp_the_query = new WP_Query();232行目$wp_query = $wp_the_query;実はこれもまた参照変数に代入されているのです。
  27. 27. =&がないのに参照?PHP5からはオブジェクトの代入は=&でなくとも=で参照変数への代入になります。よって、$wp_queryは$wp_the_queryの参照変数となる。以降、WordPressは$wp_queryを中心に処理を行なっていきます。
  28. 28. 再び$query->is_main_query何故、$query->is_main_query()が真である必要があるのか。たとえばquery_posts関数を使っていた場合。./wp-includes/query.php 89行目function query_posts($query) {$GLOBALS[wp_query] = new WP_Query();return $GLOBALS[wp_query]->query($query);}参照変数$wp_queryを新たなWP_Queryのインスタンスで上書きしています。その新たなインスタンスのメソッドを使って引数で与えられたqueryメソッドを実行する。
  29. 29. 再び$query->is_main_query参照変数に再度別の変数の参照を代入した場合は、新しい参照変数となってしまうので、$wp_queryと$wp_the_queryが別のオブジェクトを参照していることになり$wp_the_query === $thisの判定は偽となります。
  30. 30. 再び$query->is_main_query./wp-includes/query.php 3550 行function is_main_query() {global $wp_the_query;return $wp_the_query === $this;}$wp_the_queryと等値(同じオブジェクトの同じインスタンスを参照しているということなのでメインクエリであることが保証される。基本的に$wp_queryはquery_postsなどによって書き換えられるが、$wp_the_queryは書き換えられない)つまり本来そのページに適用されるべき記事の表示件数だけをかえたい場合は、$query->is_main_queryが真である必要があります。
  31. 31. 余談 wp_reset_query()./wp-includes/query.php 104行目function wp_reset_query() {$GLOBALS[wp_query] = $GLOBALS[wp_the_query];wp_reset_postdata();}wp_reset_queryは別のインスタンスを参照してしまった$wp_queryを再びグローバル変数wp_the_queryの参照変数とする処理を行なっています。query_posts()の後にwp_reset_query()が必要なのはそういう理由です。
  32. 32. 再びコールバック関数function archive_change_posts_per_page($query) {if ( !is_admin() && $query->is_main_query()){if ( $query->is_archive()) {$query->set( posts_per_page, 5 ) );}}}$query->is_archive()メソッドによって、アーカイブページであるかどうかを判定して、$query->set( posts_per_page, 5 ) );を実行します。
  33. 33. $query->set( posts_per_page, 5 ) );./wp-includes/query.php 1903行function set($query_var, $value) {$this->query_vars[$query_var] = $value;}よって、$this->query_vars[posts_per_page] = 5;となります。
  34. 34. まとめ$this->query_vars[‘posts_per_page’]が設定されていることによってアーカイブページの時だけ、$q[posts_per_page] = get_option(posts_per_page);の設定が適用されずarchive_change_posts_per_page関数での処理で設定した$this->query_vars[posts_per_page] = 5が適用されることになるのでアーカイブページの表示件数だけ5件とすることができます。
  35. 35. おまけでもいちいち、この処理をfunctions.phpに書くのは手間かもしれない・・・そこで簡易的ではありますが、プラグインを作りました。現在は一般的なアーカイブ設定と検索結果、各カテゴリの表示件数しか変えられませんが、のちのち改良していきたいと思います。コードの間違いや改良点などのフィードバックも頂ければ幸いです。

×