TopWordPressテーマ > 2011年10月
2011年10月15日

WordPressのTwenty Elevenテーマ解説:content.php(その2)

October 15,2011 2:55 AM
Tag:[, , ]
Permalink

WordPressの勉強も兼ねて、Twenty Elevenテーマの各テンプレートについて解説してみたいと思います。確認バージョンは3.2.1です。

今回は「WordPressのTwenty Elevenテーマ解説:content.php:その1」の続きです。

content.php:その2

Twenty Elevenテーマの「content.php」で出力される内容は次の赤枠部分になります。スクリーンショットはメインページです。

メインページ

テンプレートのソースコードは次のとおりです。この回で説明するのは青色で示す部分です。

<?php
/**
 * The default template for displaying content
 *
 * @package WordPress
 * @subpackage Twenty_Eleven
 * @since Twenty Eleven 1.0
 */
?>
 
    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <header class="entry-header">
            <?php if ( is_sticky() ) : ?>
                <hgroup>
                    <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
                    <h3 class="entry-format"><?php _e( 'Featured', 'twentyeleven' ); ?></h3>
                </hgroup>
            <?php else : ?>
            <h1 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h1>
            <?php endif; ?>
 
            <?php if ( 'post' == get_post_type() ) : ?>
            <div class="entry-meta">
                <?php twentyeleven_posted_on(); ?>
            </div><!-- .entry-meta -->
            <?php endif; ?>
            <?php if ( comments_open() && ! post_password_required() ) : ?>
            <div class="comments-link">
                <?php comments_popup_link( '<span class="leave-reply">' . __( 'Reply', 'twentyeleven' ) . '</span>', _x( '1', 'comments number', 'twentyeleven' ), _x( '%', 'comments number', 'twentyeleven' ) ); ?>
            </div>
            <?php endif; ?>
        </header><!-- .entry-header -->
 
        <?php if ( is_search() ) : // Only display Excerpts for Search ?>
        <div class="entry-summary">
            <?php the_excerpt(); ?>
        </div><!-- .entry-summary -->
        <?php else : ?>
        <div class="entry-content">
            <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?>
            <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'twentyeleven' ) . '</span>', 'after' => '</div>' ) ); ?>
        </div><!-- .entry-content -->
        <?php endif; ?>
 
        <footer class="entry-meta">
            <?php $show_sep = false; ?>
            <?php if ( 'post' == get_post_type() ) : // Hide category and tag text for pages on Search ?>
            <?php
                /* translators: used between list items, there is a space after the comma */
                $categories_list = get_the_category_list( __( ', ', 'twentyeleven' ) );
                if ( $categories_list ):
            ?>
            <span class="cat-links">
                <?php printf( __( '<span class="%1$s">Posted in</span> %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list );
                $show_sep = true; ?>
            </span>
            <?php endif; // End if categories ?>
            <?php
                /* translators: used between list items, there is a space after the comma */
                $tags_list = get_the_tag_list( '', __( ', ', 'twentyeleven' ) );
                if ( $tags_list ):
                if ( $show_sep ) : ?>
            <span class="sep"> | </span>
                <?php endif; // End if $show_sep ?>
            <span class="tag-links">
                <?php printf( __( '<span class="%1$s">Tagged</span> %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list );
                $show_sep = true; ?>
            </span>
            <?php endif; // End if $tags_list ?>
            <?php endif; // End if 'post' == get_post_type() ?>
 
            <?php if ( comments_open() ) : ?>
            <?php if ( $show_sep ) : ?>
            <span class="sep"> | </span>
            <?php endif; // End if $show_sep ?>
            <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'twentyeleven' ) . '</span>', __( '<b>1</b> Reply', 'twentyeleven' ), __( '<b>%</b> Replies', 'twentyeleven' ) ); ?></span>
            <?php endif; // End if comments_open() ?>
 
            <?php edit_post_link( __( 'Edit', 'twentyeleven' ), '<span class="edit-link">', '</span>' ); ?>
        </footer><!-- #entry-meta -->
    </article><!-- #post-<?php the_ID(); ?> -->

1.本文の出力

次の部分で本文を出力します。

        <?php if ( is_search() ) : // Only display Excerpts for Search ?>
        <div class="entry-summary">
            <?php the_excerpt(); ?>
        </div><!-- .entry-summary -->
        <?php else : ?>
        <div class="entry-content">
            <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?>
            <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'twentyeleven' ) . '</span>', 'after' => '</div>' ) ); ?>
        </div><!-- .entry-content -->
        <?php endif; ?>

サンプル
サンプル

is_search()は検索結果ページであることをチェックする関数で、wp-includes/query.phpに実装されています。

