「webで何か」作るブログ

35歳という遅すぎるスタートをなんとかする為のブログです。基本的に自分にとっての役立ちメモ。

search.phpの作成

search.phpを作成した時のメモです。

search.phpについては、そのほかのindex系や単体ページ系のテンプレートとは異なる部分がいくつかあり、その部分をまとめておきたいと思います。

なお、今回は検索ページと検索結果ページを一つにまとめる構成にしています。

コード

hp

search.php独自の部分は?

the_search_query();

「検索された語句」を出力する関数があります。今回はヘッダーの中に設置したh1のテキストとして出力しています。ただ、検索を経ずにこのページに来ることもあるとすると、検索クエリが含まれているかどうかを判別しないといけないですね。というわけでget_search_queryを使って条件分岐を行ってます。

説明
検索が行われたときに、そのリクエストの検索クエリを表示します。

このファンクションは HTML 属性の中 (以下に示す「検索窓」の例のように) でも安全に使えます。

値を取得するには get_search_query / en を使ってください。

使い方
<?php the_search_query(); ?>

テンプレートタグ/the search query

get_search_form();

get_search_formを使うことで、WordPressの検索フォームを設置することができます。デフォルトのデザインから変更するにはsearchform.phpを作成を利用しますが、その点はまた次回に。

検索結果画面のクエリ

これはテーマファイルの名称がきちんとsearch.phpになっていれば通常のループで問題ないみたいです。

ループについて|WordPressテーマの作り方

 

 

ページ送りがデフォルトだったり、サイドバーが一切なかったりしてますが、テーマを利用し始めました。使いながら少しつ良くしていきたいなと思います。

あと、はてなブログからgithub.ioへ引っ越しました。VCCW+StaticPress+github.ioの組み合わせで無料ホスティング。
若干手間は増えますが、そのあたりの自動化も課題としてやっていきたいなと思います。

さてタイトルの件ですが、今現在ほとんどのページでアイキャッチを設定していません。イコール、インデックス系のページにはサムネイルがありません。大事なのは理解しているのですが、正直若干面倒だな…と思うんですよね。

このテーマのヘッダーデザインはそういう理由だったりもします。この作りなら忘れてしまってもカッコつくかなと。

とは言え、カテゴリとかタグのページにはどうしても必要ですし、これまで設定してこなかった分を一つ一つ設定するよりアイキャッチ画像のデフォルト設定をしてしまった方が勉強にもなるし一石二鳥だ!というわけでアイキャッチにデフォルト設定をかけていきます。

特定の画像をデフォルト画像としてアイキャッチに設定する方法

add_action( 'save_post', 'save_default_thumbnail' );
function save_default_thumbnail( $post_id ) {
	$post_thumbnail = get_post_meta( $post_id, $key = '_thumbnail_id', $single = true );
	if ( !wp_is_post_revision( $post_id ) ) {
		if ( empty( $post_thumbnail ) ) {
			update_post_meta( $post_id, $meta_key = '_thumbnail_id', $meta_value = '56' );
		}
	}
}

WordPressのアイキャッチ画像に任意のデフォルト画像を登録する方法
WordPressのアイキャッチ画像に任意のデフォルト画像を登録する方法をご紹介します。クライアントワークでも使えると思います。−kachibito.netさまより引用

デフォルト画像はこちらを設定します。まずは任意の画像をアップ。全投稿を更新します。

写真ACさんよりいただきました。

実行結果

before

after

無事、期待通りの結果になりました!続いてなぜこうなるのか?を追っていきます。

コードの仕組み

まず、フックになっているpost_saveですが、Codexによると

インポート機能の利用、投稿・ページ編集フォームの利用、XMLRPCでの投稿、メールでの投稿のうちいずれかの方法で投稿・ページが作成・更新された際に実行する。実行されるタイミングはデータがデータベースに保存された後。アクション関数引数: 投稿 ID投稿 ID は最後に保存した投稿ではなく投稿履歴を参照していることもある。実際の投稿の ID を取得するには、[[関数リファレンス/wp_is_post_revision()]] を使う。

WordPressCodex-アクションフック一覧

