フロントページの表示あれこれ

表示設定にある「フロントページの表示」、これがどうも解りづらいので調べてみました。

最新の投稿

これを選択すると、自動的にフロントページのループに投稿が表示されるようになります。

  • 適応されるテンプレート:front-page.php ない場合は home.php
  • 適応される条件分岐タグ:is_front_page(),is_home()
  • URL:/(サイトのルート)

固定ページ

これを選択すると、任意の固定ページをフロントページとして表示させることが出来ます。

「フロントページ」だけを設定

任意の固定ページがフロントページとして表示されるようになります。ループには固定ページの内容が表示されます。

  • 適応されるテンプレート:front-page.php ない場合は page.php
  • 適応される条件分岐タグ:is_front_page()
  • URL:/(サイトのルート)

front-page.phpを置かなければpage.php(カスタムテンプレートもOK)が適応されるため、ホームを複数用意しておいて表示設定で簡単切り替え…ということも出来るわけです。

 

「投稿ページ」だけを設定

任意の固定ページがフロントページとして表示されるようになります。ループには投稿の内容が表示されます。

  • 適応されるテンプレート:home.php ない場合は index.php
  • 適応される条件分岐タグ:is_home()
  • URL:/(サイトのルート)と /example(任意のスラッグ)

…この「投稿ページ」という設定項目が実に謎でした。
せっかくの固定ページなのに、設定したとたんにテンプレートがhome.phpまたはindex,phpになってしまいます。ループに表示されるのも投稿ですし、「最新の投稿」を選ぶのと変わらないのでは?と思っていたのですが、次のような違いがあることがわかりました。

【表示される投稿に依存せずにスラッグを決められる】
たとえば「hoge」というカテゴリのアーカイブを表示させたとしても、その固定ページのスラッグが「example」ならURLは「/example」となります。(まあ、固定ページなので当たり前といえば当たり前ですが…)
その場合、サイトのフロントページと同じページがもう1つ存在する状況となります。…この状況が活用される場面はあるのでしょうか。「フロントページ」を同時設定したほうがスマートかもしれません。

【wp_list_pages()でURLを吐き出せる】
グローバルナビのひとつとして「お知らせ」とか「ブログ」を出したい、しかもwp_list_pages()で自動吐き出しにしたい!というときに実現できます。これも、「フロントページ」を同時設定したほうがスマートでしょう。

 

雑感

ぶっちゃけ「固定ページ」の「投稿ページ」設定は個人的には必要ないです(笑)
wp_list_pages()でURLを吐き出せるのは少し魅力ですが、実際の作業ではハードコードすることが多いので、あまり必要ないかな…。

 

テンプレートと条件分岐タグ対応表
最新の投稿 固定ページ
フロントページ 投稿ページ
テンプレート front-page.php front-page.php home.php
条件分岐タグ is_front_page(), is_home() is_front_page() is_home()

get_page_uri()

固定ページのスラッグを取得します。

例えば企業サイトなどで、ページ毎にイメージ画像を変えたいとき、今まで私はif文による条件分岐でハードコードしてました。これが地味に時間を食うのです。。。

例)

<h2>
<?php // この会社について
if(is_page('about')): ?>
<img src="img/about.jpg">
<?php // 製品について
elseif(is_page('product')): ?>
<img src="img/product.jpg">
<?php // お問い合わせ
elseif(is_page('contact')): ?>
<img src="img/contact.jpg">
・
・
・
<?php
endif; ?>
</h2>

この面倒くさいif文が、下記のように1行ですんでしまいます。
画像名にページスラッグを規則的に使っている場合に限定されますが。
(というか是非そのような画像名にしましょう)

 

<h2><img src="img/<?php echo get_page_uri($post->ID);?>.jpg"></h2>

 

コードは必要最小限に書くことが、解りやすさ・速さにつながるんだなーと痛感します。

is_home()とis_front_page()の違いって何?

ずっと謎だったので検証してみました。
「表示設定」で「フロントページの表示」をどう設定しているかによって
is_home()が機能したり、is_front_page()が機能したり、また両方機能したりします。
結果は…

is_front_page()とis_home()の両方機能

is_front_page()が機能

固定ページ>フロントページ

is_home()が機能

固定ページ>投稿ページ

 

