メインクエリを改変!home.phpでカスタムポストタイプの内容を出力させる方法。

WordPressサイトのトップページでカスタムポストタイプの投稿のみを表示させる方法をメモ。

is_main_query関数とpre_get_postsフックを使って、loopの記述を改変しなくてもhome.phpの出力内容を通常の投稿からカスタム投稿に変えることができるという手法です。

functions.phpに以下のコードを記述します。

<?php
add_action( 'pre_get_posts', 'foo_modify_query_exclude_category' ); // pre_get_postsにフック
// フック時に使う関数
function foo_modify_query_exclude_category( $query ) {
	    if (! is_admin() && $query->is_main_query() && $query->is_home()) // 管理画面以外 かつ メインクエリ かつ home
	        $query->set( 'post_type', 'custom-post'); // カスタムポストタイプ custom-post をセット
}
?>

home.phpが使われる時、つまりトップページが表示されるときにcustom-postという名前のカスタム
投稿が表示されるようになります。(カスタムポストタイプは予め作っておく。)

home.phpでは例えば以下のような通常のメインクエリを出力するloop処理を呼び出しています。

//以下はget_template_part()によって呼び出されたloop.phpの中身
<?php if (have_posts()) : ?>
		// 投稿一覧を表示する前の処理内容
	<?php while (have_posts()) : the_post(); ?>
		// 各投稿を表示する処理内容
	<?php endwhile; ?>
		// 投稿一覧を表示した後の処理内容
<?php else : ?>
		// 投稿が無いときの処理内容
<?php endif; ?>

以下の様なメリットがあります。

is_main_query 関数と pre_get_posts フックを使う事で、テンプレートファイルにアクセスする前にメインクエリを改変することが可能です。つまり、二重にクエリの呼び出しを行わなくて済むというメリットがあります。
また、query_posts を使う方法だと、変更したいテンプレートファイルすべてに条件変更の記述をしなければなりませんが、is_main_query と pre_get_posts フックを使う方法は functions.php 一箇所に書けば大丈夫というメリットがあります。

引用元:WordPressでホームやアーカイブ毎に表示条件を変える(is_main_query と pre_get_posts フック) | Gatespace’s Blog

通常のループ処理だと”メインクエリ”を呼び出す、つまり通常の投稿内容を表示させることになるのですが、上記処理にてメインクエリを投稿からカスタム投稿に変更しているということのようです(home.phpが使われる場合に限って)。

ざっくばらんなまとめ(推測含む)。

add_action( 'pre_get_posts', 'foo_modify_query_exclude_category' );
→pre_get_postsにフックする関数foo_modify_query_exclude_categoryを指定。

if (! is_admin() && $query->is_main_query() && $query->is_home())
→関数foo_modify_query_exclude_categoryの条件を定義。条件は管理画面以外でメインクエリを呼び出しているとき、且つテンプレートがhome.phpである場合。

$query->set( 'post_type', 'custom-post');
→関数foo_modify_query_exclude_categoryの条件が満たされたら、$queryにcustom-postという投稿タイプをセットする。

以上の文脈から推測すると$queryがメインクエリのような気がします。

もっともっとまとめると、関数foo_modify_query_exclude_categoryが実行されてメインクエリが改変され、home.php(呼び出されたループ処理)によってhome.phpでカスタム投稿タイプが出力されるという流れ…なんだと思います。多分。

参考サイト:
WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック

[WordPress]マルチサイトの情報収集

WordPressでマルチサイト機能を使う可能性が出てきたので、参考になるサイトをブックマークしてみました。

※マルチサイト機能とは、ひとつのWordPressコアを使って複数のサイトを運用する機能のことです。サブドメイン、サブディリクトリが使用できます。

WordPressマルチサイト機能のメリット・デメリット | オヤジのための快適ITライフ
マルチサイトのメリット・デメリットが簡潔に紹介されています。複数サイトをサポートしていないプラグインもあるようです。

WordPress のマルチサイト機能を実用化レベルにするために必要な設定や注意事項まとめ | ウェブル
こちらでもマルチサイトの注意事項が丁寧に書かれています。複数サイトの初期設定に関しての記述が興味深いです。

ロリポップにインストールしたWordPressをサブドメインでマルチサイトにするには « echooed & wordpress
ロリポップサーバーにて実際に運用する場合の細かい説明がスクリーンショット付きで掲載されています。

WordPress 3.0のマルチサイトは「意味がない」という結論 | Goldmine1969 :: BLOG
マルチサイトのデメリットに関する考察。場合によってはあまり意味が無いケースも想定できますね。

WordPress 3.x マルチサイト機能有効化の作業メモ | ID-Blogger
仮サーバーでマルチサイトを構築し、本番サーバーに移行作業した際のエラーと解決の記録。貴重な情報です。

WordPressで複数のサイトを運用する(複数ドメイン型) | WordPressならファーストサーバ
マルチサイト機能の設定の手順ががわかりやすく掲載されていいます。

