テーマ

の記事

  • ブラウザにフィードアイコンを表示するには

    feedブラウザ(FireFoxであればアドレスバーの右端)にフィードアイコンを表示するにはHTMLの<head>内に<link rel=”alternate”…>でフィードのURLを指定する。
    WordPressの場合もちろん同様でもよいが、function.phpでautomatic_feed_links();を呼ぶと、自動的に<head>内に<link rel=”alternate”…>が挿入される。

    WordPress3.0のデフォルトデーマを見ると、この部分は”after_setup_theme”という新しいフックを利用している。

    [sourcecode language=’php’]
    function my_theme_setup() {
    add_theme_support( ‘automatic-feed-links’ );
    }
    add_action( ‘after_setup_theme’, ‘my_theme_setup’ );
    [/sourcecode]

  • テーマでウィジェット対応

    widgetいつかはWordPress.org にテーマを登録してみたい。それにはウィジェット対応が必須なため、ちょっとやってみた。
    テーマでウィジェットに対応するには、widgets_init フックを利用してウィジェットを表示するエリアを登録する。functions.phpでウィジェット領域のidや、ウィジェットの前後のタグを指定する。こうしておくことで管理画面の[外観]-[ウィジェット]の設定でウィジェットを選択することができるようになる。

    [sourcecode language=’php’]
    function my_widgets_init() {

      if ( function_exists(‘register_sidebar’) ){
        register_sidebar( array (
          ’name’ => ‘widget-area’,
          ’id’ => ‘widget-area’,
          ’description’ => ‘Widget Area for sidebar’,
          ’before_widget’ => ‘

    ‘,
          ’after_widget’ => ‘

    ‘,
          ’before_title’ => ‘

    ‘,
          ’after_title’ => ‘

    ‘,
       ) );
     }
    }

    add_action( ‘widgets_init’, ‘my_widgets_init’ );

    [/sourcecode]

    ウィジェットの表示はsidebar.phpで行う。以下の例では、上記で登録した’widget-area’を表示する。ウィジェットがひとつも登録されていない場合には、代替としてカテゴリーの一覧を表示する。

    [sourcecode language=’php’]

    if(!dynamic_sidebar(‘widget-area’)): ?>
      

    [/sourcecode]

    ウィジェットはアーカイブ、タグクラウド、カレンダーなどデフォルトで用意されているほかにプラグインでも提供されている。WordPress 2.8以降ではウィジェットを簡単に作成できるクラスも提供されている。

  • single.phpが2回呼ばれる

    投稿が表示された回数を、single.phpのタイミングでカウントしようとした。MySQLにテーブルを作成して、postIDと参照回数を記録していく。ところがpostID=1の記事を表示した際に、postID=1とpostID=4の2行更新される。1の次は4が登録されていることに関係があるのか。なぜかsingle.phpが2回呼ばれているようにみえる。
    defaltテーマでも再現するため、プラグインを疑ってみた。「Top Level Categories Fix」を無効にすると、single.phpは1回しか呼ばれなくなった。これは、パーマリンクの設定がカスタム構造(/%category%/%postname%/)になっているときに、URLから”category”を削除するプラグインだ。そもそもカテゴリ名を含んだパーマリンクは非推奨ではあるが。CMSとして利用する場合にURLにIDや日付が入っていてはかっこ悪いため、「Top Level Categories Fix」を有効にすることが多い。
    うまく回数を数える方法はないものか。

  • 記事の整形を行うには

    記事を表示するには、ループ内でthe_content()を使うのが通常のやり方だ。ループ外でもget_post()やget_page()で、特定の記事の内容を取得することはできる。その場合の表示のしかたを調べてみた。

    [sourcecode language=’php’]
    $page = get_page_by_title(“ページのタイトル”);
    echo apply_filters(‘the_content’, $page->post_content);

    [/sourcecode]

    記事の内容を表示しようと思って、
    echo $page->post_content;
    とやっただけでは、改行もなしでプレーンなテキストしか表示されない。the_content()のようにHTMLで整形された表示を行いたいのであれば、apply_filters()を通すとよい。こうすることで記事中のショートコードも実行される。

  • WordPressでweb API

    WordPress に web API インターフェースを追加するプラグインを使ってみた。

    WordPressのカテゴリ一覧ページでは、デフォルトで10件づつ表示してページネーションを使う方法が一般的だ。このほどクライアントより、一覧の下に「もっと見る」のようなリンクを用意して、クリックされると同一ページの下にバックナンバーのタイトル一覧を表示して欲しいとの要望があった。
    1ページに表示する件数をquery_posts()で増やして、JavaScriptでバックナンバーの部分を表示・非表示すればよいかとも思ったものの、初期表示に時間がかかってしまうし、「もっと見る」がクリックされない場合は無駄だ。Ajaxでタイトルを10件づつ取得して、順に表示できればよいな、と思い投稿データをWeb API的に取得できないものかと調べた。そこで見つけたのが「Wordpress に web API インターフェースを追加するプラグイン」である。

    プラグインを追加するとAPI キーを設定することができる。このAPIキーと、アクション(関数)に割り当てたキーとの組み合わせによって、認証を行うようになっている。認証がOKだとアクション名のショートコードが生成、実行されるようだ。アクションはサンプルがいくつか用意されているので、参考にしながら自分で追加することができる。jsonやXMLでのレスポンスが可能だ。
    このインタフェースを利用して作成したWeb APIをJavaScriptから呼ぶには、ブログのURL、アクション、APIキー+アクションのキーをAjaxでPOSTする。アクションに関するパラメータを追加することもできる。
    思ってたとおりのものができた!

    参考:WordPress に web API インターフェースを追加するプラグイン

  • ショートコードに勝手に入ってくるpタグ

    ショートコードが勝手にpタグに囲まれてしまう場合がある。
    例えば投稿記事で、
    <h3>タイトル</h3>[my_shortcode /]
    というふうにhタグの直後にショートコードを使った場合に発生する。hタグの次はpタグがこなくてはならないマークアップの法則にでも準拠してくれた結果なのだろう。出力されるHTMLは、
    <h3>タイトル</h3><p>(ショートコードの出力)
    となる。<p>だけを勝手に入れて</p>で閉じてくれないのが非常に困る。
    このような場合は、
    <h3>タイトル</h3><p>[my_shortcode /]</p>
    と、最初から投稿記事にpタグを書いてしまうと解決する。出力されるHTMLは、
    <h3>タイトル</h3>(ショートコードの出力)
    となる。自分で書いたpタグまでもが消えているから不思議なのだが、解決したからいいか。

  • タイムゾーンがずれる

    自作テーマで、時間に関連する部分に不具合がでた。WordPressを商用のCMSとして使っていて、イベントを表示するカレンダーで予約投稿の場合は「予定」と表示しておき、当日になったら「予定」が消えるというふうにしたかったのが、「予定」が消えるのが9時間遅くなるのだ。タイムゾーンの設定が変わってしまったのかと思ったけど、「UTC +9:00」になっているし投稿時間も正常だ。

    テーマで現在時刻を取得するのに
    date( ‘Y-m-d H:i:s’);
    とやっていたのを、WorsPressの関数を使って、
    current_time(mysql)
    としたら直った。

    WordPressの過去のバージョンで使ったことのあるコードを、バージョン2.9.2で流用したのが原因らしい。PHPの基本的な関数が使えなくなっていたとは、不便だ。もとからcurrent_time()を使うことが常識だったのかな?
    もっともこの場合は、「当日」の判断をpost_dateではなくて、post_statusで判断すれば良かったのだ。

  • カテゴリー用のテンプレートファイル

    WordPress 2.9よりカテゴリー用のテンプレートファイル category-slug.phpが用意されているようだ。いままでカテゴリごとに異なるデザインを表示するには、archive.phpで現在のカテゴリを取得して、if文で振り分けていた。category-termid.phpというテンプレートファイルもあったものの、サーバが異なるとtermidが同じとは限らないため利用しずらかった。slugであれば使ってみてもいいかな。

    カテゴリー用のテンプレートファイルは以下の優先順で表示される。
    1. category-slug.php
    2. category-termid.php
    3. category.php
    4. archive.php
    5. index.php

    カテゴリーごとにHTML構造が変わらずCSSのみ変更したい場合は、テンプレートを分けずに、archive.phpの中で<div class=”スラッグ”>とし、スラッグごとにスタイルを当てる方法もある。

  • 投稿内容を取得するget_post()

    get_post()は投稿内容を取得する関数だ。投稿番号を指定することでsb_3_postsの内容が配列で返る。特定の記事を表示したい場合などに利用することができる。
    パラメータには、数字ではなく参照値を指定しなくてはならない。
    つまりget_post(投稿番号)ではなくて、

    [sourcecode language=’php’]
    $id=投稿番号;
    get_post($id)
    [/sourcecode]
    とする。
    はまった!

  • is_front_page()が使えなくなった

    トップページかどうかの判断をis_front_page()で行っていた。これがあるときから、常にfalseになった。トップページかどうかでcssを切り替えているため、急にデザインが崩れて困った。is_home()で回避できるものの、腑に落ちないのでちょっと調べた。

    直前に行っていた操作を思い出すうちに、管理画面で1ページに表示する最大投稿数を変更したことが原因らしかった。ためしに他のブログでもこの操作をしたら再現したのだ。しかし最大投稿数もとに戻したところで、is_front_page()はもとにはもどらなかった。

    しかたがないので、Wordpressのコアソースでis_front_page()を追った。is_front_page()とは、’posts’ == get_option(‘show_on_front’) && is_home()というような意味らしい。この’show_on_front’というオプションがおかしくなっているようだ。MySql上ではではテーブルwp_optionsに設定されている。この値が空になっていたので手動で’posts’に書き直した。
    is_front_page()は正常に戻ったように思う。

    ググっても見当たらないけど、これはバグなのかな?