メインクエリを改変!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プラグイン「Regenerate Thumbnails」

WordPress(var.3.5現在)では画像をアップロードするとアイキャッチ用画像を自動的にリサイズして生成してくれて便利なのですが、後から管理画面のアイキャッチ画像のサイズを変更した時に、すでにリサイズされたアイキャッチ画像を再度リサイズしてはくれません。

そんな場合は「Regenerate Thumbnails」というプラグインを使うとアイキャッチ画像の再リサイズ、再生成ができます。

今回のエントリーではRegenerate Thumbnailsの使い方をご紹介します。

※以下の作業を行う場合は事前にバックアップをとって下さいね。

目次

  1. 「設定」-「メディア」の中にあるサイズを任意のサイズに変更する。
  2. Regenerate Thumbnailsをインストールする。
  3. Regenerate Thumbnailsを実行してアイキャッチ画像をリサイズする。

1.「設定」-「メディア」の中にあるサイズを任意のサイズに変更する。

2.「Regenerate Thumbnails」をインストールする。

サイドメニューの「プラグイン」-「新規追加」から「Regenerate Thumbnails」を検索しインストールします。
するとサイドメニューの「ツール」中に「Regen. Thumbnails」という項目が追加されます。

インストール

3.「Regenerate Thumbnails」を実行してアイキャッチ画像をリサイズする。

サイドメニューの「ツール」の中の「Regen. Thumbnails」をクリックし、中にある「Regenerate All Thumbnails」ボタンをクリックして実行します。

ここをクリック

実行

※「設定」-「メディア」の中にあるサイズの画像が再生成される。

メディア設定

[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の変更になるかも。リダイレクトについて詳しく書かれています。

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

phpMyAdminで、2MBを超えたWordPressのバックアップファイルをインポートする方法

データベースのリストアはphpMyadmin

WordPressのデータベースのバックアップとリストアはいろいろと方法がありますが、自分はBackWPupというバックアップ用のプラグインを使って定期バックアップをしています。

このプラグインから出力されるsqlファイルをphpMyAdminを使ってデータベースにインポートすることによりリストアができます。

手軽なやり方なので重宝するのですが、sqlファイルのサイズが2MBを超えるとエラーが出てアップロードできなくなることがあります。
そんなときは、以下のコードをphp.iniに加えると解決します。

upload_max_filesize = 10M //アップロードされるファイルの最大サイズ
post_max_size = 10M //POSTメソッドで受け取るリクエストデータの最大サイズ

上記コードでは10MBに拡張されています。

原因と対策

phpの初期設定でアップロードするファイルの上限が2MBに設定されているからです。さらに、POSTメソッドで受け取るリクエストデータの上限が8MBに設定されています。なので、PHPの設定ファイルであるphp.iniを使って上限を上書きしてやる必要があります。

実作業

(1)php.iniを作成(編集)する。
(2)レンタルサーバーの管理画面で変更する。

(1)の方法は、WEBサイトをアップロードしているサーバーに、テキストエディタで前述のコードを記入し、php.iniと名前を付けて保存してサーバーにアップロードします。

(2)は、たとえばロリポップサーバーなら、ユーザー管理画面の「WEBツール」→「PHP設定」から変更ができるようになっています。

上限を何MBにするかはインポートしたいファイルサイズによって変わりますが、サーバーのリソースを食わないように必要最低限のサイズが良いと思います。

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:過去30日以内の投稿記事に「NEW」を表示する。

最新記事に「New」を表示させて、30日が経過したら自動的に「New」が消える動作を実現するphpコードです。

<!-- 過去30日以内の記事にNewマークつける -->
<?php
    $days=30;
    $today=date('U');
    $entry=get_the_time('U');
    $diff1=date('U',($today - $entry))/86400;
    if ($days > $diff1) {
  echo '<span class="new">New</span>';
  }
?>

表示させた”New”はCSSで装飾するといい感じですし、画像を配置してもいいですね。

以下のエントリから抜粋し、引用させて頂きました。ありがとうございました!

参考記事:WordPressでトップページに最新記事5件をリスト表示 –