sugadog > BIBOU6

いつかのジブンにおくるチエブクロ。

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' );

?>

 

おまけ。