function is_search() {
    global $wp_query;
 
    if ( ! isset( $wp_query ) ) {
        _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );
        return false;
    }
 
    return $wp_query->is_search();
}

検索結果ページの場合は、以下の部分を実行します。

        <div class="entry-summary">
            <?php the_excerpt(); ?>
        </div><!-- .entry-summary -->

赤色のthe_excerpt()は抜粋を出力する関数で、wp-includes/post-template.phpに実装されています。パラメータはありません。

function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

検索結果ページの場合は投稿画面の「抜粋」に記載された内容を出力します。抜粋に入力がない場合は最大110文字までを三点リーダーつきで出力します。日本語版の場合は出力文字数をWP Multibyte Patchプラグインで制御しています。

検索結果ページ以外の場合は、以下の部分を実行します。

        <div class="entry-content">
            <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?>
            <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'twentyeleven' ) . '</span>', 'after' => '</div>' ) ); ?>
        </div><!-- .entry-content -->

赤色のthe_content()は本文を出力する関数で、wp-includes/post-template.phpに実装されています。

function the_content($more_link_text = null, $stripteaser = 0) {
    $content = get_the_content($more_link_text, $stripteaser);
    $content = apply_filters('the_content', $content);
    $content = str_replace(']]>', ']]&gt;', $content);
    echo $content;
}

同じく赤色のwp_link_pages()は、分割された投稿でページリンクを表示する関数で、wp-includes/post-template.phpに実装されています。記事本文に記述した以下のHTMLコメントで記事をページ分割します。

<!--nextpage-->

分割すると次のようなリンクが表示されます。

サンプル
サンプル

2.カテゴリーの出力