サイトリニューアル時の301リダイレクト、.htaccess記述方法いろいろ|SEOまとめ
マルチサイト化と同時にドメインやURLの変更になるかも。リダイレクトについて詳しく書かれています。

有用な情報ばかりでとても助かります。各サイト管理者様、ありがとうございました!

WordPress:”2ページ目”かどうか判断し分岐する関数「is_paged()」を使えば、トップページのみバナー表示が可能に。

例えばトップページにのみバナーを掲載し、2ページ目以降はバナーを表示させない、などの要件に対応するには、以下のis_paged()を使えばよさそうです。

<?php if(is_home() && !is_paged()): ?>

//1ページ目にのみ表示させたいバナーやコンテンツなど。

<?php endif; ?>

is_home()だけでは2ページ目以降にもバナーが表示されます。
!is_paged()だけの場合はカテゴリページの1ページ目や、シングルページでもバナーが表示されます。

is_paged()関数は、分割された複数ページの2ページ目以降かどうかを調べるようです。

なので両方を指定すると、is_home()でトップページ、!is_paged()で2ページ以降ではない、という二つの条件が両立する状態となり、トップページでのみバナーを表示することができます。

WordPress:シングルページで前後の記事の有無を判定して条件分岐する。

単体記事のページで、次の記事、前の記事へのリンクを表示させることはよくあると思います。
表示させる方法を三つできてしまったので、せっかくなのでメモとして残しておきます。

たぶん一番基本的な書き方

<?php if(is_single()): ?>
<div class="pagelink">
    <?php next_post_link('<p class="pagenext">次の記事:%link</p>','%title',TRUE); ?>
    <?php previous_post_link('<p class="pageprev">前の記事:%link</p>','%title',TRUE); ?>
</div>
<?php endif; ?>

これが一番簡単そう。

前後の記事の有無を調べて条件分岐する

<?php if(is_single()): ?>
<div class="pagelink">
    <?php if (get_next_post()):?>
    <p class="pagenext">次の記事:<?php next_post_link('%link','%title',TRUE); ?></p>
<?php endif; ?>

<?php if (get_previous_post()):?>
    <p class="pageprev">前の記事:<?php previous_post_link('%link','%title',TRUE); ?></p>
<?php endif; ?>
</div>
<?php endif; ?>

get_next_post()とget_previous_post()は前後に記事があるかどうか判定するテンプレートタグです。もしリンクが無ければ何も出力しません。next_post_link()とprevious_post_link()の外に出したpタグも判定結果によって出力する、しないが変化します。パラメータにhtmlタグを記述しなくてもよいのですっきりして好ましいです。でも、ちょっとコードが長いなー。

まとめてみました

<?php if(is_single()): ?>
<div class="pagelink">
    <?php
        if (get_next_post()){
            echo '<p class="pagenext">',next_post_link('次の記事:%link','%title',TRUE),'</p>';
        }
        if (get_previous_post()){
            echo '<p class="pageprev">',previous_post_link('前の記事:%link','%title',TRUE),'</p>';
        }
    ?>
</div>
<?php endif; ?>

少しだけ短くなりました(^^;)。

以上、三つほどご紹介しましたが、自分の環境でテストした限りは全て同じ出力結果になりました。
ポイントとしては、出力するリンクにCSSで装飾するためのタグやクラスをどのようにして生成するか、前後に記事が無い場合にタグごと出力する、しないをコントロールすることができる、というところです。

おまけ:パラメータを見てみる

next_post_link()とprevious_post_link()のパラメータは、formatlinkin_same_catexcluded_categoriesとなってます。
実際に使用したコードは→
next_post_link(‘次の記事:%link’,’%title’,TRUE)
って感じです。

formatは文字列。前の記事:%link、次の記事:%link、と入れて次のパラメータで出力される文字列とくっつけました。

linkは一つ前のパラメータ、%linkに出力される内容を設定します。%titleがデフォルトで、記事のタイトルが表示されます。ここに前の記事、次の記事などの文字列も入れることができます。

in_same_catはFALSEがデフォルト。TRUEと入力すれば同じカテゴリーの記事でリンクが生成されます。

excluded_categoriesは表示させたくない記事のカテゴリーIDの番号だそうです。自分は使いませんでした。

参考:テンプレートタグ/next post link – WordPress Codex 日本語版
WordPressで前後記事が存在する場合のみリンク表示 – それからそれから
WordPressのシングルページで前後の投稿リンクを条件判定で出力するやり方 | bl6.jp

ありがとうございました!

WordPress:条件分岐。特定のページとその他のページでCSSを切り替える。

固定ページとそれ以外のページで異なるcssフィアルを適用させたいという場面が発生しました。
検索するといろいろとやり方はあるようですが、以下の「if-else文」でやってみました。

「if-else文」を入力してみる

以下のように内に記述します。

<link rel="stylesheet" type="text/css" href="<?php bloginfo('template_url'); ?>

