トランスビット
トランスビットの開発ノート Webサイト制作に役立つTipsやトラブルシューティングなどの備忘録 - Wordpress -

カスタム投稿タイプの月別・年別アーカイブが404エラー

先日、Wordpress&各種プラグインをバージョンアップした時、それまで表示されていた年別アーカイブが表示されず、404エラーになりました。

他のページは問題なく表示されており、パーマリンクがおかしくなったんだろうと推測。そこで、よく知られている対処法、パーマリンク設定の更新をしたものの問題解決せず困ってしまいました。

ちなみにカスタム投稿タイプはCustom Post Type UI を、パーマリンクはCustom Post Type Permalinksを使っている状態です。

で、いろいろ調べて参考になったのが下記2サイトです。

WP カスタムポスト アーカイブ のリンクが効かない!? [Custom Post Type Permalinks]のバグ?

アップデートを行ったら月別、年別アーカイブのURLが変わってしまいました #74

要するに、

  1. パーマリンク設定に[/%post_id%/]を利用している場合、年月日のアーカイブ用パーマリンクには[/date/]が挿入されることになっている。
  2. Custom Post Type Permalinksのバグ?かエラーで、wp_get_archives()で出力されるリンクに[/date/]が入らなくなった。

ということのようです。あー、確かに[/%post_id%/]いっつも使ってますわー。

ちなみに、

[ターム] https://ドメイン/カスタム投稿タイプ名/ターム名/
[記事] https://ドメイン/カスタム投稿タイプ名/ターム名/記事ID/
[月別アーカイブ] https://ドメイン/カスタム投稿タイプ名/date/年/月/

といった感じのパーマリンクです。

つむぐいとさんのサイトを参考に、Custom Post Type Permalinksを削除&再インストールも試してみたのですが、うまくいかなかったのでwp_get_archives()で出力されるものを加工することで済ませました。方法は別記事、wp_get_archives()で出力されるURLを一部変更するにまとめてあります。

Filed under:

wp_get_archives()で出力されるURLを一部変更する

カスタム投稿タイプにカスタムタクソノミーをつけ、パーマリンク設定やfunction.phpをカスタマイズし、何とか思惑通りのパーマリンクに変更……
↓↓↓
[ターム] https://ドメイン/カスタム投稿タイプ名/ターム名/
[記事] https://ドメイン/カスタム投稿タイプ名/ターム名/記事ID/
[月別アーカイブ] https://ドメイン/カスタム投稿タイプ名/date/年/月/
↑↑↑
こんな感じにした時の話です。

WordPressのバージョンも、各種プラグインのバージョンも最新で、テーマは一から作ってすっきり。そんな状態で、テンプレートにwp_get_archives()使って月別アーカイブ一覧を出力したら、なんと https://ドメイン/カスタム投稿タイプ名/年/月/ といったリンクが生成されました……orz

プラグインのコンフリクトを疑ってみたり、パーマリンクの再設定をしてみたり、思いつくことはいろいろやってみたんですが、なんとも上手くいかず。
思惑通りのパーマリンクは得られていることだし、wp_get_archives()のほうをいじってお茶を濁すことにしました。

wp_get_archives()では、引数に echo => false としてやると、値を表示じゃなくって値を取得することができます。なのでその後、str_replaceでdateを入れてやればオッケーというわけです。

例えば、infoというカスタム投稿タイプだったとしたら……

$args= array(
  'type' => 'monthly',
  'echo' => false,
  'post_type' => 'info'
);
$monthly_list = wp_get_archives($args);
$monthly_list = str_replace('/info/', '/info/date/', $monthly_list);

echo $monthly_list;