is_home()の存在理由となっているのがこの「固定ページ」の「投稿ページ」です。何ですかこれは…。

どうやら「ブログのトップページ」ということらしいのですが、非常に理解しづらかったです。フォーラムでも熱いやりとりが交わされています

私の場合、「ブログのトップページ」は、ブログとして使うカテゴリのアーカイブページを利用するので、個人的にはいらない機能です。唯一、意味があるとすればwp_list_pages()で「ブログのトップページ」が吐き出せることでしょうか。

謎は残りますが、is_home()とis_front_page()がそれぞれどういうときに機能するのかがわかり、一応すっきりしました。

なんだか気になったのでさらに検証してみました。

関連記事

マルチブログでの条件分岐

親ブログかどうかの条件分岐タグはありますが、それだけだと不便です。
子ブログのときも、それぞれに条件分岐させたいときがあります。そんなときは、ブログIDで条件分岐させてしまいましょう。

コード記述例

<?php // ブログIDを取得し$blog_idに代入
global $current_blog;
$blog_id = $current_blog->blog_id;
// ブログIDが1のとき
if ($blog_id == 1){ ?>
<!-- ID1のブログに出したい内容 -->
<?php // ブログIDが2のとき
} else if ($blog_id == 2){ ?>
<!-- ID2のブログに出したい内容 -->
<?php } ?>

ちなみにブログIDの調べ方は、ダッシュボード上部の黒帯左側にある「参加サイト」→「サイトネットワーク管理者」→「サイト」で、「パス」にマウスオーバーすると画面下部にパスとidが表示されるので解ります。(ver.3.3.2、Macの場合)

get_the_category()

記事のカテゴリー情報を配列で返します。

※参考にさせてい頂いたサイト様:WordPress私的マニュアル

 

位置

ループ内・外

引数

なし

変数

カテゴリーID cat_ID
カテゴリー名 cat_name
カテゴリースラッグ category_nicename
カテゴリー説明文 category_description
親カテゴリーID。ない場合「0」 category_parent
カテゴリーに属する記事数 category_count

※カテゴリーに関する部分のみ抜粋

コード記述例

カテゴリ名を表示

<?php // カテゴリ名を表示
$cat = get_the_category();
$cat = $cat[0];
echo $cat->cat_name;
?>

 

 

MAMPでWordPressのマルチサイトを構築したいとき

localのテストサーバとして活躍してくれるMAMP。
WordPressをlocalでテスト構築するときは、必ずこれのお世話になっています。
PHPMyAdminも自由にいじれるし、とても助かっていたのですが…、

WordPressのマルチサイト案件を構築するようになってから困った事が。
MAMPって、そのままだとマルチサイト構築できないんですよね。
ネットワークの設定をしようとしたら、ネットワークの設定のページで「:8888のようなポート番号は使えません。」と出て、先にすすめないんです。

ss_2012-06-03-16-14-40

ならば、ポート番号をちょっといじってしまいましょう!
※ちなみに、既にWordPressをインストールしてしまい、上記の画像のようなエラーが出ている状態ですと、WordPressはインストールし直しになります。

手順1

「MAMP」→「conf」→「apache」にある、「httpd.conf」というファイル。
これを下記のように変更します。(バックアップは必ずとっておきましょう)

  • 「Listen 8888」を「Listen 80」にする。
  • 「ServerName localhost:8888」を「ServerName localhost:80」にする。

手順2

MAMPを起動(または再起動)します。
※すでにWordPressをインストールしてしまった人は、今までみていたダッシュボードにはつながらなくなります。「localhost:8888 のサーバへの接続を確立できませんでした。」のエラーが出ます。

手順3

データベースを作成(または作りなおし)して、「localhost/wp-admin/」
へ接続。インストール画面が出ます。ここから先は、問題なくマルチサイトの設定ができるはずです!

 

めんどくさいですねー。
デフォルトでマルチサイト対応になってほしいものです。

 

参考サイト様:yamashinaの日記

is_main_site()

マルチサイトで、親ブログかどうかで条件分岐してくれるタグです。
でもこれだけでは不足なことが多いはず。それぞれの子ブログでも条件分岐したいときはブログIDを使うやり方があります。

 

コード記述例

