AD5 WordPress Lab

投稿情報の取得とループの仕組み

投稿情報の取得とループの仕組み

$wp_query と $post

投稿データ取得の仕組みを知る上で重要なのは、$wp_query 、 $post という2つの変数です。

どちらもWordPress内部で自動的に生成され、利用されているものですが、グローバル変数のため、テンプレート内のどこでも、

global $wp_query;
print_r($wp_query);

等と記述すれば、中身を確認することができます。

投稿情報取得とループの仕組み

WordPressの基本動作で触れた通り、WordPressは、URLにアクセスした瞬間に(テンプレートを読み込む前に)URLに基づいて、データベースを検索します。

$wp_query には、query_vars、posts という2つの配列が含まれており、query_vars にその検索条件、posts にその検索結果が格納されます。

もう少し厳密にいうと、
query_vars に検索条件をセット
→検索を実行
→結果をpostsにセット
という流れです。

このとき、検索結果の1件目(singleページなら、その投稿そのもの)が、変数 $post に格納されます。

普段はあまり目にすることのない変数ですが、

テンプレートタグでお馴染みの have_posts() は、この $wp_query の posts に中身があるかどうかを判定しています。

そして、ループの中に必ず記述する the_post() は、この posts の次の1件を、$post にコピーする処理を行っています。

つまり、$post には「現在ループ中の投稿情報」が格納されています。

the_title() や the_contents() などのテンプレートタグは、この $post の情報を取得しています。

投稿情報取得のカスタマイズ

現在では使われることが少なくなりましたが、query_posts() は、この $wp_query を直接変更してしまう関数です。

$wp_query はWordPress内部の様々な処理に関わるため、不具合を起こしやすく、現在では推奨されない方法となりました。

それに変わって普及した、

$my_query = new WP_Query($arg);

という手法。

これは、$wp_queryと同じように、検索条件query_varsと検索結果postsを持った変数(ここでは$my_query)を、新たに作成する方法です。

引数の$argが検索条件query_varsとなり、自動的に検索が行われ、検索結果がpostsに格納されます。

この場合、ループ処理では、the_post() の代わりに、

$my_query->the_post();

と記載しますね。

the_post() は $wp_query(のposts)の中身を $post にコピーしますが、
$my_query->the_post() は、自分で作った $my_query(のposts)の中身を $post にコピーします。
(もちろん、the_post() の代わりに $wp_query->the_post() とすることもできます。)

このとき、自動生成される$wp_queryと、新たに作成した$my_queryという2つの変数が存在しているわけですが、
注意しなければならないのは、$post はひとつしかないということです。

元々、$post には、$wp_query (のpostsの1件目)のデータが格納されていますが、$my_query->the_post() によって、これが上書きされます。

再度、$wp_query の情報を $post に戻すために用意されている関数が、new WP_Query() と必ずセットで使うことが推奨されている、wp_reset_postdata() です。

なお、同じく投稿情報を取得する get_posts() は、$wp_query にも $post にも影響しません。スポットで使うには、非常に安定性が高いと言えます。
(関数の内部では、$wp_queryと同じような変数が作成されています)

テンプレートによる投稿情報検索カスタマイズの限界

これら3つの方法で、ページのメインのループ処理を記述することは、いくつかの問題があります。

これら3つの方法は、いずれも、テンプレートに記述するものです。
WordPressの基本動作で触れた通り、テンプレートが読み込まれる前に、既にデフォルトの検索は実行されています。

そのため、これらの方法でメインループを変更する場合、第1に、データベースの検索を1回余分に行うことになります。

第2に、デフォルトの検索の結果によって実行された後続処理を、変更できないこと。最もわかりやすいのは、テンプレートの決定です。

例えば、20件の投稿があるとき、テンプレートに new WP_Query() を記述し、1ページあたりの表示件数を5件に変更したとしても、
デフォルトの検索実行時には1ページ(デフォルトの)10件なので、3ページ目のURLにアクセスすると、404テンプレートが選択されてしまいます。

pre_get_postsの使用

特にメインループにおいて、検索条件に変更を加える際は、pre_get_postsフィルターを利用することが推奨されています。

冒頭で、WordPressによって自動的に $wp_query が生成される際には、
query_vars に検索条件をセット
→検索を実行
→結果をpostsにセット
という処理がなされるとお話ししました。

これは、query_posts() を実行した際や、new WP_Query() を使用した場合でも、同じです。

pre_get_postsフィルターは、この「検索を実行」が行われる直前に、検索条件 query_vars の中身をチェックし、変更することができます。

デフォルトの検索自体を変更できるので、無駄な検索が発生せず、テンプレートの選択もその検索結果によって決定されるため、前述のような問題もありません。

Plugin Outbound Posts – 記事リスト内に外部リンクを挿入

Outbound Posts – 記事リスト内に外部リンクを挿入