これで月別アーカイブ一覧のリンクが正常に!
ただし、今後Wordpressやプラグインのバージョンアップでwp_get_archives()が普通に使えるようになるかもしれないので、置き換え前に、if(strpos($monthly_list,’/date/’) !== false){……とかしとくといいかもですね。

Filed under:

Event OrganiserのカレンダーウィジェットのタイトルをY年Fにする

Event Organiserのカレンダーウィジェットのタイトル……っていうかキャプションの日付表示が、’F Y’なのを、’Y年F’にする

要は、こういうことです。
widget_calendar

方法:1 直接プラグインをいじる。

編集するファイルは event-organiser/classes/class-eo-calendar-widget.php です。
プラグインアップデートの度に作業が必要な愚策ですが、一応目的は果たせます。

 
// 編集ファイル:event-organiser/classes/class-eo-calendar-widget.php

// $title = sprintf( '<caption> %s </caption>', esc_html( eo_format_datetime( $month, 'F Y' ) ) );
$title = sprintf( '<caption> %s </caption>', esc_html( eo_format_datetime( $month, 'Y年F' ) ) );

方法:2 function.phpでフィルターフックをかける。

やるなら断然こちらですね。
eo_format_datetime関数を調べると、フィルターフックがeventorganiser_format_datetimeということと、その使い方までわかります。
本当、コーデックス様々です。

ちなみに、同じようにしたいと思った人と、それができた人を見つけました。
WordPress プラグイン Event Organiserの日付表示について

上記プラグインにてウィジェットでカレンダーを表示しています。

カレンダーの日付部分が ◯月 2016といった表示になってしまいます。これを 2016 ◯月という風に年・月に表示を変更したいのですがプラグインのファイルを探してみても変更場所がみつかりません。
変更箇所がわかる方、どうかお教えいただけませんでしょうか

(captionの部分です)
—–
回答:こんな感じですかね。

// functions.php
function my_eventorganiser_format_datetime( $formatted_datetime , $format, $datetime ) {
    if ( $format === 'F Y' ) {
        return eo_format_datetime( $datetime, 'Y年 F' );
    } else {
        return $formatted_datetime;
    }
} // 未テスト
add_filter( 'eventorganiser_format_datetime', 'my_eventorganiser_format_datetime', 10, 3 );

残念ながら、質問者さんは実現できなかったようです。
私もやってみたんですが、すぐにはダメでした。後でできました。
というのも、ウィジェットを置きなおしてみたら、それまで効いていなかったフックが効いたんで。

別にオチをつけたかったわけじゃないんですけど……色々やってみるもんですね。

Filed under:

Event Organiser覚書

珍しく間を開けずに投稿。ちょっと忘れそうなので走り書き。
……そうだ、これが本来の使い方だった。(゚Д゚)

カスタム投稿タイプ利用の、イベントカレンダープラグインとしてなかなか優秀らしいEvent Organiserを使うことに。

Event Organiserの特徴

パーマリンクは個別設定可

設定→Event Organiser→パーマリンクから、各種見本パスの太字にあたる部分を変更することで、パーマリンクを設定することが出来ます。
今回ネックとなったのは、変更できない部分。太字じゃないとこ(=_=;

個別記事ページのパーマリンクは、他に合わせてpost_idにしたいのに、Event Organiserではslug…。
固定ページならしっかり付けますが、投稿記事のslugは面倒でわざわざ変更しないので、そのままタイトル流用になっちゃう場合が多いと思います。
プラグインそのものを編集してしまおうかとも思ったんですが、slugにpost_idベースの名前をいれてやれば良いんだ!と気づけたので、いつも一方的にお世話になっているjim912さんのサイトでコード発掘。
投稿スラッグを自動的に生成する
……今後はどのサイトにもこれを入れとこうかな。

各ページ用に専用テンプレート利用可

設定→Event Organiser→基本 で、どんなテンプレート名のものを用意すればいいか、書いてくれてます。
ちょっとしたことだけど手間が減ります。

カレンダー表示用等、各種ショートコード有

別に固定ページを用意して、そこにショートコード書いても良かったんですが、Event Organiserのarchiveページにカレンダーを表示させればURL的にも美しくおさまるので、カレンダー表示用のショートコードをアーカイブテンプレートに書きました。

エラーになりました。orz

仕方ないのでevent_fullcalendarでreadme.txtに検索かけたら、eo_get_event_fullcalendar();とかいう元関数を発見。ああよかった。

// ↓これは駄目
<?php echo do_shortcode('[eo_fullcalendar]'); ?>

// ↓これが正解
<?php echo eo_get_event_fullcalendar(); ?>

——————————–
2016/02/11 追記

Event Organiser Codexを発見!!

Filed under:

WordPressのギャラリーのカラム数を変更したり色々

世の中の皆さんはGW中ですね。
私は、仕事以外での想定外のイベント事……っていうかトラブルが多すぎて、その分回り回ってぐるぐるして、今年は半分GW、半分仕事って感じです。

さて、結局仕事では使わなかったけど、今後使うかもしれない程度に便利そうなのでメモ。
function.phpに記述。

/*********************************************************************************
// ギャラリーの設定を変更
*********************************************************************************/

function amethyst_gallery_atts( $out, $pairs, $atts ) {

    $atts = shortcode_atts( array(
        'columns' => '4',
        //'size' => 'thumbnail',
         ), $atts );

    $out['columns'] = $atts['columns'];
    $out['size'] = $atts['size'];

    return $out;

}
add_filter( 'shortcode_atts_gallery', 'amethyst_gallery_atts', 10, 3 );
/*********************************************************************************
// アイキャッチ画像がある場合はアイキャッチ画像を、ない場合は記事のギャラリーに入っている一番最初の画像を表示
*********************************************************************************/

function print_post_image($size = 'thumbnail'){
	if ( has_post_thumbnail() ) {
		the_post_thumbnail($size);
	} else {
		$attachments = get_children(array(
			'post_parent' => get_the_ID(),
			'post_type' => 'attachment',
			'post_mime_type' => 'image',
			'order' => 'DESC'
			));
		if(!empty($attachments)){
			$img = array_shift($attachments);
			echo wp_get_attachment_image($img->ID ,$size);
		}
	}
}

Filed under: