• 現在Wordpressのカスタマイズを考えているのです。
    そこで、カスタム投稿を研究しているのですが、カスタム投稿を使ったアーカイブリンクについて、わからない事があり質問させていただきました。

    カスタム投稿タイプには通常のカーかイブをはき出す関数は使えない事はわかりました。
    そこで、通常の投稿とカスタム投稿を行った際の違いについて探してみました。
    すると、ganaral-template.phpにあるwp_get_archivesメソッドのSQL文に対して、下記の内容で書き加えると、リンクをはき出してくれる事はわかりました。

    カスタム投稿タイプのpost_typeがnewsだった場合

    $where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );
    
    "SELECT YEAR(post_date) AS <code>year</code>, MONTH(post_date) AS <code>month</code>, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit"

    から下記に変更

    $where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' OR post_type='news' AND post_status = 'publish'", $r );
    
    "SELECT YEAR(post_date) AS <code>year</code>, MONTH(post_date) AS <code>month</code>, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit"

    ただ、アーカイブリンクは出力されるのですが、リンク先は404になってしまいます。

    例えば通常のポストの投稿が11月にあった場合は、post_typeがnewsの場合でも、アーカイブは表示されます。
    しかし、通常のポストの11月の投稿がなく、post_typeのnewsだけが11月に投稿があっても404になってしまいます。

    そこで、色々調べてみたのですが、wp_postsテーブルのpost_dateカラムの日付を基準にしているように思います。
    この値に2011-12-○○-○○:○○:○○で、post_typeがpostでステータスがpublishになっていると404にならずに表示される感じです。

    ここまではわかったのですが、肝心のpost_typeにnewsを指定した場合の解決策がわかりません。
    Wordpressはどのようにして、アーカイブリンクを生成?しているのでしょうか?

    説明がわかりにくくて申し訳ありません。

    ちなみにバージョンは3.2.1です。
    宜しくお願いします。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • モデレーター jim912

    (@jim912)

    yy_kさん、こんにちは。

    知りたいことは、リンク先のアーカイブ表示にカスタム投稿タイプのnewsも含めて表示したいということで良いでしょうか?

    ご質問でいただいたコードの場合、wp_get_archivesでアーカイブのリンクリストを取得する条件にカスタム投稿タイプを含めることはできますが、リンク先のアーカイブ表示でカスタム投稿タイプを含めるようにはなっていません。

    表示する記事の取得は、wp-includes/query.phpのWP_Queryのget_postsメソッド(テンプレートタグのget_postsとは違います)で条件に応じたSQLの生成と記事の取得が行われます。

    このget_postsのSQL文を生成する直前の段階に pre_get_posts というアクションフックがあります。

    do_action_ref_array('pre_get_posts', array(&$this));

    このアクションフックは、通常のアクションフックとは異なり、引数が参照渡しになるので、引数の内容をフックした関数内で直接書き換えることができるようになっています。

    つまり、ここで is_date だったら、その条件にカスタム投稿タイプを含めるという条件を加えてしまえば、適切なSQL文を自動的に生成し、カスタム投稿タイプを含んだ記事の取得を行ってくれます。

    ここで、条件の内容は、渡されてきた引数の query_vars というプロパティに格納されていますので、これのpost_typeを書き換えてください。

    順序をサポートしたカスタム投稿タイプのデフォルト表示順を変更してみるは、pre_get_postsを利用した表示のカスタマイズの参考になると思いますので見てみて下さい。

    また、上記参考記事の内容から、query.phpでの書き換えは管理画面の表示にも影響がすることになります。(管理画面の記事取得もquery.phpを利用していると言うこと)管理画面を除外しておかないと、思わぬ部分で投稿の一覧にカスタム投稿タイプが混じりかねないので気を付けてください。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • トピック「カスタム投稿タイプのアーカイブリンクについて」には新たに返信することはできません。