<?php if (is_page()){ //固定ページかどうか判定。そうでなければスルー。
    echo'page.css'; //固定ページならpage.cssを出力する。
}   
else if(!is_page()){ //固定ページではないかどうか判定。つまり固定ページでない全てのphpファイルが該当する。
    echo'base.css'; //base.cssを出力する。
}?>

/ ">

固定ページなら

<link rel="stylesheet" type="text/css" href="テーマファイルのURL/css/page.css" />

固定ページ以外なら

<link rel="stylesheet" type="text/css" href="テーマファイルのURL/css/base.css" />

と出力されます。

is_page()が固定ページかどうかを判定する条件式。TRUE(当てはまる)ならpage.cssを出力しますが、FALSE(当てはまらない)なら出力しないで次のelse ifの条件式に進みます。

そこの条件式は!is_page() !がつくと~ではない場合TRUE(当てはまる)、この場合は固定ページではないページは全て当てはまる、と言う意味になります。

これで固定ページとそれ以外のページで分岐ができて、それぞれに適応させたいcssへのパスが出力されます。

ちょっと調べてみましたが、条件分岐はやりたい事や、やり方によっていろいろな書き方があるようです。以下のサイトさんは勉強になりました。

WordPressのテーマデザインでよく使うPHP構文、if-else文について | WordPress(ワードプレス)コミュニティ
もう覚えなくても大丈夫!?WordPressの条件分岐タグの使い方まとめ | Oxy notes

また、テンプレートファイルがたくさんあってそれぞれに異なるcssを当てたいときはfunctions.phpに追記する方法もあるようです。

WordPress:functions.phpでJSやCSSを一元管理する方法とバージョン表記を消す方法 | NxWorld

うーん、みんなすごいです!自分ももっと勉強して自在にWordpressを操れるようになりたいです!

「WordPress」文字数を制限してエントリーを投稿する方法+PHPの書き方

以下はエントリー一覧など、一定数の文字数の範囲で投稿を出力したいときなどに使える方法です。

<?php echo mb_substr(strip_tags($post-> post_content),0,200) ; ?>

これで投稿内容のうち、200文字までが表示されます。

では、なぜこれで文字数制限ができるのでしょうか?
気になったので調べて見ます。

関数と引数

まず、<?php ~ ?>の中身を見ていきます。

  • echo
  • mb_substr()
  • strip_tags()
  • $post-> post_content

の四つに分解してみます。echoを飛ばしてまず、mb_substr()から行きます。mb_substr()文字数を指定して文字列を取り出すphpの関数です。

続いて関数をよく見ると後ろに( )がついてます。その中にもいろいろと書かれていますね。ここには「引数」を記述します。引数とは

関数を実行するにあたり、「この情報を元に処理を行ってください」と、必要な情報(パラメータ)を関数に渡すための仕組み

です。文字数を制限して投稿した文章を取得するのには、三つの情報が必要です。

  • 投稿した文章
  • その投稿の何文字目から取り出すか
  • 何文字取り出すか

ですので引数を三つ渡します。この三つを( )の中に,で区切って入力します。

まず投稿した文章は$post-> post_contentで呼び出せるので、一番目の引数として使います。2番目の引数は”最初から”を意味する0を、3番目に200をいれます。組み立てると

mb_substr(strip_tags($post-> post_content),0,200);

となり、投稿文の0から200文字目までを取り出す指定ができます。strip_tags( )の説明が抜けてましたが、これは、

文字列からHTMLおよびPHPタグを取り除く

関数です。$post-> post_contentだけで投稿を取得した場合、投稿の中のhtmlのタグも取り出されます。タグが途切れて取得されるなどの不具合が起きる可能性があるので取り除くわけですね。

なのでstrip_tags( )の括弧に引数として入れて、htmlタグを取り除きます。そして最後の仕上げ、echoを使います。これは

取り出した文字列を表示させるための構文

です。取り出した文章は、echoを使うことによってブラウザに表示されます。これで完成です!

まとめ

このphp文は、

<?php echo mb_substr(strip_tags($post-> post_content),0,200) ; ?>

$post-> post_contentで取り出した投稿文から、strip_tags()でhtmlタグなどを取り除き、mb_substr()を使ってその投稿文の最初から200文字までを取り出し、echoを使ってブラウザに表示させる、という意味になります。

参考サイト

・WordPress文字数制限で記事を表示したい時 | UNIQUE-UNIQUE.net
・WordPress 覚書 文字出力時に制限と条件をかけて表示する | 3Bee.jp
・mb_substr:文字数を指定して文字列を取り出す
・Flash CS3入門 基本からActionScriptまで – 第7回 関数の便利な仕組み,「引数」と「戻り値」を理解する:ITpro
・strip_tags: 文字列から HTML および PHP タグを取り除く (String 関数) – PHPプロ!マニュアル
・文字列の出力(echo, print) – 文字列 – PHP入門

ありがとうございました!