とのこと。要は何かしら投稿が保存されたタイミングで何かしたいときにどうぞーということですね。で、引数にはpost_idが渡されるので、保存が行われた投稿に対してのみの動作になると。なるほど。

実際の処理の流れは、

  1. get_post_metaでサムネイルを$post_thumbnailに入れて、(thumbnailってカスタムフィールド扱いだったんですね)
  2. !wp_is_post_revision( $post_id )でリビジョン除外して、
  3. 取ってきた$post_thumbnailが空だったらupdate_post_metaでサムネイルの書き換え

と。post_meta系は色々と使い道がありそうですね。以上、デフォルトのアイキャッチを設定する方法でした。

 

 

投稿のアイキャッチにデフォルトの画像を設定する仕組み

 しばらく書いていませんでしたが、WordPressテーマの作成を続けています。

この投稿では、作成したindex.phpを振り返りながら、ループやWordPressの関数についてメモをしておきたいと思います。

まずはコードを貼り付けます。(前回からだいぶ変わりました。)

index.php

ループの役割

WordPressでは「ループ」という単語がよく使われています。

(3行目:<?php if(have_posts()):?><?php while(have_posts()):the_post();?>)

これがあることによって、クエリに応じた各種の情報がデータベースからページ内に取り込まれて、記事の表示ができるようになります。

また、ループでは一つ一つのページに含まれる情報が多次元配列によってページごとの配列で返ってくるので、例えばarchive.phpなんかでは、foreachを使ってページごとにカテゴリ情報を吐き出して表示することができたりします。

この辺り、想像しただけでコアの作成は大変なんだろうなと思いますね。

 

WordPressには便利な関数が色々用意されていますが、ループの中でしか使えない関数というのも多くあるので注意しておきたいところです。

ちょっと変なところでループを始めてる理由

多くのテーマでは、header.phpにheaderが書かれていて、各テンプレートファイルにループが書かれているのですが、今回そうしませんでした。

headerって、そのページやセクションが何者であるのか?を簡潔に提示すべき場所なんじゃないかなあと思っていて、タイトルとしてのH1、カテゴリ系のナビ、抜粋、サムネイルを入れています。

その中で抜粋を表示する the_excerpt( ) ; がループの中でしか使えなかった。

そういうわけでheaderの中でループが始まって始まっています。

管理コストは上がるんですが、自分で使うだけなのでいいかなと。

header.phpの中で別にループさせてもやりたいことはできていましたが、それもなんだか気持ち悪くてこの形に落ち着きました。

ヘッダーの現状

f:id:pochiweb:20171103104121p:plain

サムネイルをフルサイズで出力して、かつpositionでheaderの裏に回して、グラデーションを効かせて、タイトル、抜粋、カテゴリ系のナビ。結構気に入っています。

 

 

WeProject 10月の振り返り

10月が終わると途端に年末が近くなった感じがします。

そして、そんなタイミングで年初に立てた目標を思い出し、その達成率が非常に危うい状態になっていることに今気がつき、反省しきりな最近です。年初に立てた目標は月々振り返らないと。

WeProject 10月の振り返り

まずは記録。

勉強

27:17
読書 03:05
WordPressテーマ作成 23:12
PHP学習 00:59
BLOG 00:38

合計で約28時間。1月から10月で206時間を費やしているようですが、目標に対してはあと180時間足りない。10カクライユウキュウトッタラナントカナルカナ。

We Project9月の振り返り

WordPressのテーマを作る中で、HTMLと文書構造とか色々と悩んでしまって手が止まっていたこともあり、1ヶ月ぶりの更新となりました。ひとまず9月の振り返りをします。10月も終わるじゃないか!という時期ではありますが。

WeProject 9月にあったこと

さいたまDTPデザイン勉強会に参加しました

9月2日に開催された、さいたまDTPデザイン勉強会に参加しました。

デザインは素人もいいところなのですが、やはりこれからはデザインも多少わかっていないと仕事に差し支えるなと思うところです。

デザイナーが基本とする原則をこちらがわかっていればコードを書くのもスムーズになるでしょうし、何よりできる仕事の幅が広がるのはいいこと。

