Appearance
DailyArticleTemplate - 使用手順書
概要
DailyArticleTemplateは、日別記事の定型ショートコードを自動生成するテンプレート機能です。日付とホール(複数選択可能)を入力値として受け取り、既存のショートコードを動的に生成します。
この機能により、複雑なHTML/ショートコードのコピペ作業を廃止し、投稿作業をカスタムフィールドへのデータ入力のみに簡略化できます。
目的
- 複雑なHTML/ショートコードのコピペ作業を廃止
- 投稿作業をカスタムフィールドへのデータ入力のみに簡略化
- 日付とホールを指定するだけで、定型のショートコードを自動生成
前提条件
必要な環境
- WordPress環境
- カスタム投稿タイプ「日別記事」(
daily_article)が設定されていること(詳細は DailyArticlePostType README を参照)
メタキー(post_meta)について
日別記事では以下のメタキーをブロックエディタのメタボックスで入力します:
日付フィールド(例:
kousatsu_date)- フィールドタイプ: 日付ピッカー
- 必須: はい
- 日付形式: YYYY-MM-DD
ホール選択フィールド(例:
halls)- フィールドタイプ: チェックボックス
- 必須: はい
- 選択肢: アイランド秋葉原、エスパス秋葉原、ビッグアップル秋葉原、秋葉原uno
- または、カンマ区切り文字列として入力可能
手動入力フィールド(例:
manual_content)- フィールドタイプ: WYSIWYGエディタ または テキストエリア
- 必須: いいえ
- HTML、WordPressブロック形式、ショートコードを含むコンテンツを入力可能
機種名フィールド(例:
kishu)- フィールドタイプ: テキスト
- 必須: いいえ
kishudataショートコード用の機種名
使用方法
1. 投稿テンプレートの作成
カスタム投稿タイプ(例: kousatsu)に対応する投稿テンプレートファイル(例: single-kousatsu.php)を子テーマ内に作成します。
2. テンプレートファイルでの呼び出し
投稿テンプレートファイル内で、以下のように関数を呼び出します:
php
<?php
$post_id = get_the_ID();
// post_meta から値を取得
$date = get_post_meta($post_id, 'kousatsu_date', true);
$halls = get_post_meta($post_id, 'halls', true); // カンマ区切り文字列
$manual_content = get_post_meta($post_id, 'manual_content', true);
$kishu = get_post_meta($post_id, 'kishu', true);
// テンプレート関数を呼び出してショートコードを生成
echo generate_daily_article_template($date, $halls, $manual_content, $kishu);
?>3. パラメータの説明
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
$date | string|DateTime|null | 必須 | 対象日付(YYYY-MM-DD形式、YYYYMMDD形式、またはDateTimeオブジェクト) |
$halls | string|array|null | 必須 | ホール名(カンマ区切り文字列、配列、またはnull)。配列の場合は自動的に文字列へ変換されます |
$manual_content | string|null | 任意 | 手動入力部分のコンテンツ(HTML、WordPressブロック形式、ショートコードを含む) |
$kishu | string|null | 任意 | 機種名(kishudataショートコード用) |
4. 生成されるショートコードの順序
以下の順序でショートコードが生成されます:
1回だけ生成(順序はテンプレートで変更可能):
[MonthlyLinkByYear year={year}][BirthDayMachinePickUp year={year} month={month} day={day} halls="{英字スラッグCSV}"](hallsは投稿で選択したホールに同期)
各ホールに対してループ生成(以下の順序で各ホールごとに繰り返し):
[MailImage hall="{hall}" date="{YYYYMMDD}"][MoveDayHall preday="{前日YYYYMMDD}" nextday="{翌日YYYYMMDD}" name="{hall}"]- 手動入力部分(
manual_content、指定されている場合) [CustomCode_CreateDailyArticleRelationalDay date="{YYYY-MM-DD}" hall="{hall}"][CustomCode_CreateDailyArticleResult hall="{hall}" date="{YYYY-MM-DD}"][kishudata day="{YYYY/M/D}" hall="{hall}" kishu="{kishu}"](kishuが指定されている場合)
注意: 手動入力部分(manual_content)は各ホールごとに出力されます。
使用例
基本的な使用例
php
<?php
$post_id = get_the_ID();
$date = get_post_meta($post_id, 'kousatsu_date', true); // 例: "2024-11-01"
$halls = get_post_meta($post_id, 'halls', true); // 例: "アイランド秋葉原,エスパス秋葉原"
$manual_content = get_post_meta($post_id, 'manual_content', true); // 例: "<p>手動入力部分</p>"
$kishu = get_post_meta($post_id, 'kishu', true); // 例: "犬夜叉"
echo generate_daily_article_template($date, $halls, $manual_content, $kishu);
?>配列形式のホール指定
php
<?php
$post_id = get_the_ID();
$date = get_post_meta($post_id, 'kousatsu_date', true);
$halls = get_post_meta($post_id, 'halls', true); // カンマ区切り文字列または配列
// 配列の場合は自動的にカンマ区切り文字列に変換されます
echo generate_daily_article_template($date, $halls);
?>手動入力部分を含む使用例
php
<?php
$post_id = get_the_ID();
$date = get_post_meta($post_id, 'kousatsu_date', true);
$halls = get_post_meta($post_id, 'halls', true);
$manual_content = get_post_meta($post_id, 'manual_content', true);
// 例: "<p>手動入力部分</p><!-- wp:shortcode -->[SomeOtherShortcode param=\"value\"]<!-- /wp:shortcode -->"
echo generate_daily_article_template($date, $halls, $manual_content);
?>最小限の使用例(必須パラメータのみ)
php
<?php
$post_id = get_the_ID();
$date = get_post_meta($post_id, 'kousatsu_date', true);
$halls = get_post_meta($post_id, 'halls', true);
echo generate_daily_article_template($date, $halls);
?>生成例
単一ホールの場合
$date = "2024-11-01", $halls = "アイランド秋葉原" が指定された場合:
<!-- wp:shortcode -->
[MonthlyLinkByYear year=2024]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[BirthDayMachinePickUp year=2024 month=11 day=1 halls="island"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[MailImage hall="アイランド秋葉原" date="20241101"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[MoveDayHall preday="20241031" nextday="20241102" name="アイランド秋葉原"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[CustomCode_CreateDailyArticleRelationalDay date="2024-11-01" hall="アイランド秋葉原"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[CustomCode_CreateDailyArticleResult hall="アイランド秋葉原" date="2024-11-01"]
<!-- /wp:shortcode -->複数ホールの場合
$date = "2024-11-01", $halls = "アイランド秋葉原,エスパス秋葉原", $manual_content = "<p>手動入力部分</p>" が指定された場合:
<!-- wp:shortcode -->
[MonthlyLinkByYear year=2024]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[BirthDayMachinePickUp year=2024 month=11 day=1 halls="island,espasu"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[MailImage hall="アイランド秋葉原" date="20241101"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[MoveDayHall preday="20241031" nextday="20241102" name="アイランド秋葉原"]
<!-- /wp:shortcode -->
<p>手動入力部分</p>
<!-- wp:shortcode -->
[CustomCode_CreateDailyArticleRelationalDay date="2024-11-01" hall="アイランド秋葉原"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[CustomCode_CreateDailyArticleResult hall="アイランド秋葉原" date="2024-11-01"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[MailImage hall="エスパス秋葉原" date="20241101"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[MoveDayHall preday="20241031" nextday="20241102" name="エスパス秋葉原"]
<!-- /wp:shortcode -->
<p>手動入力部分</p>
<!-- wp:shortcode -->
[CustomCode_CreateDailyArticleRelationalDay date="2024-11-01" hall="エスパス秋葉原"]
<!-- /wp:shortcode -->
<!-- wp:shortcode -->
[CustomCode_CreateDailyArticleResult hall="エスパス秋葉原" date="2024-11-01"]
<!-- /wp:shortcode -->注意事項
日付形式
- 日付は
YYYY-MM-DD形式(例:2024-11-01)またはYYYYMMDD形式(例:20241101)で指定できます DateTimeオブジェクトも受け付けます- 前日・翌日は自動的に計算されます
ホール名
- 対応ホール: アイランド秋葉原、エスパス秋葉原、ビッグアップル秋葉原、秋葉原uno
- 複数ホールを指定する場合は、カンマ区切り文字列(例:
"アイランド秋葉原,エスパス秋葉原")または配列で指定できます - カンマが連続している場合(例:
"island,,espasu")や、末尾にカンマがある場合(例:"island,espasu,")は、空の要素が自動的に除去されます
手動入力部分
- 手動入力部分(
manual_content)は各ホールごとに出力されます - HTML、WordPressブロック形式、ショートコードを含むコンテンツを入力可能です
- ショートコードが含まれている場合は、
do_shortcode()で実行されます - XSS対策として、
wp_kses_post()でサニタイゼーション処理が行われます
エラーハンドリング
- バリデーションエラーが発生した場合、
WP_DEBUGが有効な場合のみエラーメッセージが表示されます - 予期しないエラーは
error_log()でログに記録されます - エラー時は空文字が返されます(デバッグモードでない場合)
トラブルシューティング
何も表示されない
WP_DEBUGを有効にして、エラーメッセージを確認してください- メタキー(post_meta)名が正しいか確認してください
- 日付とホールが正しく設定されているか確認してください
エラーメッセージが表示される
- 日付形式が正しいか確認してください(
YYYY-MM-DDまたはYYYYMMDD) - ホール名が正しいか確認してください(対応ホール: アイランド秋葉原、エスパス秋葉原、ビッグアップル秋葉原、秋葉原uno)
手動入力部分が表示されない
manual_contentフィールドが空でないか確認してください- HTMLが正しくエスケープされていないか確認してください(
wp_kses_post()でサニタイゼーションされます)
関連ファイル
テンプレート関数
core_src/Template/DailyArticleTemplate/DailyArticleTemplate.php
コントローラー
core_src/Controller/DailyArticleTemplateController/DailyArticleTemplateController.php
コンバーター
core_src/Template/DailyArticleTemplate/converter/DailyArticleTemplateConverter.php
DTO
core_src/Template/DailyArticleTemplate/dto/DailyArticleTemplateRequestDto.php
ビュー
core_src/View/templates/DailyArticleTemplate/DailyArticleTemplateView.phpcore_src/View/templates/daily_article_template/daily_article_template.twig
関連する既存ショートコード
MonthlyLinkByYear- 月別リンクカレンダー(日別テンプレ上部)BirthDayMachinePickUp- 誕生日ピックアップ+関連機種(日別テンプレ上部・halls指定)MakeArtist20230318- 上記2つを連結したレガシー統合タグ(通常投稿本文の過去記事)MailImage- メール画像表示MoveDayHall- 前日・翌日記事へのリンクCustomCode_CreateDailyArticleRelationalDay- 関連日、カレンダー部分CustomCode_CreateDailyArticleResult- 日別記事の結果部分kishudata- 機種データ出力
本番環境での設定手順
本番環境でDailyArticleTemplate機能を使用するには、以下の設定が必要です。
1. カスタム投稿タイプの設定
カスタム投稿タイプ「日別記事」(daily_article)の設定については、DailyArticlePostType READMEを参照してください。
2. テンプレートファイルの追加
カスタム投稿タイプ(daily_article)用のテンプレート階層は、WordPressの仕様により以下の両方が自動的に認識されます(WordPress 4.7以降):
single-daily_article.php(アンダースコア区切り、従来の標準)single-daily-article.php(ハイフン区切り、4.7以降対応)
現在の実装では single_template フィルター(TemplateHooks::fix_template())が有効化されているため、テンプレートファイル「single-daily-article-template.php」が強制的に使用されます。これにより、上記のデフォルト階層は実質的にバイパスされます。このテンプレート強制の理由は、Git管理下のテンプレートを常に利用し、デザイン・機能の一貫性を保つためです。
管理画面で選択可能なテンプレート
子テーマルートからの相対パスで myCustom/myTemplate/ に以下のファイルを置きます(本リポジトリでは myTemplate/single-daily-article-template.php としてバージョン管理し、デプロイでリモートの myCustom/myTemplate/ に配置されます)。
ファイルパス: myCustom/myTemplate/single-daily-article-template.php(子テーマルート基準)
ファイル内容:
php
<?php
/*
Template Name: 日別記事テンプレート
Template Post Type: daily_article
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
get_header();
// テンプレート本体は DAILY_ARTICLE_TEMPLATE_BODY_PATH で指定されたファイルを使用
if ( ! defined( 'DAILY_ARTICLE_TEMPLATE_BODY_PATH' ) ) {
// セキュリティ上の理由から、詳細な情報は画面には表示せずログにのみ出力する
error_log( // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- 運用時の調査用にサーバ側ログへのみ出力する意図的な使用
'[ERROR] DailyArticleTemplate: DAILY_ARTICLE_TEMPLATE_BODY_PATH is not defined. Check that myCustom/connector.php is loaded correctly.'
);
wp_die(
esc_html__( '日別記事テンプレートの設定に問題があります。サイト管理者にお問い合わせください。', 'cocoon-child-master' )
);
}
if ( ! file_exists( DAILY_ARTICLE_TEMPLATE_BODY_PATH ) ) {
// セキュリティ上の理由から、フルパスは画面には表示せずログにのみ出力する
error_log( // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- 運用時の調査用にサーバ側ログへのみ出力する意図的な使用
sprintf(
'[ERROR] DailyArticleTemplate: Daily article template body not found: %s',
DAILY_ARTICLE_TEMPLATE_BODY_PATH
)
);
wp_die(
esc_html__( '日別記事テンプレート: テンプレート本体が見つかりません。', 'cocoon-child-master' )
);
}
require DAILY_ARTICLE_TEMPLATE_BODY_PATH;
get_footer();注意:
single-daily-article-template.phpは、カスタム投稿タイプ「日別記事」(daily_article)専用のテンプレートです。single_templateフィルター(TemplateHooks::fix_template())により、すべてのdaily_article投稿に対して自動的に適用されます(テンプレート選択は不要)。- WordPressのデフォルトテンプレート階層(
single-daily_article.phpやsingle-daily-article.php)はバイパスされます。 - テンプレート本体のパスは定数
DAILY_ARTICLE_TEMPLATE_BODY_PATHで管理されます。アプリ起動時(ConstantsServiceProvider)にROOT(開発時はcore_src、本番は_build/core_*)からの相対パスで定義されます。代用パスは廃止しており、未定義またはファイル不在の場合はwp_dieで検知します。
3. 動作確認
- カスタム投稿タイプ「日別記事」で新規投稿を作成
- テンプレートが正しく適用されていることを確認
- フロントエンドで正しく表示されることを確認
参考資料
- DailyArticlePostType README - カスタム投稿タイプの詳細
- 関連する仕様・タスクは GitHub の Issue で管理しています
最終更新
- 更新日: 2026-03-29
- バージョン: 1.3
- 変更内容: ラッパーの配置パスを
myCustom/myTemplate/single-daily-article-template.phpに統一(DAILY_ARTICLE_TEMPLATE_PATHとデプロイ先の整合)。_wp_page_templateの既存値については DailyArticlePostType README を参照。