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