ワードプレスのルーティングはどのように機能しますか?


13

コアwpルーティングはどのように機能しますか?理解に苦労しています... MVCでは、URLはMyController-> myaction()にマッピングされるmycontroller / myactionのように見えます

drupalでは、index.php?q = mycustomerpath / helloであり、テーマレイアウトに「テーマ化された」コンテンツを返す任意の関数にマッピングできます。

しかし、WPでは、物事がどのように行われているのかわかりません...それは?p = 1で?product = 1です...ルーティングフローのドキュメントを検索しましたが、何も見つかりません(Googleはカスタムで記事を返すだけですルート)..最初にコアルーティングの基礎を理解したい..


コードを掘り下げて、query_postsを呼び出すリクエストごとに表示されますか?なぜ地球上で毎回投稿をクエリする必要があるのですか?実際に投稿を表示したくない場合はありませんか?
yeahman 14

1
コンテンツは、WPに投稿として保存されます。だから、あなたはあなたがそれを照会する必要がある内容を表示する必要がある場合
Sisir

WordPressの仕組みを理解するために理解する必要がある概念である「ループ」についてお読みください。本質的な「ループ」は、query_postsの結果である投稿の配列を表示します。管理者以外のURLリクエストの場合、WPは投稿のみを表示するように設計されており、投稿以外の何かを表示するにはカスタムプログラミングが必要です。管理URLリクエストは異なり、これらは「ループ」を使用せず、投稿以外のものを表示します。

わかりましたが、このアプローチは少し奇妙で柔軟性に欠けていますtbh
yeahman

連絡先フォームを表示したい場合..htmlをページコンテンツタイプに入れる必要がありますか?私はまだ(?テーマpage.phpに非常に醜いアプローチ)...フォームの送信のためのロジックを配置する場所を見つけるためにしようとしています
yeahman

回答:


20

WordPressでは、URLはルートにマップされません。データベースクエリにマップします。

「デフォルト」パーマリンクモードでWordPressを使用する場合、?p = 1や?page = 234などのように、メインURLクエリに一連の変数があります。また、?s = searchと他の多くがあります。

「きれいな」パーマリンクを使用すると、「書き換えルール」と呼ばれる大きなルールセットが作成され、さまざまなURLパターンがこの同じURLパラメータセットに直接マッピングされます。したがって、/ 2014/04/12 / exampleのようなURLは?year = 2014&month = 04&day = 12&postname = exampleなどにマッピングされます。したがって、このマッピングが行われた後、これらにも同様に適用されます。

これらの変数は、本質的にWP_Queryクラスのメインインスタンスを制御しています。WP_Queryクラスは、データベースクエリを構築してデータベースから「投稿」を取得するすべての情報を保持します。渡されるさまざまなパラメーターは、作成するクエリの種類と取得するデータを制御します。

ご覧ください、WordPressで表示できるものはすべて、本質的に「投稿」です。ブログは、時間ベースの逆順の一連の投稿です。「ページ」は、名前が定義された静的な投稿です。「カスタム投稿タイプ」とは、まさにあなたが定義したカスタムタイプの「投稿」のようなものです。WordPressで何かを表示するためのすべての主要なクエリは、wp_postsテーブルから投稿のサブセットを取得しています。

WP_Queryはそれを行うものです。そして、URLからのパラメーターはそのメインクエリに直接送信され、そこで使用されます。

次に、テーマは、クエリが返す内容に基づいて、使用するテンプレートを決定します。/ category / exampleをリクエストした場合、それは?category_name = exampleになります。つまり、メインの$ wp_query-> query_vars配列がその情報を取得し、WP_Queryが「example」カテゴリの最後のX投稿を引き出します。 is_categoryフラグをtrueに設定します。

テンプレートローダーはこの後に実行され、is_category()がtrueを返すことを確認し、カテゴリテンプレートを選択することを決定します。したがって、テンプレートに従ってcategory-example.phpを探し、category.phpなどにフォールバックします。階層。

したがって、URLの動作を変更する場合の質問は簡単です。URLを変更するのか、それとも何にマップするのか。URLは関数にマップされないため、クエリを制御するパラメーターにマップされます。URLでメインクエリを調整する場合、特別なURLで他の特別なコードを実行する場合とは少し異なるプロセスになります。

また、コメントで特定の質問に答えるには、「投稿を実際に表示したくない場合はありませんか?」いいえ、ありません。すべてが投稿です。すべてのコンテンツは投稿に保存されます。コンテンツを別の場所に保存して別の場所に保存したい場合は、それを行うことができますが、正直なところ、通常は必要ないため、より困難です。特別なコンテンツがある場合は、カスタム投稿タイプを作成し、そのタイプの投稿としてコンテンツを保存し、URLパターンをそれにマッピングします。簡単です。


drupal 6のカスタムタイプと非常によく似たすべての投稿を(カスタムポストタイプなどを介して)表示する必要があることを理解していますが、サイトのすべてのコンテンツを保存する単一のポストテーブルを持つパフォーマンスに影響しますか?drupal 7はエンティティタイプを導入することでそれを解決しました。カスタムタイプを作成してすべてをノードテーブルに保存する必要はなく、独自のエンティティテーブルに保存して、drupalフレームワークを活用できます。ワードプレスが将来このようなアプローチを導入することを願っています。詳細な説明についてはthx。
yeahman

URLを自分の機能/テーマにマッピングしたい場合、WPルーターが役立ちますか?
yeahman 14

通常、完全なルーティングシステムを追加する必要はありません。もっと簡単な方法があります。WordPressの基本は、ユーザーが作成したコンテンツを表示することです。コンテンツはすべて投稿テーブルに保存されます。ユーザーが生成したものではないコンテンツを表示したい場合は、通常、テーマまたはプラグインで行います。ページの生成時にプロセスのさまざまな部分をオーバーライドするためのコードには、数百(数千)のアクションフックとフィルター、およびその他の方法があります。また、ショートコードなどを使用すると、カスタムHTMLをコンテンツに挿入するのは比較的簡単です。
オットー14

作成した投稿タイプにカスタムhtml / phpを追加するにはどうすればよいですか?テーマのsingle.phpを変更したり、single-mycustompost.phpを作成したりすることなく(非常に移植性の高いアプローチではありません)
yeahman 14

6
ワードプレスで1年以上働いた後...私はまだそれに納得していません...フレームワークはエレガントでなく、非常にugいです...それはシンプルなブログとして機能しますが、他のタイプのWebサイトを開発したい場合。 。意図されていないことを行うのは一種のワードプレスのハッキングです。
-yeahman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.