web-dev-qa-db-ja.com

WordPressに動的セクションを追加する

[編集:以下に具体例を追加しました]

カスタムPHPサイトをWordPressに変換する必要があります。このサイトには60,000を超えるメディアアイテムと大量のメタデータがあり、それらすべてを新しいサイトに引き継ぐ必要があります。メディアデータにはローカルのAPIを介してアクセスしますが、WordPressでAPIにアクセスする方法はすでにわかっているので、これは問題にはなりません。

私が理解することができないのはそのようにプラグインを書く方法です

  1. uRLパラメータは何を表示するかを決定します (理想的にはmod_rewriteを介して);そして
  2. wordPressでプラグインを公開する方法と場所。

つまり、/albums/12345または/authors/23456というURLが正しいコンテンツのみを表示するページに解決されるようにプラグインを作成するにはどうすればよいでしょうか。

ドキュメントのどこを見ればいいのか教えてもらえれば、私は簡単なRTFMを本当に嬉しく思います。私が最後にWPを使って何かをしてから約10年が経ちました、それで今すべては私にとってかなり新しいです。どこを見ればいいのかさえわかりません。


編集これはより具体的な例です。

RSSから定期的に更新されるPodcastフィード、またはTwitter APIからのツイートのリストなどを作成したいとします。基本的にソースは明確に定義されたAPIによってアクセスされます(そして私はそのようなものをロードし、パースしそしてフォーマットするためのロジックを容易に扱うことができます)。データはすべてそこにあり、読み取りの準備ができています。

そのコンテンツが特定のURLリクエストに応じて表示されるようにするにはどうすればいいですか。

たとえば、誰かが/podcasts/pages/1にアクセスした場合、ページコンテンツにPodcastタイトルの最初のページを表示させるにはどうすればよいですか。もし彼らが/podcasts/items/oct-31-2015-wordpressに行ったら、どうやってPodcastメタデータを表示させるのですか?

アクションまたはフィルタを使用しますか?どのフックを使う必要がありますか?代わりにカスタム投稿タイプを使用しますか?

1
Andrew

これにはうまくいく可能性があるいくつかのアプローチがあります。 「仮想ページ」に関する質問についてここを見回しているなら、あなたに役立つかもしれないいくつかのオプションを見つけるかもしれません。

これを実装する簡単な方法

1)WordPress管理者のページの下にページを作成します。これがメインクエリにロードされるページになり、後で追加する書き換えルールのターゲットとして使用されます。ページの内容は重要ではありません、あなたがしたくないならば、あなたはそれを出力する必要はありません、それはWordPressが首尾よく主な質問を実行することができるようにです。

2) URLからデータを抽出するために必要なクエリ変数 を追加します。例えば、album_idpodcast_idなど。これらがWordPress自身のクエリ変数と衝突しないように十分にユニークであることを確認してください。 登録分類法コーデックスページ には、これらの変数の完全ではないリストがあります。例:

function wpd_my_query_vars( $qvars ) {
    $qvars[] = 'album_id';
    $qvars[] = 'podcast_id';
    return $qvars;
}
add_filter( 'query_vars', 'wpd_my_query_vars' , 10, 1 );

3)提供したいさまざまな要求に必要な書き換え規則を追加します。ルールは、手順1で作成したページをターゲットにし、手順2で追加したクエリ変数を設定します。例:

function wpd_rewrite_rules(){
    add_rewrite_rule(
        '^albums/([^/]*)/?',
        'index.php?page_id=42&album_id=$matches[1]',
        'top'
    );
}
add_action( 'init', 'wpd_rewrite_rules', 10, 0 );

書き換え規則は、新しい規則が追加されるたびに フラッシュ する必要があることに注意してください。これを行うには、adminの[設定]> [パーマリンク]ページにアクセスしてください。

4)この最後のステップはオプションです。これらの種類の要求はすべて単一のページテンプレートで処理できます。さまざまなリクエストをそれぞれ独自のテンプレートに分割したい場合は、page_templateにフィルタを追加してそれぞれに異なるリクエストをロードします。 WordPressはこれらすべてのリクエストをターゲットにした単一のページと見なします。それ以外の場合は、独自のルールとクエリ変数を使用して作成したその他の違いを自分自身で検出することはできません。例:

function wpd_page_template( $template = '' ) {
    global $wp_query;
    if( ! array_key_exists( 'album_id', $wp_query->query_vars ) ) return $template;

    $template = locate_template( 'album-template.php' );
    return $template;
}
add_filter( 'page_template', 'wpd_page_template' );

これを拡張して、他のテンプレートをロードするために追加したさまざまなクエリ変数の存在を確認することができます。上記のように$wp_queryから直接あなたのカスタムクエリvarsにアクセスすることができます、またはあなたがグローバルと道徳的に反対しているなら、 get_query_var を使って。 is_page条件タグ を使用して、このフィルタを1ページまたはページの配列だけにターゲティングすることもできます。

このアプローチで他にもクリーンアップしたい部分がいくつかあるかもしれません。たとえば、これらのページのrel_canonicalアクションからwp_headを削除し、このコンテンツの正規メタタグを出力するための独自の関数を追加することができます。

2
Milo