wordpress / カスタム投稿のマージとページ送り #3
*gy*.wpblog.jp
普通の投稿(post)とカスタム投稿(newspost / releasepost)のマージとページ送りについて。
先日WEBデザイナーから教えてもらった "方法②" を試してみる。
★ やり方2:メインクエリをとってくる前に指定をする方法
http://www.tam-tam.co.jp/tipsnote/cms/post9420.html
導入部分より、いきなり刺激的な一文が目に飛び込んできました!(引用の引用を含む)
・・・ (略)ですが今現在query_postsの使用は推奨されていません。
我らが愛しいCodexにもこのように書かれています。
ひとことで言うと、query_posts() は決して使うべきではありません。
うまくいっているページが多いとはいえ、
今の僕はサブクエリに query_posts( ) をばっちり使ってもうとるな。。
同ページをさらに読み進めると、記載のサンプルコードが「表示件数の設定」と「投稿タイプの制限」であることが判明。
ページの説明主旨を理解しつつも、更なる わかりやすさ と 使いやすそうなサンプルコード を求めて、
ページ下部の参考リンクをクリックすることにしました。
(ちなみに「query_postsを捨てよ、pre_get_postsを使おう」っていうのも、なかなか挑発的やね!)
* * * *
[WordPress]pre_get_postsを使いこなす!pre_get_posts使い方まとめ
http://emiac-works.com/coding/pre-get-posts-code-snipet/
ここのサイトのサンプルコードが、実にわかりやすく使いやすそうだったので、早速試してみました。
その結果、、、うまくいった!
function.php には、
カテゴリーのアーカイブ(categry.php)とreleaseカテゴリーのアーカイブ(categry-release.php)、
そして各タグのアーカイブ(tag.php)と日付アーカイブ(date.php)用の記述を加筆しました。
(ちなみに、カテゴリーのアーカイブの場合は選択したカテゴリーが抽出順位の最優先になるらしく、
投稿タイプのマージを記述しなくても自動でマージして表示されるようです)
たぶん、これによって各phpに記述したサブクエリのマージ記述は不要になる感じ。
数週間の停滞が一気にスッキリしました。
以下、function.php に記述したソースです。
<?php
// ウィジェット 既に記載済
register_sidebar(
);
// カスタムメニュー 既に記載済
register_nav_menus(array(
'navigation' => 'ナビゲーションバー'
));
function change_posts_per_page($query) {
/* 管理画面,メインクエリに干渉しないために必須 */
if( is_admin() || ! $query->is_main_query() ){
return;
}
/* カテゴリーページの一覧(アーカイブ)表示件数5件、投稿マージ */
if ( $query->is_category() ) {
$query->set( 'posts_per_page', '5' );
$query->set( 'post_type',array( 'post','newspost','releasepost' ) );
return;
}
/* カテゴリー(リリース)ページの一覧(アーカイブ)表示件数6件、投稿マージ */
if ( $query->is_category( 'release' ) ) {
$query->set( 'posts_per_page', '6' );
$query->set( 'post_type',array( 'post','newspost','releasepost' ) );
return;
}
/* タグページの一覧(アーカイブ)表示件数5件、投稿マージ */
if ( $query->is_tag() ) {
$query->set( 'posts_per_page', '5' );
$query->set( 'post_type',array( 'post','newspost','releasepost' ) );
return;
}
/* 日付ページの一覧(アーカイブ)表示件数5件、投稿マージ */
if ( $query->is_date() ) {
$query->set( 'posts_per_page', '5' );
$query->set( 'post_type',array( 'post','newspost','releasepost' ) );
return;
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
?>
とよく見てみたら、
カテゴリー(リリース)ページの一覧(アーカイブ)の表示件数6件の設定が生きてないではないか。。。
ちょっと考えて、単純にカテゴリーページの一覧(アーカイブ)と
カテゴリー(リリース)ページの一覧(アーカイブ)のコードの場所を入れ替えたら、うまく機能しました。
改めて、最終版のソース。
<?php
// ウィジェット 既に記載済
register_sidebar(
);
// カスタムメニュー 既に記載済
register_nav_menus(array(
'navigation' => 'ナビゲーションバー'
));
function change_posts_per_page($query) {
/* 管理画面,メインクエリに干渉しないために必須 */
if( is_admin() || ! $query->is_main_query() ){
return;
}
/* カテゴリー(リリース)ページの一覧(アーカイブ)表示件数6件、投稿マージ */
if ( $query->is_category( 'release' ) ) {
$query->set( 'posts_per_page', '6' );
$query->set( 'post_type',array( 'post','newspost','releasepost' ) );
return;
}
/* カテゴリーページの一覧(アーカイブ)表示件数5件、投稿マージ */
if ( $query->is_category() ) {
$query->set( 'posts_per_page', '5' );
$query->set( 'post_type',array( 'post','newspost','releasepost' ) );
return;
}
/* タグページの一覧(アーカイブ)表示件数5件、投稿マージ */
if ( $query->is_tag() ) {
$query->set( 'posts_per_page', '5' );
$query->set( 'post_type',array( 'post','newspost','releasepost' ) );
return;
}
/* 日付ページの一覧(アーカイブ)表示件数5件、投稿マージ */
if ( $query->is_date() ) {
$query->set( 'posts_per_page', '5' );
$query->set( 'post_type',array( 'post','newspost','releasepost' ) );
return;
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
?>
おまけ。