月別日別ページのタイトルの文字化け
-
<?php single_month_title(); ?>
で、月別日別ページのタイトルを表示させたいのですが、12月2009 というなるので、2009年12月と表示させたいので下記のように書きました。2010年は正常に表示されるのですが、2009年は「?2009年」というふうに「?」の場所になぜか文字化けした文字が入ってしまいます。
どうすれば取れますでしょうか?
<?php $date = single_month_title('',FALSE); echo mbereg_replace('^...','',$date).'年'.mbereg_replace('....$','',$date);?>
-
WordPressの「default」のテーマにちょうど、年、月、日別のタイトルの出し方があったので、その部分(以下)を
<?php if (have_posts()) : ?> <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?> <?php /* If this is a category archive */ if (is_category()) { ?> <h2 class="pagetitle"><?php printf(__('Archive for the ‘%s’ Category', 'kubrick'), single_cat_title('', false)); ?></h2> <?php /* If this is a tag archive */ } elseif( is_tag() ) { ?> <h2 class="pagetitle"><?php printf(__('Posts Tagged ‘%s’', 'kubrick'), single_tag_title('', false) ); ?></h2> <?php /* If this is a daily archive */ } elseif (is_day()) { ?> <h2 class="pagetitle"><?php printf(_c('Archive for %s|Daily archive page', 'kubrick'), get_the_time(__('F jS, Y', 'kubrick'))); ?></h2> <?php /* If this is a monthly archive */ } elseif (is_month()) { ?> <h2 class="pagetitle"><?php printf(_c('Archive for %s|Monthly archive page', 'kubrick'), get_the_time(__('F, Y', 'kubrick'))); ?></h2> <?php /* If this is a yearly archive */ } elseif (is_year()) { ?> <h2 class="pagetitle"><?php printf(_c('Archive for %s|Yearly archive page', 'kubrick'), get_the_time(__('Y', 'kubrick'))); ?></h2> <?php /* If this is an author archive */ } elseif (is_author()) { ?> <h2 class="pagetitle"><?php _e('Author Archive', 'kubrick'); ?></h2> <?php /* If this is a paged archive */ } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?> <h2 class="pagetitle"><?php _e('Blog Archives', 'kubrick'); ?></h2> <?php } ?>
を丸ごとコピペしてみたのですが、なぜかsyntax error
どうしてでしょうか?
月別アーカイブなら
echo get_query_var('year').'年'.get_query_var('monthnum').'月';
で 「2009年12月」のように表示されます。※編集した 〜.php ファイルは「UTF-8」で保存してください。
kzさん、いつもありがとうございます。
日付のデータが受け取れないようで、「0年0月」
となってしまいます。<?php $date = single_month_title('',FALSE); echo get_query_var('year',$date).'年'.get_query_var('monthnum',$date).'月'; ?>
とか、やってみたのですがやはり駄目でした。
どのように書けばよろしいですか?
また、「0年0月0日」はどのように書けばよろしいでしょう?
single_month_title は使わなくて良いです。
get_query_var('year',$date)
の書き方は誤りです。「,$date」は不要。get_query_var('year')
で年の値が取得できます。
※年別,年月別,年月日別 のアーカイブの場合
get_query_var('monthnum')
で月の値が取得できます。
※年月別,年月日別 のアーカイブの場合
get_query_var('day')
で日の値が取得できます。
※年月日別 のアーカイブの場合というわけで
<?php echo get_query_var('year').'年'.get_query_var('monthnum').'月'.get_query_var('day').'日'; ?>
やはり日付のデータが受け取れないようで、
「0年0月0日」というようになってしまいます。
なぜでしょうか?年別,年月別,年月日別 のアーカイブでない、とか。
そのページのURLは
http://example.com/2010/01/08
な感じになってますか?または、
年月日を表示する箇所より前に
query_posts(), get_posts()
とかなんとかしてる、とか。http://example.com/?m=20091224
となっています。条件分岐タグはありますが、
<?php $newquery = new WP_Query('cat=-5,-6,-7 &order=desc '); if ($newquery->have_posts()): ?> <?php while ($newquery->have_posts()) : $newquery->the_post(); ?>
を使っています。
こちらでは問題なく表示されます。
提示の部分コードでは問題ないです(直後に endwhile; endif; 追加で検証)。
そのループ全部のコードはどんなでしょうか。header.php の title タグで
<?php echo get_query_var('year').'年'.get_query_var('monthnum').'月'.get_query_var('day').'日'; ?>;
としても 0 ですか?<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <?php if(is_month()){ echo get_query_var('year').'年'.get_query_var('monthnum').'月'; }else if(is_day()){ echo get_query_var('year').'年'.get_query_var('monthnum').'月'.get_query_var('day').'日'; } ?><br /> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br /> <?php the_content(); ?> <?php endwhile; endif; ?>
こんな感じです。
あと、できればループ外で使いたいのですが。
月アーカイブのリンクをクリックしたら、月アーカイブページが開いてそのタイトルとして表示させたいのですが。
そのループでも問題ないです(検証済)。
header.php の title タグで
<?php echo get_query_var('year').'年'.get_query_var('monthnum').'月'.get_query_var('day').'日'; ?>;
をお試しください。追記:
?m=〜 のパーマリンクだと 0 ですね。調べてみます。パーマリンクがデフォルトの場合、以下のような感じでOKとなりました。
<title><?php if(is_date()){ $title = get_the_time('Y').'年'; if(is_day() || is_month()) $title .= get_the_time('m').'月'; if(is_day()) $title .= get_the_time('d').'日'; echo $title; }else{ wp_title(); } ?></title>
kzさん、やはり<title>より上にある、条件分岐タグの影響でした。
ページの最上部に配置したら大丈夫でした。条件分岐タグ
<?php $newquery = new WP_Query('cat=6 &order=desc & showposts=1'); if ($newquery->have_posts()): ?> <?php while ($newquery->have_posts()) : $newquery->the_post(); ?>
というのがヘッダーとサイドバーに2箇所ありました。
以前、条件分岐がうまく行かず質問した際に、下記の表記では駄目で
<?php query_posts('cat=6 & order=desc & showposts=20'); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
http://ja.forums.wordpress.org/topic/856?replies=3
こちらで、アドバイスいただき上記のようにしたのですが、今回は、どのように書けばよろしいでしょうか?
豆知識:
query_posts()
は使った後にwp_reset_query()
さえすれば
他に影響を与えず&他もその使用を考慮することなく、どこでも使えるので
WordPressの深い事情を理解するまでは WP_Query や get_posts より扱い易いです。なので、
<?php query_posts('cat=6 & order=desc & showposts=20'); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <?php // いろいろ出力 ?> <?php endwhile; endif; ?> <?php wp_reset_query(); ?>
<title>
より上にこのループを記述することが謎といえば謎なので
元々何がしたかったか書いていただくと、全体がスッキリするかもです
(別トピックが良いかも)。「表現が適切でない」というアレなツッコミはナシでよろしく > all。
kzさん、できました。
ありがとうございました。
- トピック「月別日別ページのタイトルの文字化け」には新たに返信することはできません。