Underscoresでカスタムテーマを作る:細かすぎて伝わらないあれこれ編

Underscores で魔改造したメモその6。
細かすぎて伝わらないあれこれ。

  • Compass導入編
  • ナビゲーションメニュー改造編
  • Bootstrap(Sass)導入編
  • ウィジェット作成編
  • ソーシャルボタン対応編
  • 細かすぎて伝わらないあれこれ編

投稿サムネイルの利用

the_post_thumbnail関数を利用する。

<?php if ( has_post_thumbnail() )://投稿サムネイルを表示 ?>
    <?php the_post_thumbnail( 'full' ); ?>
<?php else: //投稿サムネイルがない場合 ?>
<?php endif; //投稿サムネイル表示終わり ?>

固定ページで、子ページの投稿サムネイルを利用する場合はget_page系関数でpostオブジェクトを取得して、記事IDをget_the_post_thumbnail関数の引数に指定する。

$child_page_data = get_page_by_path( 'parent/child-1' );
<?php if ( has_post_thumbnail($child_page_data->ID) )://投稿サムネイルを表示 ?>
    <?php echo get_the_post_thumbnail($child_page_data-ID, 'full' ); ?>
<?php else: //投稿サムネイルがない場合 ?>
<?php endif; //投稿サムネイル表示終わり ?>

ページスラッグの取得とクラスへの追加

スラッグの取得はget_post_fieldで出来る。

$post_slug = get_post_field('post_name', get_the_id());

この関数はpostsフィールドの値を直接取得出来る便利なやつで、値が入ってないときは空文字列、フィールドが無い場合はErrorオブジェクトが帰ってくる。

これをbody_class()だとかpost_class()の引数に設定すれば、ページスラッグをクラス名として利用出来る。

    <?php
        if( is_singular() ) {
            $post_slug = get_post_field('post_name', get_the_id());
        } else {
            $post_slug = '';
        }
    ?>
<body <?php body_class($post_slug);?>>
<article <?php post_class($post_slug); ?>>

slugが設定されていない場合はタイトルが自動設定になるので注意。

strictモードへの対応

デバッグモードをONにしたらStrict Standardsの警告が出まくったので全部潰す。

Only variables should be passed by reference〜

配列を変数に格納せず、直接引数に入れている。
これが一番怒られ箇所が多かった。

//正
$array = array();
hoge_function($array)

//誤
hoge_function(array())

Declaration of〜should be compatible with〜

子クラスで上書きしているメソッド引数が親クラスと異なる。
子クラスで親クラスのメソッドを上書きするときには、親クラスのメソッドが指定している引数をすべて指定する。
デフォルト値を指定している場合は、その指定も同じにしなければならない。

このエラーはWalker_Nav_Menuを継承した子クラスで発生。
Wikiのサンプルソースがそもそも間違っていたわけです…

//正
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0)
//誤
function start_el( &$output, $item, $depth, $args, $id)

titleとdescriptionの出し分け

titleに親カテゴリー名だとか親ページ名を表示させたいとなると、
wp_titleではどうにもならないので関数を自作する。
ついでにdescriptionも対応させておく。

/**
 * 親カテゴリのオブジェクトを返す
 * @return Object
 */
function my_get_the_parent_category() {
    $categories = get_the_category();
    
    foreach ($categories as $category) {
     if ( $category->parent === 0 ) {
        return $category;
     }
    }
}

/**
 * ページタイトルを返す(wp_titleの代用)
 * @return string
 */
function my_get_page_title() {
    global $post;
    $blogtitle = trim(str_replace(get_bloginfo('title'), '', wp_title( '', false )));

    if ((is_front_page() && is_home()) || is_front_page()) {

    } elseif(is_archive()) {
        $term = get_queried_object();
        if (is_object($term) && $term->category_parent !== 0) {
            $blogtitle .= ' | ' . get_cat_name($term->category_parent);
        }

    } elseif(is_tag()) {
        $blogtitle = 'タグ『' . single_cat_title('', false) . '』が登録されている記事 | ' . get_bloginfo('title');

    } elseif(is_search()) {
        $blogtitle = '『' . single_cat_title('', false) . ' 』の検索結果 | ' . get_bloginfo('title');

    } elseif(is_page()) {
        if ($post->post_parent > 0) {
            $parent =  get_post_field('post_title', $post->post_parent);
            $blogtitle .= ' | ' . $parent;
        }

    } elseif (is_single()) {
        $category = my_get_the_parent_category();

        $blogtitle .=   ' | ' . $category->name;

    }

    if ((is_front_page() && is_home()) || is_front_page()) {

        return get_bloginfo('title');

    }

    return $blogtitle . ' | ' . get_bloginfo('title');
}

使うときはこう。

<title><?php echo(gf_get_page_title()); ?></title>

descriptionはソーシャルボタン対応編とほぼ同じ:

<?php if (is_archive()): ?>
    <meta name="description" content="<?php echo wp_trim_words(category_description(), 200); ?>">
<?php elseif ((is_front_page() && is_home()) || is_front_page()) :?>
    <meta name="description" content="<?php bloginfo( 'description' ); ?>">
<?php elseif (is_single()): ?>
    <meta name="description" content="<?php echo wp_trim_words(get_the_excerpt(), 200); ?>">
<?php elseif (is_page()): ?>
    <meta name="description" content="<?php echo wp_trim_words(get_the_excerpt(), 200); ?>">
<?php elseif (is_404()) :?>
    <meta name="description" content="<?php bloginfo( 'description' ); ?>">
<?php elseif (is_search()) :?>
    <meta name="description" content="サイト内で『<?php the_title(); ?>』を検索した結果のページです">
    <title>『<?php the_title(); ?>』の検索結果</title>
<?php else : ?>
    <meta name="description" content="<?php bloginfo( 'description' ); ?>">
<?php endif ?>

固定ページは抜粋の設定がないんで、カスタムフィールドで入力できるようにしといて、本文を取るか判別してもいいと思う。

/**
 * 固定ページの抜粋を返す
 * @param bool $echo 出力するならtrue
 * @param int $string 文字数
 * @return mixed
 */
function my_excerpt($echo = true, $string = 100) {
    global $post;
    $content = get_post_meta(get_the_ID(), 'page-description', true);

    if (empty($content)) {
        $content = $post->post_content;
    }

    $trimmed_content = wp_trim_words( $content, $string );

    if ($echo === true) {
        echo(apply_filters('the_excerpt', $trimmed_content));
    } else {
        return apply_filters('get_the_excerpt', $trimmed_content);
    }
}

    <?php
        $page_description = my_excerpt(false);
    ?>
    <meta name="description" content="<?php echo $page_description; ?>">

時限表示

他のエントリーでも書いた気がするけど(゚ε゚)キニシナイ!!

現在と期限日の日時を比較して期限を越えていたら何かする

<?php
$timezone = new DateTimeZone('Asia/Tokyo');
$today_date = date_create('now', $timezone);
$limit_date = date_create('2014-10-14T10:00:00+09:00', $timezone);
$limit_check_result = ($today_date > $limit_date) ? 'after' : 'before';
?>

<p>Today:<?php echo($today_date->format('Y/m/d H:i:s'))?></p>
<p>Result:<?php echo($limit_check_result);?></p>

<?php if($limit_check_result): ?>
<p>期限日をすぎています!!!!</p>
<?php endif; ?>

管理画面で日時設定できるようにしてもいいですね

Leave a Comment.