以下の部分でカテゴリーを出力します。

        <footer class="entry-meta">
            <?php $show_sep = false; ?>
            <?php if ( 'post' == get_post_type() ) : // Hide category and tag text for pages on Search ?>
            <?php
                /* translators: used between list items, there is a space after the comma */
                $categories_list = get_the_category_list( __( ', ', 'twentyeleven' ) );
                if ( $categories_list ):
            ?>
            <span class="cat-links">
                <?php printf( __( '<span class="%1$s">Posted in</span> %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list );
                $show_sep = true; ?>
            </span>
            <?php endif; // End if categories ?>

サンプル
サンプル

赤色のget_the_category_list()はカテゴリー一覧を取得する関数で、wp-includes/category-template.phpに実装されています。ここではパラメータは設定されていませんが、次のパラメータが設定可能です。

  • 第1パラメータ:区切り文字
  • 第2パラメータ:親カテゴリの表示とリンク方法。「multiple」「single」を指定可能(詳細は後述)。パラメータなしの場合は親カテゴリーを表示しない
  • 第3パラメータ:記事ID。省略時は処理中の記事IDを適用

第2パラメータで「multiple」を指定すると、次のように親カテゴリ・子カテゴリのリンクが独立します。

「multiple」を指定

「single」を指定すると、次のように親カテゴリは表示されますがリンクは子カテゴリのみになります。

「single」を指定

3.タグの出力

以下の部分でタグを出力します。

            <?php
                /* translators: used between list items, there is a space after the comma */
                $tags_list = get_the_tag_list( '', __( ', ', 'twentyeleven' ) );
                if ( $tags_list ):
                if ( $show_sep ) : ?>
            <span class="sep"> | </span>
                <?php endif; // End if $show_sep ?>
            <span class="tag-links">
                <?php printf( __( '<span class="%1$s">Tagged</span> %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list );
                $show_sep = true; ?>
            </span>
            <?php endif; // End if $tags_list ?>
            <?php endif; // End if 'post' == get_post_type() ?>

サンプル
サンプル

赤色のget_the_tag_list()はタグ一覧を取得する関数で、カテゴリーと同様、wp-includes/category-template.phpに実装されています。ここではパラメータは設定されていませんが、次のパラメータが設定可能です。

  • 第1パラメータ:リストの最初に出力する文字列
  • 第2パラメータ:区切り文字
  • 第3パラメータ:リストの最後に出力する文字列

変数$show_sepは、カテゴリとタグの間のセパレータの表示・非表示を判定するためのものです。カテゴリ表示なし・タグ表示ありの場合はセパレータを表示しません。

4.コメントリンクの出力

以下の部分でコメントリンクを出力します。

            <?php if ( comments_open() ) : ?>
            <?php if ( $show_sep ) : ?>
            <span class="sep"> | </span>
            <?php endif; // End if $show_sep ?>
            <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'twentyeleven' ) . '</span>', __( '<b>1</b> Reply', 'twentyeleven' ), __( '<b>%</b> Replies', 'twentyeleven' ) ); ?></span>
            <?php endif; // End if comments_open() ?>
            <?php edit_post_link( __( 'Edit', 'twentyeleven' ), '<span class="edit-link">', '</span>' ); ?>
        </footer><!-- #entry-meta -->

comments_open()は「その1」で解説したので省略します。

赤色のcomments_popup_link()はコメント投稿フォームへのリンクを出力する関数で、wp-includes/comment-template.phpに実装されています。パラメータの意味は次のとおりです。

  • 第1パラメータ:コメントがない場合の表示
  • 第2パラメータ:コメントが1件の場合の表示
  • 第3パラメータ:コメントが2件以上の場合の表示
  • 第4パラメータ:a要素のclass属性値
  • 第5パラメータ:コメントが動作していない場合

関数名の通りポップアップも可能です。次の内容をhead要素に設定しておけば、ポップアップコメントになります。

<?php comments_popup_script(); ?> 

サンプル
サンプル

同じく赤色のedit_post_link()は、記事やページの編集画面へのリンクを出力する関数で、wp-includes/link-template.phpに実装されています。

function edit_post_link( $link = null, $before = '', $after = '', $id = 0 ) {
    if ( !$post = &get_post( $id ) )
        return;
 
    if ( !$url = get_edit_post_link( $post->ID ) )
        return;
 
    if ( null === $link )
        $link = __('Edit This');
 
    $post_type_obj = get_post_type_object( $post->post_type );
    $link = '<a class="post-edit-link" href="' . $url . '" title="' . esc_attr( $post_type_obj->labels->edit_item ) . '">' . $link . '</a>';
    echo $before . apply_filters( 'edit_post_link', $link, $post->ID ) . $after;
}

サンプル
サンプル

edit_post_link()には、次のパラメータが設定可能です。

  • 第1パラメータ:リンク名
  • 第2パラメータ:リンクの前に出力する文字列
  • 第3パラメータ:リンクの後に出力する文字列
Comments [0] | Trackbacks [0]
2011年10月14日

WordPressのTwenty Elevenテーマ解説:content.php(その1)

October 14,2011 1:55 AM
Tag:[, , ]
Permalink

WordPressの勉強も兼ねて、Twenty Elevenテーマの各テンプレートについて解説してみたいと思います。確認バージョンは3.2.1です。

content.php:その1

Twenty Elevenテーマの「content.php」で出力される内容は次の赤枠部分になります。スクリーンショットはメインページです。

メインページ

テンプレートのソースコードは次のとおりです。この回で説明するのは青色で示す部分です。

<?php
/**
 * The default template for displaying content
 *
 * @package WordPress
 * @subpackage Twenty_Eleven
 * @since Twenty Eleven 1.0
 */
?>
 
    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <header class="entry-header">
            <?php if ( is_sticky() ) : ?>
                <hgroup>
                    <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
                    <h3 class="entry-format"><?php _e( 'Featured', 'twentyeleven' ); ?></h3>
                </hgroup>
            <?php else : ?>
            <h1 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h1>
            <?php endif; ?>
 
            <?php if ( 'post' == get_post_type() ) : ?>
            <div class="entry-meta">
                <?php twentyeleven_posted_on(); ?>
            </div><!-- .entry-meta -->
            <?php endif; ?>
            <?php if ( comments_open() && ! post_password_required() ) : ?>
            <div class="comments-link">
                <?php comments_popup_link( '<span class="leave-reply">' . __( 'Reply', 'twentyeleven' ) . '</span>', _x( '1', 'comments number', 'twentyeleven' ), _x( '%', 'comments number', 'twentyeleven' ) ); ?>
            </div>
            <?php endif; ?>
        </header><!-- .entry-header -->
 
        <?php if ( is_search() ) : // Only display Excerpts for Search ?>
        <div class="entry-summary">
            <?php the_excerpt(); ?>
        </div><!-- .entry-summary -->
        <?php else : ?>
        <div class="entry-content">
            <?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?>
            <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'twentyeleven' ) . '</span>', 'after' => '</div>' ) ); ?>
        </div><!-- .entry-content -->
        <?php endif; ?>
 
        <footer class="entry-meta">
            <?php $show_sep = false; ?>
            <?php if ( 'post' == get_post_type() ) : // Hide category and tag text for pages on Search ?>
            <?php
                /* translators: used between list items, there is a space after the comma */
                $categories_list = get_the_category_list( __( ', ', 'twentyeleven' ) );
                if ( $categories_list ):
            ?>
            <span class="cat-links">
                <?php printf( __( '<span class="%1$s">Posted in</span> %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list );
                $show_sep = true; ?>
            </span>
            <?php endif; // End if categories ?>
            <?php
                /* translators: used between list items, there is a space after the comma */
                $tags_list = get_the_tag_list( '', __( ', ', 'twentyeleven' ) );
                if ( $tags_list ):
                if ( $show_sep ) : ?>
            <span class="sep"> | </span>
                <?php endif; // End if $show_sep ?>
            <span class="tag-links">
                <?php printf( __( '<span class="%1$s">Tagged</span> %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list );
                $show_sep = true; ?>
            </span>
            <?php endif; // End if $tags_list ?>
            <?php endif; // End if 'post' == get_post_type() ?>
 
            <?php if ( comments_open() ) : ?>
            <?php if ( $show_sep ) : ?>
            <span class="sep"> | </span>
            <?php endif; // End if $show_sep ?>
            <span class="comments-link"><?php comments_popup_link( '<span class="leave-reply">' . __( 'Leave a reply', 'twentyeleven' ) . '</span>', __( '<b>1</b> Reply', 'twentyeleven' ), __( '<b>%</b> Replies', 'twentyeleven' ) ); ?></span>
            <?php endif; // End if comments_open() ?>
 
            <?php edit_post_link( __( 'Edit', 'twentyeleven' ), '<span class="edit-link">', '</span>' ); ?>
        </footer><!-- #entry-meta -->
    </article><!-- #post-<?php the_ID(); ?> -->

1.article要素の出力

次の部分でarticle要素のid属性とclass属性を出力します。

<?php
…中略…
    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

the_ID()は、記事IDを出力する関数で、wp-includes/post-template.phpに実装されています。パラメータはありません。

wp-includes/post-template.php

function the_ID() {
    echo get_the_ID();
}

the_ID()の中で起動されているget_the_ID()は記事データのIDを返却する関数で、同じファイルに実装されています。

function get_the_ID() {
    global $post;
    return $post->ID;
}

post_class()は、記事の状態に応じたclass属性およびclass属性値を出力する関数で、同じファイルに実装されています。

function post_class( $class = '', $post_id = null ) {
    // Separates classes with a single space, collates classes for post DIV
    echo 'class="' . join( ' ', get_post_class( $class, $post_id ) ) . '"';
}

post_class()の中で起動されているget_post_class()は同じファイルに実装されていて(長いので掲載は割愛します)、この関数でclass属性値を設定しています。たとえばstickyであれば「sticky」というclass属性値を追加します。「hentry」は常に設定されます。

the_ID()とpost_class()で次のようなマークアップを出力します。

<article id="post-6" class="post-6 post type-post status-publish format-standard hentry category-1">

2.header要素の出力

次の部分でheader要素を出力します。

        <header class="entry-header">
            <?php if ( is_sticky() ) : ?>
                <hgroup>
                    <h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
                    <h3 class="entry-format"><?php _e( 'Featured', 'twentyeleven' ); ?></h3>
                </hgroup>
            <?php else : ?>
            <h1 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h1>
            <?php endif; ?>

フロントページに固定されているページは次のようなマークアップを出力します。「注目」が表示され、投稿年月日が非表示になります。

<hgroup>
    <h2 class="entry-title"><a href="http://user-domain/?p=1" title="モバイルサイトオープン へのパーマリンク" rel="bookmark">モバイルサイトオープン</a></h2>
    <h3 class="entry-format">注目</h3>
</hgroup>

サンプル(フロントページに固定)
サンプル(フロントページに固定)

それ以外のページでは次のようなマークアップを出力します。

<h1 class="entry-title"><a href="http://user-domain/?p=1" title="モバイルサイトオープン へのパーマリンク" rel="bookmark">モバイルサイトオープン</a></h1>

サンプル(フロントページに固定していない)
サンプル(フロントページに固定していない)

is_sticky()は、現在の投稿について「この投稿を先頭に固定表示」チェックボックスがチェックされているかどうかを判定する関数で、wp-includes/post.phpに実装されています。

wp-includes/post.php

function is_sticky( $post_id = 0 ) {
    $post_id = absint( $post_id );
 
    if ( ! $post_id )
        $post_id = get_the_ID();
 
    $stickies = get_option( 'sticky_posts' );
 
    if ( ! is_array( $stickies ) )
        return false;
 
    if ( in_array( $post_id, $stickies ) )
        return true;
 
    return false;
}

「この投稿を先頭に固定表示」は投稿画面の「公開状態」の「この投稿を先頭に固定表示」を選択していると有効になります。

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

the_permalink()は記事のパーマリンクを出力する関数で、wp-includes/link-template.phpに実装されています。パラメータはありません。

wp-includes/link-template.php

function the_permalink() {
    echo apply_filters('the_permalink', get_permalink());
}

the_title_attribute()は、記事タイトルを属性値用に出力する関数で、wp-includes/post-template.phpに実装されています。タグ(<~>)は除去され、&は実体参照されます。パラメータのechoが0またはfalseであれば値を返却し、1またはtrueであれば出力します。

wp-includes/post-template.php

function the_title_attribute( $args = '' ) {
    $title = get_the_title();
 
    if ( strlen($title) == 0 )
        return;
 
    $defaults = array('before' => '', 'after' =>  '', 'echo' => true);
    $r = wp_parse_args($args, $defaults);
    extract( $r, EXTR_SKIP );
 
    $title = $before . $title . $after;
    $title = esc_attr(strip_tags($title));
 
    if ( $echo )
        echo $title;
    else
        return $title;
}

esc_attr__()は、ローカライズに加えて値に含まれる「<>&"'」を実体参照して出力する関数で、wp-includes/l10n.phpに実装されています。

wp-includes/l10n.php

function esc_attr__( $text, $domain = 'default' ) {
    return esc_attr( translate( $text, $domain ) );
}

まとめると、

<?php printf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ); ?>

は、the_title_attribute()で記事タイトルを返却したものが%sに設定され、さらにesc_attr__()でローカライズと実体参照を行います。

3.投稿年月日の出力

次の部分で投稿タイプが「記事」の場合のみ、記事の投稿年月日を出力します。

            <?php if ( 'post' == get_post_type() ) : ?>
            <div class="entry-meta">
                <?php twentyeleven_posted_on(); ?>
            </div><!-- .entry-meta -->
            <?php endif; ?>

投稿年月日のサンプル
投稿年月日のサンプル

get_post_type()は投稿タイプを取得する関数で、wp-includes/link-template.phpに実装されています。

wp-includes/link-template.php

function get_post_type_archive_link( $post_type ) {
    global $wp_rewrite;
    if ( ! $post_type_obj = get_post_type_object( $post_type ) )
        return false;
 
    if ( ! $post_type_obj->has_archive )
        return false;
 
    if ( get_option( 'permalink_structure' ) && is_array( $post_type_obj->rewrite ) ) {
        $struct = ( true === $post_type_obj->has_archive ) ? $post_type_obj->rewrite['slug'] : $post_type_obj->has_archive;
        if ( $post_type_obj->rewrite['with_front'] )
            $struct = $wp_rewrite->front . $struct;
        else
            $struct = $wp_rewrite->root . $struct;
        $link = home_url( user_trailingslashit( $struct, 'post_type_archive' ) );
    } else {
        $link = home_url( '?post_type=' . $post_type );
    }
 
    return apply_filters( 'post_type_archive_link', $link, $post_type );
}

この関数は次の値を返却します。

  • post:記事
  • page:固定ページ
  • attachment:添付ファイル
  • revision:投稿リビジョン

twentyeleven_posted_on()は、テーマのfunctions.phpに実装されている関数です。

functions.php

function twentyeleven_posted_on() {
    printf( __( '<span class="sep">Posted on </span><a href="%1$s" title="%2$s" rel="bookmark"><time class="entry-date" datetime="%3$s" pubdate>%4$s</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="%5$s" title="%6$s" rel="author">%7$s</a></span></span>', 'twentyeleven' ),
        esc_url( get_permalink() ),
        esc_attr( get_the_time() ),
        esc_attr( get_the_date( 'c' ) ),
        esc_html( get_the_date() ),
        esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),
        sprintf( esc_attr__( 'View all posts by %s', 'twentyeleven' ), get_the_author() ),
        esc_html( get_the_author() )
    );
}

この関数では次のようなマークアップを出力します。

<div class="entry-meta">
  <span class="sep">投稿日:</span>
  <a href="https://user-domain/?p=1" title="1:17 AM" rel="bookmark">
    <time class="entry-date" datetime="2011-10-14T01:17:30+00:00" pubdate>2011年10月14日</time>
  </a>
  <span class="by-author">
    <span class="sep">作成者:</span>
    <span class="author vcard">
      <a class="url fn n" href="https://user-domain/?author=1" title="admin の投稿をすべて表示" rel="author">admin</a>
    </span>
  </span>
</div>

4.コメントリンクの出力

次の部分でコメントリンクを出力します。

            <?php if ( comments_open() && ! post_password_required() ) : ?>
            <div class="comments-link">
                <?php comments_popup_link( '<span class="leave-reply">' . __( 'Reply', 'twentyeleven' ) . '</span>', _x( '1', 'comments number', 'twentyeleven' ), _x( '%', 'comments number', 'twentyeleven' ) ); ?>
            </div>
            <?php endif; ?>

コメントリンクはふきだしの形で、その中にコメント数を表示します。

コメントリンクのサンプル
コメントリンクのサンプル

comments_open()はコメント投稿が許可されていることをチェックする関数で、wp-includes/comment-template.phpに実装されています。

wp-includes/comment-template.php

function comments_open( $post_id=NULL ) {
 
    $_post = get_post($post_id);
 
    $open = ( 'open' == $_post->comment_status );
    return apply_filters( 'comments_open', $open, $post_id );
}

投稿画面の「ディスカッション」の「コメントの投稿を許可する。」がチェックされていればcomments_open()でtrueを返却します。

コメントの投稿を許可する。

post_password_required()はパスワード保護されていることをチェックする関数で、wp-includes/post-template.phpに実装されています。

wp-includes/post-template.php

function post_password_required( $post = null ) {
    $post = get_post($post);
 
    if ( empty($post->post_password) )
        return false;
 
    if ( !isset($_COOKIE['wp-postpass_' . COOKIEHASH]) )
        return true;
 
    if ( $_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password )
        return true;
 
        return false;
}

パスワード保護は記事編集画面の「公開状態」の「パスワード保護」を選択してパスワードを設定すると有効になります。

パスワード保護

_x()はコンテキストに応じた翻訳テキストを取得する関数で、wp-includes/l10n.phpに実装されています。

wp-includes/l10n.php

function _x( $text, $context, $domain = 'default' ) {
	return translate_with_gettext_context( $text, $context, $domain );
}

ちなみにパスワード保護を行うと、記事本文が次のような表示に切り替わります。

記事本文(パスワード保護)

Comments [0] | Trackbacks [0]
2011年10月 4日

WordPressのTwenty Elevenテーマ解説:単一記事の投稿 (single.php)

October 4,2011 1:55 AM
Tag:[, ]
Permalink

WordPressの勉強も兼ねて、Twenty Elevenテーマの各テンプレートについて解説しています。確認バージョンは3.2.1です。

単一記事の投稿 (single.php)

Twenty Elevenテーマの「単一記事の投稿 (single.php)」で出力されるページは次のように、記事のコンテンツとコメントなどが表示されます。

単一記事の投稿 (single.php)

テンプレートのソースコードは次のとおりです。

<?php
/**
 * The Template for displaying all single posts.
 *
 * @package WordPress
 * @subpackage Twenty_Eleven
 * @since Twenty Eleven 1.0
 */
 
get_header(); ?>
 
        <div id="primary">
            <div id="content" role="main">
 
                <?php while ( have_posts() ) : the_post(); ?>
 
                    <nav id="nav-single">
                        <h3 class="assistive-text"><?php _e( 'Post navigation', 'twentyeleven' ); ?></h3>
                        <span class="nav-previous"><?php previous_post_link( '%link', __( '<span class="meta-nav">&larr;</span> Previous', 'twentyeleven' ) ); ?></span>
                        <span class="nav-next"><?php next_post_link( '%link', __( 'Next <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?></span>
                    </nav><!-- #nav-single -->
 
                    <?php get_template_part( 'content', 'single' ); ?>
 
                    <?php comments_template( '', true ); ?>
 
                <?php endwhile; // end of the loop. ?>
 
            </div><!-- #content -->
        </div><!-- #primary -->
 
<?php get_footer(); ?>

以下、順を追ってテンプレートの内容について解説します。「WordPressのTwenty Elevenテーマ解説:メインインデックスのテンプレート (index.php)」と一部重複している部分がありますが、この記事だけで一気に読みきれるよう、他の記事への参照は行ってません。

1.ヘッダー情報の出力

ヘッダー情報はget_header()で出力します。

<?php
…中略…
get_header(); ?>

ヘッダー情報は赤枠部分が対応します。

ヘッダー情報

get_header()はwp-includes/general-template.phpに実装されています。

wp-includes/general-template.php

function get_header( $name = null ) {
    do_action( 'get_header', $name );
 
    $templates = array();
    if ( isset($name) )
        $templates[] = "header-{$name}.php";
 
    $templates[] = 'header.php';
 
    // Backward compat code will be removed in a future release
    if ('' == locate_template($templates, true))
        load_template( ABSPATH . WPINC . '/theme-compat/header.php');
}

do_action()はフックポイント「get_header」の作成を行っています。

    do_action( 'get_header', $name );

プラグインを作成している方はすでにご存知と思いますが、add_action()を使えばフックポイントに任意のアクションを追加できます。

例えばプラグインで次のコードを記述すれば、フックポイント「get_header」、つまりdo_action('get_header')の実行時にfoo()が起動され、doctype宣言の前に「foo」が出力されます。

<?php
/*
Plugin Name: Foo
Description: Foo
Version: 1.0
*/ 
function foo() {
  echo "foo";
}
add_action('get_header', 'foo');
?>

話を戻して、get_header()では、パラメータに設定した文字列をテンプレート名として利用します。「get_header('foo')」と書いておけば、「header-foo.php」を「header.php」の代わりにロードします。パラメータの設定がなければ「header.php」をロードします。

    $templates = array();
    if ( isset($name) )
        $templates[] = "header-{$name}.php";
 
    $templates[] = 'header.php';

2.記事データの取得

赤色で示したwhile文のhave_posts()とthe_post()で、記事データを取得します。

                <?php while ( have_posts() ) : the_post(); ?>
 
                    <nav id="nav-single">
                        <h3 class="assistive-text"><?php _e( 'Post navigation', 'twentyeleven' ); ?></h3>
                        <span class="nav-previous"><?php previous_post_link( '%link', __( '<span class="meta-nav">&larr;</span> Previous', 'twentyeleven' ) ); ?></span>
                        <span class="nav-next"><?php next_post_link( '%link', __( 'Next <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?></span>
                    </nav><!-- #nav-single -->
 
                    <?php get_template_part( 'content', 'single' ); ?>
 
                    <?php comments_template( '', true ); ?>
 
                <?php endwhile; // end of the loop. ?>

have_posts()は投稿記事をチェックする関数で、wp-includes/query.phpに実装されています。

wp-includes/query.php

function have_posts() {
    global $wp_query;
 
    return $wp_query->have_posts();
}

投稿記事が存在する場合はtrue、存在しない場合はfalseを返却します。パラメータはありません。ここではhave_posts()をwhile文で使っていますが、メインインデックスなどif文で使用している箇所もあります。

付け加えると、単一記事や固定記事ではwhile文を利用しなくても記事データを取得できます。よって次のような構造でも良いと思いますが、認識誤りがありましたらご指摘ください。

<?php if ( have_posts() ) : the_post(); ?>
…中略…
<?php endif; ?>

the_post()は投稿データをロードする関数で、wp-includes/query.phpに実装されています。the_post()を実行しただけでは何も出力しません。

wp-includes/query.php

function the_post() {
    global $wp_query;
 
    $wp_query->the_post();
}

3.前後記事のリンクの出力

赤色部分で前後記事のリンクを出力します。

                <?php while ( have_posts() ) : the_post(); ?>
 
                    <nav id="nav-single">
                        <h3 class="assistive-text"><?php _e( 'Post navigation', 'twentyeleven' ); ?></h3>
                        <span class="nav-previous"><?php previous_post_link( '%link', __( '<span class="meta-nav">&larr;</span> Previous', 'twentyeleven' ) ); ?></span>
                        <span class="nav-next"><?php next_post_link( '%link', __( 'Next <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?></span>
                    </nav><!-- #nav-single -->
 
                    <?php get_template_part( 'content', 'single' ); ?>
 
                    <?php comments_template( '', true ); ?>
 
                <?php endwhile; // end of the loop. ?>

前後記事のリンクは次の赤枠部分が該当します。

前後記事のリンク

以下は(X)HTMLマークアップの出力例です。

<span class="nav-previous"><a href="http://user-domain/?p=1" rel="prev"><span class="meta-nav">&larr;</span> 前へ</a></span>
<span class="nav-next"><a href="http://user-domain/?p=6" rel="next">次へ <span class="meta-nav">&rarr;</span></a></span>

previous_post_link()は前の記事のリンクを出力する関数、next_post_link()は次の記事のリンクを出力する関数で、いずれもwp-includes/link-template.phpに実装されています。

wp-includes/query.php

function previous_post_link($format='&laquo; %link', $link='%title', $in_same_cat = false, $excluded_categories = '') {
    adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, true);
}
function next_post_link($format='%link &raquo;', $link='%title', $in_same_cat = false, $excluded_categories = '') {
    adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, false);
}

パラメータの意味は次のとおりです。

  • 第1パラメータ:リンクの文字列の書式。文字列に「%link」を設定すれば、その部分がa要素に置き換わります
  • 第2パラメータ:リンクのテキストを指定。デフォルトは前(または次)の記事タイトル(%title)
  • 第3パラメータ:同一カテゴリの前後記事だけの表示要否(ここではfalse)
  • 第4パラメータ:除外したいカテゴリID(ここでは空)

処理の中で起動されているadjacent_post_link()で実際の処理を行っています。前記事・後記事の区別は第5パラメータで行っています。

function adjacent_post_link($format, $link, $in_same_cat = false, $excluded_categories = '', $previous = true) {
    if ( $previous && is_attachment() )
        $post = & get_post($GLOBALS['post']->post_parent);
    else
        $post = get_adjacent_post($in_same_cat, $excluded_categories, $previous);
 
    if ( !$post )
        return;
 
    $title = $post->post_title;
 
    if ( empty($post->post_title) )
        $title = $previous ? __('Previous Post') : __('Next Post');
 
    $title = apply_filters('the_title', $title, $post->ID);
    $date = mysql2date(get_option('date_format'), $post->post_date);
    $rel = $previous ? 'prev' : 'next';
 
    $string = '<a href="'.get_permalink($post).'" rel="'.$rel.'">';
    $link = str_replace('%title', $title, $link);
    $link = str_replace('%date', $date, $link);
    $link = $string . $link . '</a>';
 
    $format = str_replace('%link', $link, $format);
 
    $adjacent = $previous ? 'previous' : 'next';
    echo apply_filters( "{$adjacent}_post_link", $format, $link );
}

5.コンテンツの出力

赤色のget_template_part()でコンテンツを出力します。

                <?php while ( have_posts() ) : the_post(); ?>
 
                    <nav id="nav-single">
                        <h3 class="assistive-text"><?php _e( 'Post navigation', 'twentyeleven' ); ?></h3>
                        <span class="nav-previous"><?php previous_post_link( '%link', __( '<span class="meta-nav">&larr;</span> Previous', 'twentyeleven' ) ); ?></span>
                        <span class="nav-next"><?php next_post_link( '%link', __( 'Next <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?></span>
                    </nav><!-- #nav-single -->
 
                    <?php get_template_part( 'content', 'single' ); ?>
 
                    <?php comments_template( '', true ); ?>
 
                <?php endwhile; // end of the loop. ?>

コンテンツは次の赤枠部分が該当します。

コンテンツ

get_template_part()はwp-includes/general-template.phpに実装されています。

wp-includes/general-template.php

function get_template_part( $slug, $name = null ) {
    do_action( "get_template_part_{$slug}", $slug, $name );
 
    $templates = array();
    if ( isset($name) )
        $templates[] = "{$slug}-{$name}.php";
 
    $templates[] = "{$slug}.php";
 
    locate_template($templates, true, false);
}

do_action()でフックポイント「get_template_part_スラッグ名」の作成を行っています。この場合はスラッグ名は「content」なので、フックポイント名は「get_template_part_content」になります。

また、get_header()と同様、第1パラメータと第2パラメータに設定された名前を使ってテンプレートを呼び出します。第2パラメータが設定されていれば、「スラッグ名-名前.php」でテンプレートを呼び出します。第2パラメータが設定されていなければ、「スラッグ名.php」でテンプレートを呼び出します。

単一記事の投稿(single.php)テンプレートのget_template_part()の第1パラメータは「content」、第2パラメータは「single」なので、「content-single.php」が呼び出されることになります。

6.コメントの出力

赤色のcomments_template()でコメントを出力します。

                <?php while ( have_posts() ) : the_post(); ?>
 
                    <nav id="nav-single">
                        <h3 class="assistive-text"><?php _e( 'Post navigation', 'twentyeleven' ); ?></h3>
                        <span class="nav-previous"><?php previous_post_link( '%link', __( '<span class="meta-nav">&larr;</span> Previous', 'twentyeleven' ) ); ?></span>
                        <span class="nav-next"><?php next_post_link( '%link', __( 'Next <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?></span>
                    </nav><!-- #nav-single -->
 
                    <?php get_template_part( 'content', 'single' ); ?>
 
                    <?php comments_template( '', true ); ?>
 
                <?php endwhile; // end of the loop. ?>

コメントは次の赤枠部分が該当します。

<br />
コメント

comments_template()はコメントテンプレートを取得する関数で、wp-includes/comment-template.phpに実装されています(長いので掲載は割愛)。

パラメータの意味は次のとおりです。

  • 第1パラメータ:コメントテンプレート名を指定。値が空の場合は「comments.php」を取得
  • 第2パラメータ:コメント分割の要否。ここでは「true」が設定されているのでコメントを分割表示

なお、コメントの表示制御は管理画面の「設定」→「ディスカッション」で行います。

ディスカッション

コメント表示の詳細については「コメント (comments.php)」テンプレートの解説で行います。

7.フッター情報の出力

フッター情報は赤枠部分が対応します。

フッター情報

フッター情報はget_footer()で出力します。

<?php get_footer(); ?>

get_footer()は、wp-includes/general-template.phpに実装されています。

wp-includes/general-template.php

function get_footer( $name = null ) {
    do_action( 'get_footer', $name );
 
    $templates = array();
    if ( isset($name) )
        $templates[] = "footer-{$name}.php";
 
    $templates[] = 'footer.php';
 
    // Backward compat code will be removed in a future release
    if ('' == locate_template($templates, true))
        load_template( ABSPATH . WPINC . '/theme-compat/footer.php');
}
Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3