<?php // 親ブログのとき
if (is_main_site()) {?>
// 親ブログのとき出したい内容
<?php } else { ?>
// 親ブログ以外のとき出したい内容
<?php } ?>

get_home_url()

マルチサイトで<?php bloginfo(‘url’); ?>の代わりに使うとGoodです。引数にブログIDを指定することにより、任意のブログのURLを取得することができます。
このタグを知るまで、いちいちswitch_to_blog();を使っていました^^;

引数

  • blog_id…ブログのID
  • path…ホームURLからの相対パス。
  • scheme…URLスキーム。現在利用できるのは ‘http’ と ‘https’。

コード記述例

ID2のブログのURLを表示

[html]<?php echo get_home_url(2); ?>[/html]

ID3のブログのURL直下に「/abc」を追加しURLスキームを「https」に変更。

[html]<?php echo home_url(3,’/abc’,’https’); ?>[/html]

現在のブログIDを自動的に取得してURLを吐き出す(実用性低いですがメモとして)

<?php
global $current_blog;
$this_blog_id = $current_blog->blog_id;
echo $this_blog_id;
echo get_home_url($this_blog_id);
?>

the_category()

現在の記事が属するカテゴリへのリンクを表示します。

位置

ループ内・外
※シングルページではどこに入れても問題ありませんが、アーカイブページだと入れる場所や、ページ内のループ等の要素により、思いがけないカテゴリを取得したりします。

引数

  • separator…(文字列) 各カテゴリリンクの間に表示する文字列・記号。デフォルトでは、番号なし箇条書き(<ul>)でリンクを並べます。
  • parents[オプション値]…(文字列) 記事が子(サブ)カテゴリに属するとき、カテゴリリンクで「親子」関係をどう表示するか?
    ※post_idを指定している時のみ動作するようです。
    ‘multiple’ – 親・子カテゴリへのリンクを分けて表示
    ‘single’ (初期値) – 親・子カテゴリを表示するが、リンクはまとめて子カテゴリへのリンクとなる。
    指定なし…子カテゴリのみ表示し、子カテゴリへのリンクとなる。
  • post_id…(整数) カテゴリを取得したい投稿ID。初期値は false(現在の投稿)。

 

コード記述例

<?php // 現在の記事が属するカテゴリへのリンクを<ul class="post-categories">で囲んで表示
the_category(); ?>
<?php // ID220の投稿が属する子カテゴリーへのリンクを表示する
the_category('','',220); ?>

previous_post _link()

シングルページで前のページへのパーマリンクを表示するのに使います。日付順で表示している記事からみてひとつ古い記事へのリンクを表示します。
※ひとつ新しい記事へのリンクはnext_post_link()を使います。

図解previous_post_link()

このタグに関するCodexの説明は、少し解りづらい部分があります。引数「in_same_cat」をtrueにし、同時に「excluded_categories」を指定する意味が私にはわかりません…。コード記述例をまるごと覚えてしまったほうが早いかもしれません。

あと、カスタムタクソノミーのシングルページにおいては、引数「in_same_cat」をtrueにすると動きません(リンク自体表示されない)。同一カスタムタクソノミー内での遷移は出来ないのかもしれません。falseにしてやるとリンクが表示され、同一カスタムポストタイプ内での遷移になります。…これ解るまで時間がかかりました…。

ちなみに、archiveページにこのタグをいれても表示はされます。が、リンク先がシングルページになってしまいます。archiveページでページングをしたいときはposts_nav_link()を使います。

位置

ループ内(ループ外でも動いてるっぽい)

引数

  • format…「%link」でURLを吐き出します。タグによる整形も可能。
  • link…「前の記事へ」のように、好みの文字列に変更できます。
  • in_same_cat…表示している記事と同じカテゴリーの前の記事を表示するかどうかを「true」または「false」で設定します。「true」の場合、同じカテゴリーの記事だけが表示されます。デフォルトは「false」です。カスタムタクソノミーのシングルページでは「true」だと動かないので注意。
  • excluded_categories…表示させたくない記事のカテゴリー ID の番号。Codexには「and」で区切ると書いてありますが、カンマ「,」で区切ります。

コード記述例

同一カテゴリー内で遷移する。文字を「前の記事へ」に変更

<?php previous_post_link('%link', '前の記事へ', true); ?>