WordCampTokyoに参加しました

9月16日、WordCampTokyoに参加しました。多くのセッションを聞いて非常に刺激を受けたことにより、その後更新頻度が劇上がりしました。しかしWordPressテーマ制作の過程で文書構造に悩まされ、更新がストップ。

勉強時間の記録

9月はイベントが参加があったため、それなりに勉強時間を取れていたと思いきやそうでもなかった。約25時間。一応月間目標は35時間なので、10時間のマイナス。イベントも時間にカウントしてしまいたい!けど我慢。

 

Activity Type Duration Percent
Total 719:59 100.0%
勉強 18:30 2.6
読書 02:01 0.3
PHP 06:52 1.0
Python 01:07 0.2
Git 00:30 0.1
WordPressテーマ作成 07:59 1.1
BLOG 06:39 0.9

今年の自主勉強時間は9月までで約178時間。やばい目標に対して160時間足りない。

archive.phpの作成|WordPressテーマの作り方

r珍しく二本更新します。今回はarchive.phpを作成します。archive.phpはカテゴリーやタグなどのリンクをクリックされた時に呼び出されるテンプレートです。

多くは、タイトル、カテゴリー、タグ、投稿日、、アイキャッチ画像、記事の抜粋が表示されます。記事の一覧ページといえばわかりやすいでしょうか?

とはいえ、先日までに作成したindex.phpとほぼ変わりません。

コード

archive.phpを作成

アイキャッチの有効化と表示

見た通りほとんどはindex.phpと同様なのですが、index.phpから追加、変更された部分として20~26行目の内容があります。

post_tumbnails関数で表示をコントロールする

まず、post_thumb_nailはアイキャッチ画像と呼ばれる画像に関わるものです。記事一覧のページを開くと、そのページを象徴するような画像が表示されていることが多いですが、そういった画像のことをアイキャッチ画像と言います。

アイキャッチ画像は記事の投稿画面から設定可能になるのですが、初期状態ではその機能がオフになっているため、functions.phpに以下のコードを挿入する必要があります。

アイキャッチの有効化

add_theme_suportでアイキャッチを有効化

theme suportはWordPressであらかじめ用意されている各種の機能を利用するための関数で、今回利用したpost-thumbnails以外にもカスタムヘッダーなどのいくつかの機能があります。詳しくはCodexにて。

数リファレンス/add theme support - WordPress Codex 日本語版

 

アイキャッチを有効化することで、記事作成画面で以下のエリアが表示されるようになりました。わぷーかわいい。

f:id:pochiweb:20170924225540p:plain

excerptで抜粋文を表示する

26行目は、index.phpでthe_contentが書かれていた代わりにexcerptを書きました。記事一覧画面ですので、全文表示をしてしまっては何かを探しているユーザーのみなさんにとっては不親切、、ということで抜粋文を表示することにしました。

テンプレートタグ/the excerpt - WordPress Codex 日本語版

文字数や、デフォルトで[...]となっている部分を変更可能になっています。

次回はページ送りを搭載していきたいと思います。

 

 

カテゴリ、タグ、投稿日を表示する|WordPressテーマの作り方

今日はHTML5カンファレンスですね。Webエンジニアを目指す身としては是非とも行きたいところでしたが、今月は色々イベントに参加していて、自粛致しました。来年はどうだろう?

投稿の基本情報を表示する

さて先日までで最低限、投稿内容とメニューが表示されるようになりましたが、今回は投稿の各種情報を表示させる機能を追加します。

各種の情報とは、投稿日、カテゴリー、タグの三つです。

コード

カテゴリとタグ、投稿日を表示させる。

処理内容のメモ(リンクはCodexです。)

2,3行目のget_the_categoryget_the_tagsでそれぞれの情報を取得して、変数に代入。
ifと!emptyにて、値がからかどうか?で条件判定を行なったのちに、foreachにて変数の中身をそれぞれに代入して展開。

今回はそれぞれ別のulにて用意をしました。

あと、the_timedで登校日を表示する。時間は AM/PM/24時間 それぞれの表示を指定可能なのでお好みで。