まだ固定ページとか全部終わってないけど、作っている時に調べたこと(サイト)のまとめ。主にWordPress、というかPHPについて。ノンプログラマがやるとこうやって回り道することもあるけれど、それらを調べてる時間も本当に楽しい。
WordPressの公式オンラインマニュアル。大抵のことはここを見れば載っている。はず。詳しく知りたいときは原文を見に行く。でも、それを言い訳にはしたくないけど、ノンプログラマは原文見たって翻訳見たって分からないものは分からない。
テンプレートファイルの役割とか基本的なことを知るのに良いまとめ。自分は仕事で元々ある静的なサイトをCMS化したりとかしてたので、ある程度はテンプレートファイルの仕組みを理解していたので、理解しやすかった。
カテゴリ一覧はwp_list_categories()
という関数で出せるのだけど、タグ一覧を出す関数が無いっぽかったので、こちらの記事を参考にした。当サイトのサイドバーのタグ一覧は以下のコードでABC順で出力させている。
<h1>Tag</h1>
<ul>
<?php
$tagList = $wpdb->get_results($wpdb->prepare("
SELECT t.term_id,t.name,t.slug,tt.count
FROM $wpdb->terms AS t
JOIN $wpdb->term_taxonomy AS tt
USING(term_id)
WHERE tt.taxonomy = 'post_tag'
ORDER BY t.name ASC
"));
foreach ($tagList as $value) {
?>
<li><a href="/tag/<?php echo $value->slug; ?>/"><?php echo $value->name . '<span class="post-count"><span class="paren">(</span>' . $value->count . '<span class="paren">)</span></span>'; ?></a></li>
<?php } ?>
</ul>
月別一覧を「/yyyy/mm/」形式で出力させたかったのだけど、相当調べたつもりだけどうまくいかず、たどり着いたのがこの記事。なんとなくやってることは分かるのだけど、もっとスマートな方法がありそうな気がするので、詳しい説明は省く。当サイトのサイドバーの月別一覧を出力させているコードは以下。
<h1>Archive</h1>
<ul>
<?php
global $wpdb;
$limit = 0;
$year_prev = null;
$months = $wpdb->get_results("SELECT DISTINCT MONTH( post_date ) AS month , YEAR( post_date ) AS year, COUNT( id ) as post_count FROM $wpdb->posts WHERE post_status = 'publish' and post_date <= now( ) and post_type = 'post' GROUP BY month , year ORDER BY post_date DESC");
foreach($months as $month) {
?>
<li><a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/<?php echo date("m", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>/"><?php echo date("Y-m", mktime(0, 0, 0, $month->month, 1, $month->year)) . '<span class="post-count"><span class="paren">(</span>' . $month->post_count . '<span class="paren">)</span></span>'; ?></a></li>
<?php } ?>
</ul>
こちらの記事を参考に、トップページ(http://simpleism.net/)以外ではtitle
属性に「○○ | SimpleIsm」というように、タイトルとサイト名を出力するようにしている。普通にCodexを見れば分かりそうだけど、何も知らないのでとりあえず「WordPress トップ以外」というような検索の仕方をして、その時に出てきたこちらの記事を参考にさせていただいた。title
属性は以下のようなコードを書いて出力させている。
<title>
<?php if(!is_home()) { echo the_title() . ' | '; } ?>SimpleIsm
</title>
カテゴリ一覧を出力させるコードの参考にさせていただいた。この記事のあとにWordPress でカテゴリ一覧を取得する場合は get_terms() じゃなくて get_categories() を使った方がラクチンという記事を書いておられていて、確かにその通りなのだけど、rel
属性が付加されて、その属性値(category tag
)だとHTML5でinvalidになってしまう。WordPressのカテゴリーリストからrel属性をカットする | LD.ymst.net | 郡山市でホームページを制作している人のブログのコードをfunctions.phpに書くと消せるらしいけど、当時function.php(sが抜けてる)というファイル名で編集しており、全然反映されねー!ってなり、get_terms()
で出力させている。パフォーマンスに影響を与えないのであれば、このままでいいかなと思っている。ちなみに、現時点で当サイトではfunctions.phpは使用していない。
<h1>Category</h1>
<ul>
<?php
$terms = get_categories();
foreach ($terms as $term) {
?>
<li><a href="<?php echo get_category_link($term->term_id); ?>"><?php echo $term->name . '<span class="post-count"><span class="paren">(</span>' . $term->count . '<span class="paren">)</span></span>'; ?></a></li>
<?php } ?>
</ul>
固定ページ専用のsection
要素のid
属性を出力させるコードの参考に。
各記事のソーシャルボタンをテキストベースで表示したかったため、参考にさせていただいた記事。
ソーシャルボタンのhref
属性には記事のタイトルが入るのだけど、当然日本語などのマルチバイト文字が入ることもあり、それをエスケープするためのコードを書くときの参考にさせていただいた。
ソーシャルボタンではてブのみ、ブックマークされていないと何も表示されないため、ブックマークされていないときでも”0″と表示されるようにしたかったので、そのときの参考にさせていただいた。
ちなみに、ブックマークされていないURL(file_get_contents(URL)
)をvar_dump($hoge)
するとstring(0) ""
という結果になる。で、これを”0″と表示させる判定は以下のどれがプログラマ的なのかを同僚に聞いてみた。
if($hoge == null) {
echo "0";
}
if ($hoge == "") {
echo "0";
}
if(empty($hoge)) {
echo "0";
}
で、答えとしては明確に""
を判定したいのなら、イコールを3つ使うのが一番厳密だけど、null
や数値型の0のときも”0″と表示したいなら、empty
で問題ないとのこと。全部まとめたのが以下のコード
<div class="social">
<?php
$get_twitter = 'http://urls.api.twitter.com/1/urls/count.json?url=' . get_permalink();
$json = file_get_contents($get_twitter);
$json = json_decode($json);
$tweets = $json->{'count'}; //ツイート数
$get_facebook = 'http://api.facebook.com/restserver.php?method=links.getStats&urls=' . get_permalink();
$xml = file_get_contents($get_facebook);
$xml = simplexml_load_string($xml);
$likes = $xml->link_stat->like_count; //いいね!数
$get_hatebu = 'http://api.b.st-hatena.com/entry.count?url=' . get_permalink();
$hatebu = file_get_contents($get_hatebu); //はてなブックマーク数
if(empty($hatebu)) {
$hatebu = '0';
}
?>
<ul>
<li class="twitter">
<a href="http://twitter.com/share?text=<?php echo urlencode(the_title("","",0)) ?>&url=<?php the_permalink(); ?>" onclick="window.open(this.href,'window','toolbar=no,width=650,height=450');return false;">t</a>
<span class="count"><?php echo $tweets ?></span>
</li>
<li class="facebook">
<a href="http://www.facebook.com/sharer.php?u=<?php the_permalink(); ?>&t=<?php echo urlencode(the_title("","",0)) ?>" onclick="window.open(this.href,'window','toolbar=no,width=650,height=450');return false;">f</a>
<span class="count"><?php echo $likes; ?></span>
</li>
<li class="hatena">
<a href="http://b.hatena.ne.jp/add?mode=confirm&url=<?php the_permalink(); ?>&title=<?php echo urlencode(the_title("","",0)) ?>" onclick="window.open(this.href,'window','toolbar=no,width=510,height=500');return false;">B!</a>
<span class="count"><?php echo $hatebu; ?></span>
</li>
</ul>
</div>
タイトルの通り。助かった…。
以上が調べたことまとめ。301リダイレクトとかも調べたけど、それは今回は割愛。コードも冗長的で汚かったりするものもありそうだけど、まずは形にすることが大事だと思うので今のところはOK。調べてトライアンドエラーを繰り返してる間本当に楽しかった!やっぱこういうのだよなーと改めて思った。
それでは、このサイトを作った当時も書いていたけど、参考にさせていただいたサイト及び管理人の方々、どうもありがとうございました。