投稿のリストの中に、見た目は他の投稿のリンクと同じように、外部リンクを差し込みたい、なんてことはありませんか? こんな風に・・・ Outbound Posts は、このような記事風の外部リンクを簡単に投稿できるプラグインです。 このプラグインを有効化すると、各記事の投稿画面に、「外部リンク」という欄が現
Column WordPressが重い・遅いときは、まず「プラグインのスリム化」をしよう 〜調査篇〜

WordPressが重い・遅いときは、まず「プラグインのスリム化」をしよう 〜調査篇〜

WordPressが重い、遅い!? WordPressのサイトが重い、読み込みが遅いので高速化したい、という相談をよく受けます。 本シリーズでは、実際の高速化の実例を元に、事前調査から対応までの手順をご紹介します。 WordPressが遅い原因 経験上、WordPressが遅い原因の80%以上はプラグインの過剰使用です。 プラグイン
Column WordPressにXMLサイトマップを独自実装するカスタマイズ

WordPressにXMLサイトマップを独自実装するカスタマイズ

WordPressに限らず、SEO対策に不可欠なXMLサイトマップ。 カスタマイズせずとも「Google XML Sitemaps」などのプラグインで瞬殺なわけですが、 多くのXMLサイトマッププラグインは、柔軟に設定できるように作られている分、 「このサイトでは要らない機能」がたくさん含まれることになるので、多少なりともリソー
Plugin AD5 LOYALTY – WordPressで会員制サイト作成

AD5 LOYALTY – WordPressで会員制サイト作成

当サイトで使用しているプラグインです。 WordPressのサイトを簡単に会員制サイトにすることができます。 ショートコードで簡単に会員登録フォーム、ログインフォームが設置可能で、全ての投稿に対して、会員用コンテンツと非会員用コンテンツを設定することができます。 ショートコートで簡単に会員登録フォーム
Column WordPressテーマ・プラグイン開発時のセキュリティ対策

WordPressテーマ・プラグイン開発時のセキュリティ対策

WordPressのテーマやプラグインを開発、カスタマイズする際には、脆弱性を生まないよう、セキュリティ対策を十分に考慮する必要があります。 CSRF対策 管理画面内外を問わず、WordPressにリクエストを送信するフォームや、データを更新するAJAXを実装する場合には、CSRF対策を施しましょう。 リクエストを送信する
Plugin Mobile Sticky Footer – スマホ用固定フッター

Mobile Sticky Footer – スマホ用固定フッター

Mobile Sticky Footerは、スマートフォンサイトに簡単に固定フッターを設置できるWordPressプラグインです。 選べる3タイプのレイアウト 複数ボタンタイプは2ボタンから5ボタンまで設定可能。 お問合せフォームやSNSへのリンクのほか、電話ボタンの設置も可能です。 リアルタイムプレビューつきの直感的な設定画
Column WordPressにメールフォームを自力で実装する

WordPressにメールフォームを自力で実装する

WordPressにメールフォームを実装する優秀なプラグインは沢山ありますが、 ほとんどのプラグインは非開発者向けに導入しやすさを重視して作られているため、 例えば入力項目を動的にするなど、少し複雑なことをしようと思うと、 詰んでしまいます。 WordPressにはメール送信処理やデータの保存などを簡単に実装できる
Plugin WP LOYALTY Checkout add-on – クレジットカード決済

WP LOYALTY Checkout add-on – クレジットカード決済

当サイトで使用しているプラグインです。 AD5 LOYATYのアドオンとして、決済機能を提供します。 決済サービスとして、カード決済手数料が3.0%〜と安く、個人事業主でも利用可能なPAY.JPと連携できます。 (別途PAY.JPのアカウントが必要です。)
Column WordPressのテーマファイル構成を本気出して考えてみた

WordPressのテーマファイル構成を本気出して考えてみた

エンジニアの端くれとして、たかがWordPressテーマであっても、綺麗なモジュール設計がしたいわけです。 そこで、以前作ったサイトのテーマをモチーフに、テーマファイルを再設計してみました。 対象にしたサイトは、ユーザーが会員登録し、PDFコンテンツを投稿でき、ダウンロード結果を集計できるなど、そこそこ高機
Column WordPressサイトにパンくずリストをプラグインなしで実装する

WordPressサイトにパンくずリストをプラグインなしで実装する

意外と大変なパンくずリスト WordPressサイトに限らず、SEOの面でも重要視されるパンくずリスト(breadcramb nav)。 WordPressでガチで実装すると意外と面倒ですよね。 個別投稿ページだけでも、 A. 標準投稿 HOME > 親カテゴリ > 子カテゴリ > 投稿名 B. 固定ページ HOME > 親ページ >
 
ログイン
メールアドレス
パスワード
会員登録
お名前
メールアドレス
パスワード
購入手続き
カード番号
有効期限 (MM/YY)
/
セキュリティコード (CVC)