テーマ

の記事

  • 条件に応じてヘッダを変える

    テンプレートのget_header()では、header.phpを読み込む。
    条件に応じて別のヘッダを使いたい場合は、get_header(“2”)とパラメータを付けて呼ぶことができる。このときは、header-2.phpがよみこまれる。

    フッタやサイドバーについても、同様だ。

  • 表示条件に複数カテゴリを指定する

    一覧の条件を指定するには、ループの直前にquery_postsでカテゴリや表示数などの条件を加えることができる。カテゴリ”ニュース”を指定するには、
    [sourcecode language=’php’]
    query_posts($query_string .”&category_name=news”);
    [/sourcecode]
    というようにスラッグで指定するといいのだが、スラッグはひとつしか指定することができない。複数(たとえば”英語”の”ニュース”)を指定する場合には、
    [sourcecode language=’php’]
    query_posts($query_string .”&cat=” .get_category_by_slug(‘news’)->term_id) .”,” .&cat=” .get_category_by_slug(‘english’)->term_id));
    [/sourcecode]
    というようにterm_idで指定するしかない。この場合はカテゴリが”英語”または”ニュース”の記事が表示される。両方の条件を満たす記事を表示する場合には、category__andというパラメータを使う。
    [sourcecode language=’php’]
    query_posts(array(‘category__and’=>array(get_category_by_slug(‘news’)->term_id, get_category_by_slug(‘english’)->term_id)));
    [/sourcecode]

    これではまだ”ニュース”の子孫カテゴリが拾ってこれない。”ニュース”の子孫と”英語”の両方を満たす記事を表示する場合は、ちょっとまわりくどいが以下の記述で実現した。
    [sourcecode language=’php’]
    query_posts(array(‘category_name’=>’news’, ‘category__and’=>array(get_category_by_slug(‘english’)->term_id),’showposts’=>5));
    [/sourcecode]

    もうちょっとスマートな方法はないかな?

  • body用のテンプレートタグ body_class

    WordPress 2.8よりbody 要素用の新テンプレートタグ body_class が加わっている。テーマで以下のように書くことで、

    [sourcecode language=’php’]
    >
    [/sourcecode]

    homeの場合は、<body class=”home blog”>
    singleページの場合は、<body class=”single postid-1″>

    というように表示しているページごとにクラスが指定される。これによってページごとのスタイルを指定したり、JavaScriptでメニューの状態を変更したりすることができる。
    今までは is_single()ならclass=”single”・・・と必要に応じて自分で指定していたので、いつのまにかとても便利になっていた。defaultテンプレートを見ていて気がついた。このテーマもちゃんとバージョンアップしてるんだな。たまには見直さなければ。

    属性の一覧は、テンプレートタグ/body class – WordPress Codex 日本語版を参照。

  • テーマに必要なファイル

    WordPressでは、テーマによって構成ファイルが異なる。
    最小限で必要なファイルは以下の2つだ。
    ・style.css
    ・index.css

    これだけ用意しておけは、それなりに表示される。
    あとは必要に応じてカスタマイズしながら増やしていけばよい。

  • アーカイブページを作成するには

    アーカイブページを作成する際の小技。まずarchivesというページを作成する。そのさい内容は空白にしておく。そして、page-archives.phpというテンプレートファイルを用意する。archivesという名前のページのテンプレート、というような意味なのだろうか?月別アーカイブを表示するには、このテンプレートに以下を記述しておく。

    [sourcecode language=’php’]

    月別アーカイブ

    ‘monthly’, ‘limit’ => ”, ‘format’ => ‘html’, ‘before’ => ”, ‘after’ => ”, ‘show_post_count’ => true);
    echo ‘

      ‘;
      wp_get_archives($defaults);
      echo ‘

    ‘;?>


    [/sourcecode]

    この場合アーカイブページのURLは、
    ブログのURL/archives/
    となる。

  • Feedをカスタマイズ

    WordPressが自動で出力してくれるFeedは、全文か抜粋かを選ぶだけのシンプルなものとなっている。当ブログではこれで十分であるが、フォトログだったらやはりFeedに画像なんかを表示したいものだ。いろいろ調べているうちに、Feedの内容はテーマやプラグインでカスタマイズできることが分かった。

    以下はテーマでatomの出力内容を変更する例。

    [sourcecode language=’php’]
    remove_action(‘do_feed_atom’, ‘do_feed_atom’, 10, 1);
    automatic_feed_links(false);

    function custom_feed_atom( $for_comments ) {
    $template_file = ‘/feed-atom’ . ( $for_comments ? ‘-comments’ : ” ) . ‘.php’;
    $template_file = ( file_exists( get_template_directory() . $template_file )
    ? get_template_directory()
    : ABSPATH . WPINC
    ) . $template_file;
    load_template( $template_file );
    }
    add_action(‘do_feed_atom’, ‘custom_feed_atom’, 10, 1);

    [/sourcecode]

    まずfunctions.phpで、本来のatom出力である”do_feed_atom”をremove_actionで停止し、独自の関数をadd_actionで再定義する。
    次に、/wp-includes/feed-atom.phpを同じファイル名のままテーマフォルダにコピーする。中身を見るとFeedを出力するテンプレートとなっている。Feedの本文はthe_excerpt_rss();前後になるので、このあたりに画像を表示するなり手を加えるとよい。
    さらに、同じ処理をrdf、rss、rss2に関しても行う。

  • 検索結果をソートしたい

    検索結果をソートするには、通常query_posts()で”orderby”を指定する。
    ただし指定できる項目は、投稿テーブル(wp-posts)のフィールドに限られる。
    他の項目(カスタムフィールドや、カテゴリ順など)でソートした場合には、
    フィルターフックでSQLに手を加えるとよい。

    たとえばカテゴリのid順にソートした場合は、
    [sourcecode language=’php’]
    add_filter(‘posts_join’, ‘my_join’);
    add_filter(‘posts_orderby’, ‘my_orderby’);

    function my_join($query){

    global $wpdb;

    if(is_search()){
    $query .= ” JOIN $wpdb->term_relationships AS tr ON tr.object_id=$wpdb->posts.ID JOIN $wpdb->term_taxonomy AS tt ON tt.term_taxonomy_id=tr.term_taxonomy_id JOIN $wpdb->terms AS t ON t.term_id=tt.term_id”;
    }

    return $query;
    }

    function my_orderby($query) {

    global $wpdb;

    if(is_search()){
    $query = ” t.term_id DESC, $wpdb->posts.post_date DESC”;
    }

    return $query;
    }
    [/sourcecode]

    独自に作成したテーブルを追加することも可能だ。ただしやりすぎと負荷がかかるので、様子を見ながら対応すること。

  • 投稿画像を取得するには

    記事に投稿されている画像を取得するには、添付ファイルを取得するget_children()でimageを指定する。画像のURLのほか、タイトルやサイズなどのメタ情報も取得することもできる。

    [sourcecode language=’php’]
    $attachments = get_children(array(‘post_parent’ => $id, ‘post_type’ => ‘attachment’, ‘post_mime_type’ => ‘image’));
    if (is_array($attachments) ){
    foreach($attachments as $attachment){
    $image = wp_get_attachment_url(intval($attachment->ID));
    echo ‘' .$post->post_title .’” />’;<br />
	}<br />
}</p>
<p>[/sourcecode]</p>
</div></div>



<div class=

  • “もっと読む”の設定

    記事の本文に<!–more–>!を挿入すると、the_contentで記事の途中までが表示され、”もっと読む”がつけ加えられる。シングルページでは無効になる。

  • 詳細ページでコメント表示をカスタマイズ

    コメント表示をカスタマイズするには、コメントの配列$commentを回して表示する。
    $commentはテーマのcomments.phpからのみ参照できる変数となっている。

    [sourcecode language=’php’]
    foreach ($comments as $comment) {
    custom_comments($comment, null, null);
    }
    [/sourcecode]

    WordPress 2.7よりコールバックを指定することができる。
    [sourcecode language=’php’]
    wp_list_comments(‘type=comment&callback=custom_comments’);
    [/sourcecode]

    関数custom_comments()はfunctions.phpに作成しておく。

    [sourcecode language=’php’]
    function toriko_custom_comments($comment, $args) {

    $GLOBALS[‘comment’] = $comment;

    ?>

    • さん