テーマ

の記事

  • Feedにアイキャッチ画像を追加

    以前フィードに画像を追加する方法として、フィードテンプレートを上書きする方法をメモしていた。画像を追加するだけなら、もっと簡単な方法があった。

    [PHP]
    function my_thumbnail_feeds($content) {
    global $post;
    if(has_post_thumbnail($post->ID)) {
    $content = ‘

    ‘ . get_the_post_thumbnail($post->ID, array(150,150)) . ‘

    ‘ . $content;
    }
    return $content;
    }
    add_filter(‘the_excerpt_rss’, ‘my_thumbnail_feeds’);
    add_filter(‘the_content_feed’, ‘my_thumbnail_feeds’);
    [/PHP]

    なるほど、フィード用にもフィルタがあったんだ!

  • マルチサイトでWPtouch

    WPtouchの無料版では、機能制限としてテーマディレクトリを設定することができない。テーマディレクトリは/plugins/wotouch/themes/default/に固定されているので、スマホ用テーマを自作した際には、このディレクトリ下のファイルを差し替えるのが無難としてきた。
    このほど複数あったブログをひとつのWordPressにまとめ、マルチサイトとして管理するようにしたところ、ここでつまずいた。ブログは複数あるのに、WPTouchのテーマディレクトリが固定(ひとつしかない)ではブログによってスマホ用テーマを分けることはできないではないか。

    おとなしく有料版にグレードアップするしかないのか?
    そもそも有料版ではマルチサイトに対応しているのか?

    と諦めモードになりつつ、ダメモトでWPtouchのコアコードを修正する手段にでた。wptouch.phpの中にreturn ‘default’としている箇所が2つある。まさにテーマディレクトリを固定で返しているところだ。ここでディレクトリ名を操作できそうだ。get_blog_ID()によりマルチサイトのブログIDが分かるので、この値によってテーマ名を分ければよさそうだ。たとえばブログIDが2であればexample-2、3であればexample-3というように分岐してそれぞれのディレクトリにテーマファイルを置けばよい。結果、いまのところうまく動いている!

  • この投稿を先頭に固定表示

    公開状態のオプションとして「この投稿を先頭に固定表示」がある。
    テーマのループでは先頭に出現し、投稿ブロックにstickyというクラスが付加される。テーマを作成する際には、このstickyに対応することが要件となっている。つまり通常の投稿と区別するために、背景や文字色を変更しておくとよい。実際には「お知らせ」や「イベント告知」のようなかんじで利用するとよいのか?

    stickyかどうかは、is_sticky()で調べることができる。ついでに、どこに保存されているのかと調べてみるとwp_optionsテーブルのoption_nameが’sticky_posts’の箇所にあった。複数指定した場合でも、ここに配列として格納される。

  • コメントの表示数を制限する

    singleページでのコメントの表示数について、
    ディスカッション設定によりコメントを複数ページに分割表示できるものの、singleページを表示するタイミングで取得するコメントは常にその記事に関するコメントすべてとなる。つまりコメントを5件づつ表示する場合でも、その投稿についてコメントが100件あれば100件を取得している。

    あるサイトのサーバー負荷が異様に重くて調べたところ、特定の記事についてコメントが10000件以上ついているためと分かった。この10000件とは決してスパムではなく、singleページがFLASHゲームで遊ぶ構成になっているため人気ゲームにコメントがたくさんついてしまったのだ。コメントは最新の50件を5件づつ分割表示している。必要なコメントは50件なので、できれば古くなったコメントを削除してしまいたかった。しかしサイト運営者からは過去のコメントを削除しないようにと要求されている。
    そうこうしているうちに、問題となるslow queryが浮かび上がった。
    SELECT wp_comments.* FROM wp_comments WHERE comment_post_ID = '99' AND comment_approved = '1' ORDER BY comment_date_gm

    このSQL文はwp-includes/comment-template.phpのcomments_template()という関数にあった。singleページを表示するさいにグローバル変数の$commentsにコメント配列をセットしている部分である。

    ここにLIMITを追加すればよいのだろうがコアコードは修正できない。フォーラムで質問したところ、query フックでlimit句を追加するアドバイスをいただいた。しかし、コメント取得のSQL文は3とおりがあり並び順が固定の場合もあるため、どうも思ったとおりにいかない。そうこうしているうちに、コメントの取得に件数が制限できないのはコメント階層を考慮してのことだと気付いた。単純にLIMITを付けるだけではダメなのだ。

    今回はコメント階層を使っていないということもあり、comments_template()をfunction.phpにリネームコピーしてカスタマイズすることで対処した。 ここのSQL文のORDERをDESCにして、LIMITを追加。さらにsingle.phpからcomments_template()を呼んでいる部分を、新しい関数名に変更した。

    問題のsingleページはなんとか軽くなったように思う。
    こんな対応でよいのかな?10000件もコメントがつくとは想定外だ。

  • 表示条件にキーワードを含める

    一覧の表示条件にキーワードを含めるとは、指定のキーワードでの検索結果つまり、
    ブログのURL?s=キーワード
    をやりたいのである。これを検索フォームを使わずに、query_posts()でやってみた。

    [PHP]
    query_posts(array(‘s’=>’キーワード’));
    if (have_posts()){
    while (have_posts()) : the_post();
    // 処理
    endwhile;
    }
    wp_reset_query();
    [/PHP]

    Codexには、query_posts()のパタメータとしてキーワードは記載されていないものの、検索フォームのパラメータであるsを使ってみたらうまくいった。あたりまえといえばあたりまえなのか、こんなことやる必要のある人がいないだけか。

  • コメントをスレッド対応

    バージョン2.7あたりからコメントがスレッド対応になっていたものの、使ったことがなかった。コメントのコールバック関数に以下を追加すると、コメントに対して「返信」のリンクが表示される。

    [PHP]
    comment_reply_link( array_merge( $args, array( ‘depth’ => $depth, ‘max_depth’ => $args[‘max_depth’] ) ) );
    [/PHP]

    $depthはコメント階層を示す値で、コールバック関数の第3パラメータに入ってくる。

    「返信」をクリックすると返信用のフォームが表示され、特定のコメントに対して返信することができる。表示する際にはCSSで<li>のネストに対応すればよい。以前から謎のひとつだった、コールバック関数の<li>を閉じてはいけない理由はここにあったのだ!

  • 検索範囲をコントロールする

    日本語ページと英語ページに対応した企業サイトを作成した際に、検索フォームをそのまま使うと検索結果に日本語と英語が混在してしまい悩んだことがある。もちろん日本語ページで検索した場合には日本語のみ、英語ページでは英語のみの結果がヒットしなければならない。

    検索フォームにhiddenパラメータを追加することで、検索範囲を絞ることができる。前述の企業サイトではデフォルトは日本語の記事で、英語の記事には”英語”というカテゴリをチェックする決まりにしていたので、検索範囲としてカテゴリを指定すればよいことが分かった。
    具体的には、英語ページのみ対象としたい場合は検索フォームの中に以下を追加する。
    [PHP]
    term_id; ?>” name=”cat” />
    [/PHP]

    カテゴリ以外にも投稿タイプなどを指定することができる。例えばデフォルトでは記事とページが検索対象となっているので、記事のみ検索したい場合は、以下の指定になる。
    [PHP]
    [/PHP]

    これらを組み合わせて指定することもできる。ただしこのように検索フォームに記述した場合は、GETパラメータとしてURLに見えてしまう。これが格好悪いとするなら、search.phpのループ前にquery_posts()で条件を加える方法もあるだろう。

  • 「続きを読む…」をカスタマイズ

    記事の一覧ページで、the_excerpt()により記事の抜粋を表示した後ろには[…]が付いてくる。excerpt_moreというフィルターを使えばここをカスタマイズできる。

    [PHP]
    function my_excerpt_more($post) {
    return ‘

  • カスタムフィールドでソート

    記事一覧の並び順はデフォルトで日付が新しい順になっている。
    これを変更するには、ループの直前でquery_posts()を使いorderbyパラメータを指定する。記事タイトルやコメント数のほか、カスタムフィールドの値によって並び替えることでもできる。カスタムフィールドでソートする場合には、orderby=meta_value の他に meta_key=’キー名’ を指定する。

    [PHP]


    // 表示


    [/PHP]

    ただしカスタムフィールドは文字型のため、数値としてソートしたい場合はアクションフックの posts_orderby を併用するとよい。

    [PHP]
    function my_orderby($orderby) {

    global $wpdb;

    if (get_query_var(‘meta_key’) == ‘キー名’) {
    $orderby = “CAST($wpdb->postmeta.meta_value AS UNSIGNED) ASC”;
    }

    return $orderby;
    }

    add_filter(‘posts_orderby’, ‘my_orderby’);

    [/PHP]

  • フォトログテーマ「BirdSITE」がテーマディレクトリに登場

    birdsiteフォトログ用のテーマ「BirdSITE」が、WordPressテーマディレクトリに登録されました!
    WordPress.orgからのテーマレビューで何度もダメだしされながら、英語も苦手なために挫折しそうになったものの、晴れて公式テーマは嬉しい。
    http://wordpress.org/extend/themes/birdsite

    これまれの経過
    ・8/11 WordPress.orgに登録申請
    ・8/13 1回目のテーマレビュー「DEBUGモードで開発せよ」
    ・8/17 再申請
    ・8/24 2回目のテーマレビュー「WordPress 3.0に対応せよ」
    ・9/8 再々申請
    ・9/16 3回目のテーマレビュー「Very good work.」
    ・9/18 テーマディレクトリに掲載

    テーマの原案は昨年末に赤羽で行われたWordBench東京もくもく部(みんなで集まってもくもくと何かを作る会)をきっかけに出たもの。そこでアドバイスを受けテーマディレクトリへの登録を目標とし、ウィジェット対応や多言語対応などしてやっと8月に申請。その間WordPressは3.0へのメジャーアップデートがあったためカスタムメニューやアイキャッチなど開発要件が増えているのに気付かなかった。そのあたりテーマレビューで指摘を受け、3度めの提出で登録された。最初に申請を行ってから1ヵ月かかっているものの、自分にはムリ・・・と何度も思ったので本当に嬉しい!
    WordPress.orgのスタッフはこれを手作業で行っている。初歩的なミスにも丁寧にフィードバックしてくれるのはありがたく申し訳ない気持ちだ。

    作ったのはごくシンプルなテーマだけど、この作業は勉強になったしWordPressを使って仕事をするうえでの自信にもつながる。
    BirdSITEのテーマを使った私のフォトログは、
    BirdSITE -TORIYAMAHONPOS Photo Gallery-