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; ?>
管理画面で日時設定できるようにしてもいいですね