WordPressあれこれ

【プラグイン】無料在席キャスト管理システム krc-cast-manager を使ってみた

無料在席キャスト管理システム krc-cast-manager を使ってみた
WEB先案内

2023-05-07

ショートコード[todayscasthtml]の不具合を解消するPHPコードを追記しました。

先日、夜のお店のWordPressサイトをメンテナンスする機会がありました。

サイトには「krc-cast-manager」という無料在席キャスト管理のプラグインがインストールされており、その不具合を修復するという内容でした。

ココナラでも2回ほどこのプラグインに関するご相談をいただいたことがあります。

実は、このプラグインは無料とは思えないくらい優秀で、夜のお店の界隈では有名なプラグインのようです。

WEB先案内の性格上、ちょっとクセがあるけど便利でマニアックなプラグインに目がないので、頑張って検証環境で構築してみました。

ところが、このプラグインはインストールするだけでは動きません。(考えが浅はかでした・・・)

前提知識として、テンプレートの理解とPHPコーディングスキルが必要です。

さらっといってしまいましたが、これだけでもハードルが高いと思います。

なので、まずは、テンプレートを理解するため、テーマテンプレートとモジュールテンプレートを簡単に説明します。

次に、プラグインとテーマを連携するため、テンプレート作成とショートコード関数を作ります。

最後に実際に構築したデモサイトの画面コピーをご覧いただきます。

それでは、はじめます! ٩( ‘ω’ )و

※WordPress初学者には難易度の高い内容となっております(>人<;)

テンプレート構造

テーマテンプレート

WordPress がURLの要求に従って読み込むファイルを「テーマテンプレート」といいます。

テーマの中には、テーマテンプレートだけでなく、他のスタイルシート・画像・ファイルも含めることができます。

ただ、以下のファイルが WordPress にとって特別な意味を持つことは覚えておいてください。

追加情報はテンプレート階層をご覧ください。
Noファイル名説明
1style.cssメインのスタイルシート
テーマにはこのファイルが必須で、テーマのヘッダ情報を含まなければなりません。
2rtl.cssRTL スタイルシート
ウェブサイトのテキスト方向が右から左の場合、このファイルが自動的に適用されます。
RTL スタイルシートは the RTLer プラグインを使って生成することもできます。
3index.phpメインテンプレート
(親テーマのテンプレートを利用するのではなく) このテーマ自身のテンプレートを設けるなら index.php は必須。
4comments.phpコメントテンプレート
5front-page.phpフロントページテンプレート
home.phpとfront.phpが両方存在した場合は、front-page.phpがフロントページ表示用のテンプレートとして使われます。
6home.phpホームページテンプレート
フロントページの表示(にデフォルトとして設定されている最新の投稿)に使われる。
固定ページをフロントページとして設定した場合、指定した固定ページがフロントページの表示に使われます。
7single.php個別投稿テンプレート
ひとつの投稿が要求 (クエリ) されたときに使用。
このクエリテンプレートが存在しないときは index.php が使われる。
この他のクエリテンプレートも同様。
8single-<post-type>.phpカスタム投稿タイプの個別投稿が要求 (クエリ) されたときに使われるテンプレート
例えば books というカスタム投稿タイプを個別表示するためには single-books.php が使われる。
9page.php固定ページテンプレート
特定の固定ページが要求されたときに使用。
10category.phpカテゴリテンプレート
あるカテゴリが要求されたときに使用。
11tag.phpタグテンプレート
タグが要求されたときに使用。
12taxonomy.phpタクソノミーテンプレート
カスタム分類内の個別項目が要求されたときに使用。
13author.php作成者テンプレート
作成者が要求されたときに使用。
14date.php日付別テンプレート
ある日付または時刻が要求されたときに使用。年、月、日、時、分、秒。
15archive.phpアーカイブテンプレート
あるカテゴリ、作成者、日付が要求されたときに使用。
各クエリの種類に対応する category.php、author.php、date.php がそれぞれ存在する場合は、
そのクエリに対してアーカイブテンプレートは無効となる。
16search.php検索結果テンプレート
ある検索が実行されたときに使用。
17attachment.php添付ファイルテンプレート
特定の添付ファイルを個別表示するときに使用。
18image.php添付画像ファイルテンプレート
特定の添付画像ファイルを個別表示するときに使用。存在しない場合は attachment.php が使用される。
19404.php404 Not Found テンプレート
WordPress が要求に合う投稿やページを見つけられなかったときに使用。_
20function.phpテーマ関数ファイル
このファイルは基本的にプラグインのような動作をし、現在使っているテーマ内に存在していれば、
管理画面とサイト表示の両方で、自動的に WordPress の初期化中に読み込まれます 。
これらのファイルは、テンプレート階層に従って適用できるファイルがあるときや、対応する条件タグが true を返すとき、index.php に代わって使われるため、WordPress にとって特別な意味を持ちます。

例えば、個別投稿が表示される際に is_single() 関数は ‘true’ を返し、有効になっているテーマ内に single.php ファイルがあれば、ページの生成にはこのテンプレートが使われます。

テーマの関数ファイル function.php

テーマでは、オプションとして、テーマのサブディレクトリ内に functions.php というファイル名で「関数ファイル」を置くことができます。

このファイルは基本的にプラグインのような動作をし、現在使っているテーマ内に存在していれば、(管理画面とサイト表示の両方で)自動的に WordPress の初期化中に読み込まれます。

関数を functions.php に定義するのか、プラグインに定義するのか、に関して

同じ関数が「1つ以上のテーマで使用可能であることが必要」な場合、その関数はfunctions.phpではなく、プラグイン内にて定義する方がいいでしょう。

たとえば、

デフォルトでは投稿一覧ページや固定ページ一覧には、スラッグやPost IDは表示されていません。

プラグインやテーマの設定をする時、これは意外にも不便だったりします。

こんな時に投稿一覧ページや固定ページ一覧を見ればわかるようになっているとストレスフリーになります。

スラッグやPost IDを表示させる関数は、テーマを跨いで使用できると、テーマを切り替えても表示されるため、困ることがありません。

このような状況ではプラグイン内に定義しておいた方が良いでしょう。

モジュールテンプレート

前述のテーマテンプレートから呼び出されるものが「モジュールテンプレート」です。

別名、パーツテンプレートとも呼ばれています。

名前のとおりページ内の一部を表示させるテンプレートファイルです。

WordPressのテンプレートファイルは、サイトの構成によってどのファイルを使うかを考え、テンプレートを選ぶ必要があります。

これらのテンプレート内にも共通に使う部分があります。

例えばヘッダーやフッター部分などは全サイト共通部分として使用することがあります。

そこで1ページの中でも複数のページで共有するパーツなどを分けて管理するために『モジュールテンプレート(パーツテンプレートファイル)』が用意されています。

これらをうまく使うことによって一箇所の修正でページ全体を変更することもできますので、サイト運用を効率よく行うことが可能です。

ただし、サイト設計時にどのように分けるかを考えないで構築すると収集がつかなくなりますので、作成時にしっかりとルールを決めることをおすすめします。

モジュールテンプレートは、これからテーマを自作しようと思っている方が知っておくと役に立ちます。

ここでは、モジュールテンプレートの種類と役割について見ていきます。
Noファイル名説明
1header.phpヘッダーテンプレート
ヘッダー部分で読み込まれる。
2footer.phpフッターテンプレート
フッター部分で読み込まれる。
3sidebar.phpサイドバーテンプレート
サイドバー部分で読み込まれる。
4searchform.php検索フォームテンプレート
検索フォームの表示。
5comments.phpコメントテンプレート
comments_template()で読み込まれる。
6content-page.php固定ページ内コンテンツテンプレート
固定ページ内コンテンツの表示。page.phpにおいてget_template_part('content','page')で読み込まれる。
このファイルが存在しない場合、content.phpが読み込まれる。
7content-single.php個別投稿ページ内コンテンツテンプレート
個別投稿ページでのコンテンツの表示。 single.phpにおいてget_template_part('content','single')で読み込まれる。
このファイルが存在しない場合、content.phpが読み込まれる。
8content.phpコンテンツテンプレート
一覧ページや検索結果ページなどでのループ内で表示。
get_template_part('content') で読み込まれる。

header.php

HTMLファイルの宣言文からヘッダーエリアに使用するファイルとして、『header.php』があります。

どこの領域までをヘッダーにするかは制作者の判断になりますが、例えばgoogleのようにロゴをイベント毎に変えたかったり、ヘッダーの装飾を変えたかったりする際には、HTML宣言文からid=”header”要素までを「header.php」内にすることによって、このファイルを修正することによってどのカテゴリー、固定ページを一括で変更することができます。

「header.php」を呼び出すWordPressのテンプレートタグは『<?php get_header(); ?>』となります。

footer.php

ページ下部のフッターエリアからHTMLの閉じタグまでの最後のエリアを使用するファイルとして、『footer.php』があります。

コピーライトのみのような場合やフッターにも情報を多く入れる場合など、ページのフッター情報を一元管理する際には、id=”footer”要素とHTMLの終了タグを「footer.php」内にすることによって、このファイルを修正することによってどのカテゴリー、固定ページを一括で変更することができます。

「footer.php」を呼び出すWordPressのテンプレートタグは『<?php get_footer(); ?>』となります。

sidebar.php

ブログや通常サイトなどの2カラムのサイトで、サイドの領域を使用するファイルとして『sidebar.php』があります。

メインコンテンツのサイドにある領域を一元管理にする際には、id=”sidebar”要素などを「sidebar.php」内に設定します。こうすることによってどのカテゴリー、固定ページを一括で変更することができます。

「sidebar.php」を呼び出すWordPressのテンプレートタグは『<?php get_sidebar(); ?>』となります。

またheader、footer、sidebarなどがありますが、必ずしもheaderだからヘッダーエリアしか使えないということはなく、分かりやすさのために命名されているものと思ってください。

テンプレートファイルだけでページを分けてしまうと共通部分の修正作業を個別に行わなければいけなるのでサイト全体を考える際に各要素のモジュール化を意識するとよいでしょう。

searchform.php

ページ内にサイト内検索のフォームなどを入れる際に用意されているモジュールテンプレートとして「searchform.php」があります。

よく見るのは、サイトのヘッダーエリアなどにあるものです。

検索結果で見つからない場合などに、「ページがみつかりませんでした」のメッセージの下に呼び出すことで、ユーザーがわざわざ上にいかなくてもすぐに別のキーワードなどで探せるので便利です。

「searchform.php」を呼び出すWordPressのテンプレートタグは『<?php get_search_form(); ?>』となります。

comments.php

通常サイトではあまりないかもしれませんが、コメントエリアのコードをまとめるものとして「comments.php」があります。「comments.php」を呼び出すWordPressのテンプレートタグは『<?php get_comments_template(); ?>』となります。

ここまでの5つが名前が決まっているモジュールテンプレートファイルとなります。

検証環境

  • サーバー: Local version 6.0.0
  • PHPバージョン: 7.4.1
  • WordPressバージョン: 5.7.2
  • テーマ: Zakra Child
  • プラグイン: krc-cast-manager

プラグイン全体像

krc-cat-manager

kurubusi.netさんが無料で公開しているワードプレスのプラグインです。

風俗サイト用:無料在席キャスト管理WordPressプラグイン

風俗のサイト用に作られたみたいですが、それ以外にもスタッフ管理などにも使えたりと色々重宝しそうです。

繰り返しますが、プラグインをインストールすればすぐに使えるというわけではなく、ある程度自分でコードを書いたり設定したりしないといけません。

具体的には、テーマテンプレート一覧 と モジュールテンプレート一覧 の赤色で強調したテンプレートを主に作っていきます。

後ほど説明するPHPコードを読んで分からなくなったら、戻って読み直してください。(WEB先案内は何回も読んでやっと理解しました(^◇^;))

使い方

kurubusi.netさんは別のページでこのプラグインの表示のさせ方を公開してくれています。

他にもこのkrc-cast-managerを使い、そのデモサイトやソースコードを書いてくれているサイトがいくつかあったので、そちらも参考になると思います。

印象としては、重要な部分が割愛されているため上級者向けの説明だと思います(^◇^;)

まずは上記のkurubusi.netさんのサイトから zipファイル をダウンロード。

ファイルの名前を「krc-cast-manager-master」から「krc-cast-manager」へ変更し、ワードプレスのプラグインに追加します。
プラグイン追加場所
プラグイン追加場所

追加するファイル

準備するファイルは下記の7つです。
※()内はテンプレートの分類です
  • archive-cast.php(テーマテンプレート)
  • content-cast.php(モジュールテンプレート)
  • content-castlist.php(モジュールテンプレート)
  • content-castschedule.php(モジュールテンプレート)
  • content-todaycastlist.php(モジュールテンプレート)
  • single-cast.php(テーマテンプレート)
  • functions.phpに追記(テーマテンプレート)

archive-cast.php

1<?php
2/**
3 * The template for displaying archive pages
4 *
5 * @link    https://developer.wordpress.org/themes/basics/template-hierarchy/
6 *
7 * @package zakra
8 * 
9 * Template Name: キャスト一覧
10 */
11get_header(); ?>
12
13<div id="primary" class="content-area">
14    <?php echo apply_filters( 'zakra_after_primary_start_filter', false ); // WPCS: XSS OK. ?>
15    <?php if ( have_posts() ) : ?>
16
17    <header class="page-header">
18        <?php
19        zakra_entry_title();
20        the_archive_description( '<div class="archive-description">', '</div>' );
21        ?>
22    </header><!-- .page-header -->
23
24    <?php do_action( 'zakra_before_posts_the_loop' ); ?>
25    <div class="row">
26        <?php
27        /* Start the Loop */
28        while ( have_posts() ) :
29        the_post();
30        get_template_part('content',('castlist')); // content-castlist.phpを呼び出す
31
32        endwhile;
33        ?>
34    </div>
35    <?php
36    do_action( 'zakra_after_posts_the_loop' );
37
38    else :
39
40    get_template_part( 'template-parts/content', 'none' );
41
42    endif;
43    ?>
44
45    <?php echo apply_filters( 'zakra_after_primary_end_filter', false ); // // WPCS: XSS OK. ?>
46</div><!-- #primary -->
47
48<?php
49get_sidebar();
50get_footer();

content-cast.php

1/*
2* プラグインで設定した
3*「カスタムフィールド」「画像」「タイプ管理」「グレード管理」「新人区分」
4* を各変数に格納します
5*/
6<?php
7$cast_fields = get_post_custom(); //カスタムフィールドを全部取得
8$cast_screens = json_decode($cast_fields['_krc_cast_screens'][0]); //画像配列を用意
9$cast_type_terms = get_the_terms($post->ID, 'krc_type'); //タイプタクソノミーを取得
10$cast_grade_terms = get_the_terms($post->ID, 'krc_grade'); //グレードタクソノミーを取得
11$cast_new_terms = get_the_terms($post->ID, 'krc_new'); //新人区分タクソノミーを取得
12?>
13
14/*
15* ブラウザがレンダリングできるようにHTMLに組み込みます
16*/
17<div class="cast">
18    <!-- スライドショー -->
19    <div class="cast-photo">
20        <?php if(empty($cast_screens)): ?>
21        <img src="<?php echo get_stylesheet_directory_uri(); ?>/images/no.jpg" alt="<?php the_title(); ?>">
22        <?php else: ?>
23        <div class="slider">
24            <ul class="top-slider">
25                <?php foreach($cast_screens as $index => $value): ?>
26                <li>
27                    <a href="<?php echo $value; ?>" rel="gallery">
28                        <img src="<?php echo $value; ?>" alt="<?php the_title(); ?> 写真 <?php echo ($index+1); ?>">
29                    </a>
30                </li>
31                <?php endforeach; ?>
32            </ul>
33
34            <ul class="thumbnail">
35                <?php foreach($cast_screens as $value): ?>
36                <li alt="<?php the_title(); ?>">
37                    <img src="<?php echo $value; ?>" alt="<?php the_title(); ?>">
38                </li>
39                <?php endforeach; ?>
40            </ul>
41        </div>
42
43        <?php if( empty($cast_new_terms) ): ?>
44        <?php else: ?>
45        <span class="new_cast badge">New</span>
46        <?php endif;?>
47        <?php endif; ?>
48    </div>
49    <div class="cast-profile">
50        <div class="cast-meta">
51            <figure class="wp-block-table is-style-stripes">
52                <table>
53                    <tbody>
54                        <tr>
55                            <td>名前</td>
56                            <td>
57                                <?php echo esc_html($cast_fields['_krc_name'][0]);?>
58                            </td>
59                        </tr>
60
61                        <tr>
62                            <td>年齢</<?php echo esc_html($cast_fields['_krc_name'][0]);?>td>
63                            <td>
64                                <?php if(empty($cast_fields['_krc_age'][0])): ?>- <?php else: ?>
65                                <?php echo esc_html($cast_fields['_krc_age'][0]);?>
66                                <?php endif; ?>歳</td>
67                        </tr>
68
69                        <tr>
70                            <td>身長</td>
71                            <td>
72                                <?php if(empty($cast_fields['_krc_tall'][0])): ?>- <?php else: ?>
73                                <?php echo esc_html($cast_fields['_krc_tall'][0]);?>
74                                <?php endif; ?>
75                                cm</td>
76                        </tr>
77                        <tr>
78                            <td>スリーサイズ</td>
79                            <td>
80                                B:
81                                <?php if(empty($cast_fields['_krc_bust'][0])): ?>- <?php else: ?>
82                                <?php echo esc_html($cast_fields['_krc_bust'][0]);?>
83                                <?php endif; ?>
84                                (
85                                <?php if(empty($cast_fields['_krc_cups'][0])): ?>- <?php else: ?>
86                                <?php echo esc_html($cast_fields['_krc_cups'][0]);?>
87                                <?php endif; ?>
88                                )
89                                W:
90                                <?php if(empty($cast_fields['_krc_waist'][0])): ?>- <?php else: ?>
91                                <?php echo esc_html($cast_fields['_krc_waist'][0]);?>
92                                <?php endif; ?>
93                                H:
94                                <?php if(empty($cast_fields['_krc_hips'][0])): ?>- <?php else: ?>
95                                <?php echo esc_html($cast_fields['_krc_hips'][0]);?>
96                                <?php endif; ?>
97                            </td>
98                        </tr>
99
100                    </tbody>
101                </table>
102            </figure>
103        </div>
104        <h2 class="sub-section">コメント</h2>
105        <div class="cast-pr"><?php the_content(); ?></div>
106    </div>
107</div>
108<div class="cast-schedule">
109    <h2 class="sub-section">スケジュール</h2>
110    <?php singlecalendar(get_the_ID()); ?> //function.phpsinglecalender()を呼び出す
111</div>
112<div class="wp-block-button is-style-fill">
113    <a href="/schedule" class="wp-block-button__link">出勤情報はこちら</a>
114</div>
115
116<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.0.min.js"></script>
117<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css" />
118<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
119
120/*
121* キャスト画像をスライド表示するjQuery
122*/
123<script type="text/javascript">
124    jQuery(function($) {
125        $('.top-slider').slick({
126            slidesToShow: 1,
127            slidesToScroll: 1,
128            arrows: false,
129            fade: true,
130            asNavFor: '.thumbnail'
131        });
132        $('.thumbnail').slick({
133            slidesToShow: 3,
134            slidesToScroll: 1,
135            asNavFor: '.top-slider',
136            arrows: false,
137            dots: true,
138            centerMode: true,
139            focusOnSelect: true
140        });
141    });
142
143</script>
キャストの画像はSlickスライダー使って表示させています。
キャストの画像を設定していない場合に表示させる画像を、子テーマ内の「imagesフォルダ」に「no.jpg」という名前で保存しておいてください。

content-castlist.php

1/*
2 * プラグインで設定した
3 *「カスタムフィールド」「画像」「タイプ管理」「グレード管理」「新人区分」
4 * を各変数に格納します
5 */
6<?php
7	$cast_fields = get_post_custom(); //カスタムフィールドを全部取得
8	$cast_screens = json_decode($cast_fields['_krc_cast_screens'][0]); //画像配列を用意
9	$cast_type_terms = get_the_terms($post->ID, 'krc_type'); //タイプタクソノミーを取得
10	$cast_grade_terms = get_the_terms($post->ID, 'krc_grade'); //グレードタクソノミーを取得
11	$cast_new_terms = get_the_terms($post->ID, 'krc_new'); //新人区分タクソノミーを取得
12?>
13
14/*
15 * ブラウザがレンダリングできるようにHTMLに組み込みます
16 */
17<div class="cast">
18    <a href="<?php the_permalink();?>">
19       
20        <figure class="cast-photo">
21            <?php if( empty($cast_screens) ): ?>
22                <img src="<?php echo get_stylesheet_directory_uri();?>/images/no.jpg" alt="<?php the_title();?>">
23            <?php else: ?>
24                <img src="<?php echo esc_url($cast_screens[0]);?>" alt="<?php the_title();?>">
25            <?php endif;?>
26
27            <?php if( empty($cast_new_terms) ): ?><?php else: ?>
28                <span class="cast-new badge">New</span>
29            <?php endif;?>
30
31            <?php if ( $fncName != 'todaysCastHtml'): ?>
32                <?php if (today_schedule(get_the_ID())):?>
33                    <span class="todays-cast badge">本日出勤</span>
34                <?php endif;?>
35            <?php endif;?>
36        </figure>
37
38        <figcaption class="text-center">
39
40            <div class="cast-name">
41                <?php echo esc_html($cast_fields['_krc_name'][0]);?>(<?php if(empty($cast_fields['_krc_age'][0])): ?> - <?php else: ?><?php echo esc_html($cast_fields['_krc_age'][0]);?><?php endif; ?>歳)
42            </div>
43
44            <div class="cast-size">
45                T:<?php if(empty($cast_fields['_krc_tall'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_tall'][0]);?>
46                <?php endif; ?>
47                B:<?php if(empty($cast_fields['_krc_bust'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_bust'][0]);?><?php endif; ?>(<?php if(empty($cast_fields['_krc_cups'][0])): ?> - <?php else: ?><?php echo esc_html($cast_fields['_krc_cups'][0]);?><?php endif; ?>)
48                W:<?php if(empty($cast_fields['_krc_waist'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_waist'][0]);?>
49                <?php endif; ?>
50                H:<?php if(empty($cast_fields['_krc_hips'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_hips'][0]);?>
51                <?php endif; ?>
52            </div>
53
54        </figcaption>
55
56    </a>
57</div>
新人キャストには「NEW」、
本日出勤のキャストには「本日出勤」と表示されるようにしています。

content-castschedule.php

1/*
2 * プラグインで設定した
3 *「カスタムフィールド」「画像」「タイプ管理」「グレード管理」「新人区分」
4 * を各変数に格納します
5 */
6<?php
7	$cast_fields = get_post_custom(); //カスタムフィールドを全部取得
8	$cast_screens = json_decode($cast_fields['_krc_cast_screens'][0]); //画像配列を用意
9	$cast_type_terms = get_the_terms($post->ID, 'krc_type'); //タイプタクソノミーを取得
10	$cast_grade_terms = get_the_terms($post->ID, 'krc_grade'); //グレードタクソノミーを取得
11	$cast_new_terms = get_the_terms($post->ID, 'krc_new'); //新人区分タクソノミーを取得
12?>
13/*
14 * ブラウザがレンダリングできるようにHTMLに組み込みます
15 */
16<div class="cast">
17    <a href="<?php the_permalink();?>">
18
19        <figure class="cast-photo">
20            <?php if( empty($cast_screens) ): ?>
21                <img src="<?php echo get_stylesheet_directory_uri(); ?>/images/no.jpg" alt="<?php the_title(); ?>">
22            <?php else: ?>
23                <img src="<?php echo $cast_screens[0]; ?>" alt="<?php the_title();?>">
24            <?php endif;?>
25            <?php if( empty($cast_new_terms) ): ?><?php else: ?>
26                <span class="cast-new badge">New</span>
27            <?php endif;?>
28        </figure>
29
30        <figcaption>
31            <div class="cast-name">
32                <?php echo esc_html($cast_fields['_krc_name'][0]);?>(<?php if(empty($cast_fields['_krc_age'][0])): ?> - <?php else: ?><?php echo esc_html($cast_fields['_krc_age'][0]);?><?php endif; ?>歳)
33            </div>
34            <div class="cast-size">
35                T:<?php if(empty($cast_fields['_krc_tall'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_tall'][0]);?>
36                <?php endif; ?>
37
38                B:<?php if(empty($cast_fields['_krc_bust'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_bust'][0]);?><?php endif; ?>(<?php if(empty($cast_fields['_krc_cups'][0])): ?> - <?php else: ?><?php echo esc_html($cast_fields['_krc_cups'][0]);?><?php endif; ?>)
39                W:<?php if(empty($cast_fields['_krc_waist'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_waist'][0]);?>
40                <?php endif; ?>
41                H:<?php if(empty($cast_fields['_krc_hips'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_hips'][0]);?>
42                <?php endif; ?>
43            </div>
44
45            <div class="worktime">
46                <i class="far fa-clock"></i>
47                <?php
48					if ($work['starttime'] !== '0') echo esc_html($work['starttime']); ?>
49                -
50                <?php if ($work['endtime'] !== '0') echo esc_html($work['endtime']);
51					?>
52            </div>
53
54        </figcaption>
55    </a>
56</div>

content-todaycastlist.php

1/*
2* プラグインで設定した
3*「カスタムフィールド」「画像」「タイプ管理」「グレード管理」「新人区分」
4* を各変数に格納します
5*/
6<?php
7$cast_fields = get_post_custom(); //カスタムフィールドを全部取得
8$cast_screens = json_decode($cast_fields['_krc_cast_screens'][0]); //画像配列を用意
9$cast_type_terms = get_the_terms($post->ID, 'krc_type'); //タイプタクソノミーを取得
10$cast_grade_terms = get_the_terms($post->ID, 'krc_grade'); //グレードタクソノミーを取得
11$cast_new_terms = get_the_terms($post->ID, 'krc_new'); //新人区分タクソノミーを取得
12?>
13/*
14* ブラウザがレンダリングできるようにHTMLに組み込みます
15*/
16<div class="cast">
17    <a href="<?php the_permalink();?>">
18
19        <figure class="cast-photo">
20            <?php if( empty($cast_screens) ): ?>
21            <img src="<?php echo get_stylesheet_directory_uri();?>/images/no.jpg" alt="<?php the_title();?>">
22            <?php else: ?>
23            <img src="<?php echo esc_url($cast_screens[0]);?>" alt="<?php the_title();?>">
24            <?php endif;?>
25            <?php if( empty($cast_new_terms) ): ?><?php else: ?>
26            <span class="cast-new badge">New</span>
27            <?php endif;?>
28        </figure>
29
30        <figcaption>
31            <div class="cast-name">
32                <?php echo esc_html($cast_fields['_krc_name'][0]);?>(
33                <?php if(empty($cast_fields['_krc_age'][0])): ?>- <?php else: ?>
34                <?php echo esc_html($cast_fields['_krc_age'][0]);?>
35                <?php endif; ?>歳)
36            </div>
37            <div class="cast-size">
38                T:<?php if(empty($cast_fields['_krc_tall'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_tall'][0]);?>
39                <?php endif; ?>
40                B:<?php if(empty($cast_fields['_krc_bust'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_bust'][0]);?><?php endif; ?>(<?php if(empty($cast_fields['_krc_cups'][0])): ?> - <?php else: ?><?php echo esc_html($cast_fields['_krc_cups'][0]);?><?php endif; ?>)
41                W:<?php if(empty($cast_fields['_krc_waist'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_waist'][0]);?>
42                <?php endif; ?>
43                H:<?php if(empty($cast_fields['_krc_hips'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_hips'][0]);?>
44                <?php endif; ?>
45            </div>
46
47            <!-- 出勤時間を表示 -->
48            <div class="worktime">
49                <i class="far fa-clock"></i>
50                <?php
51                date_default_timezone_set('Asia/Tokyo');
52                $today = getdate(); 
53
54                if($today['hours'] >= 0 and $today['hours'] < 5) {//0時〜5時の表示
55                    $today = strtotime(date("Y-m-d", strtotime("today")));
56                    echo '<span class="before5am">';
57
58                    for ($i = 0; $i <= 0; $i++) {//--- ループここから ---
59                        $y = date('D', strtotime('+'.$i.'-1 day', $today));
60                        if ( date('Y-m-d', strtotime('+'.$i.'-1 day', $today)) == $day ) $y = 'target';
61                        echo '';	
62                        if ( $casttime = today_schedule($id, date('Y-m-d', strtotime('+'.$i.'-1 day', $today))) ) {
63                            if ($casttime['starttime'] !== '0') echo esc_html($casttime['starttime']);
64                            echo ' - ';
65                            if ($casttime['endtime'] !== '0') echo esc_html($casttime['endtime']);
66                        }
67                        echo '</span>';
68                    }//--- ループここまで ---
69                }  else {
70                    date_default_timezone_set('Asia/Tokyo');
71                    $today = strtotime(date("Y-m-d", strtotime("today"))); //5時以降の表示
72                    echo '<span class="after5am">';
73
74                    for ($i = 0; $i <= 0; $i++) {//--- ループここから ---
75                        $y = date('D', strtotime('+'.$i.' day', $today));
76                        if ( date('Y-m-d', strtotime('+'.$i.' day', $today)) == $day ) $y = 'target';
77                        echo '';	
78                        if ( $casttime = today_schedule($id, date('Y-m-d', strtotime('+'.$i.' day', $today))) ) {
79                            if ($casttime['starttime'] !== '0') echo esc_html($casttime['starttime']);//入り時間
80                            echo ' - ';
81                            if ($casttime['endtime'] !== '0') echo esc_html($casttime['endtime']);//上がり時間
82                        }
83                        echo '</span>';
84                    } //--- ループここまで ---
85                }
86                ?>
87            </div>
88        </figcaption>
89    </a>
90</div>
日にちは朝の5時に変わるようになっています。

single-cast.php

1<?php get_header(); ?>
2
3<div id="primary" class="content-area">
4
5    <?php while ( have_posts() ) : the_post(); ?>
6
7    <?php get_template_part('content',('cast'));?> //content-cast.phpを呼び出す
8
9    <?php endwhile; // End of the loop. ?>
10
11</div><!-- #primary -->
12
13<?php
14get_sidebar();
15get_footer();

functions.phpに追加

1<?php
2/*** 個人ページに表示するスケジュール ***/
3function singlecalendar($id) {
4	$week = array("日", "月", "火", "水", "木", "金", "土");
5	$today = strtotime(date("Y-m-d", strtotime("+3 hour")));
6	echo '<div class="krc_calendar">';
7	for ($i = 0;$i <= 6;$i++)
8	{
9		$yy = date('w', strtotime('+' . $i . ' day'));
10		$y = date('D', strtotime('+' . $i . ' day', $today));
11		if (date('Y-m-d', strtotime('+' . $i . ' day', $today)) == $day) $y = 'target';
12		echo '<dl><dt class="' . mb_strtolower($y) . '">' . strtoupper(date('n/j(' . $week[$yy] . ')', strtotime('+' . $i . ' day', $today))) . '</dt>';
13		if ($casttime = today_schedule($id, date('Y-m-d', strtotime('+' . $i . ' day', $today)))) //today_schedule()を呼び出して本日の出勤情報の有無を判断
14		{
15			echo '<dd>';
16			if ($casttime['starttime'] !== '0') echo esc_html($casttime['starttime']);
17			echo ' - ';
18			if ($casttime['endtime'] !== '0') echo esc_html($casttime['endtime']);
19			echo '</dd></dl>';
20		}
21		else
22		{
23			echo '<dd>-</dd></dl>';
24		}
25	}
26	echo '</div>';
27}
28 
29/*** 本日の出勤確認 ***/
30function today_schedule($id, $day = '')
31{
32	$day = $day != '' ? $day : date("Y-m-d", strtotime("+3 hour"));
33	$day = htmlentities($day, ENT_QUOTES, 'utf-8');
34	$works = outschedule($day);
35	if ($works && $works != 'rest' && array_key_exists($id, $works))
36	{
37		return $works[$id];
38	}
39	else
40	{
41		return false;
42	}
43}
44 
45/*** スケジュール ***/
46function outschedule($day) { //DBから該当の日付のデータを取得
47	global $wpdb;
48	$table_name = $wpdb->prefix . 'krc_schedules';
49	$schedules = $wpdb->get_var(
50		$wpdb->prepare("SELECT work FROM $table_name WHERE day = %s AND status = %d", $day, 0)
51	);
52	$works = unserialize($schedules);
53	return $works; //配列にして返す
54}
55
56/* ショートコード[scheduleshtml]の関数 */
57function schedulesHtml() {
58	ob_start();
59	$day = isset($_GET["works"]) ? $_GET['works'] : date("Y-m-d");
60	$works = outschedule($day);
61	$len = 6; //+1
62    $week = array("日", "月", "火", "水", "木", "金", "土");
63 
64	echo '<nav class="week_calendar"><ul>';
65	for ($i = 0;$i <= $len;$i++)
66	{
67		$yy = date('w', strtotime('+' . $i . ' day'));
68		$y = date('D', strtotime('+' . $i . ' day'));
69		if (date('Y-m-d', strtotime('+' . $i . ' day')) == $day) $y = 'target';
70		echo '<li class="' . mb_strtolower($y) . ' nav-contents"><a href="' . home_url('/') . '/schedule/?works=' . date('Y-m-d', strtotime('+' . $i . ' day')) . '">' . strtoupper(date('n/j (' . $week[$yy] . ')', strtotime('+' . $i . ' day'))) . '</a></li>';
71	}
72	echo '</ul></nav>';
73	$w = date('w', strtotime($day));
74	// echo '<div class="wp-block-group__inner-container home-block">';
75	echo '<h2>' . date('n/j', strtotime($day));
76	echo '(' . $week[$w] . ')';
77	echo 'の出勤スケジュール</h2>';
78 
79	if (!$works)
80	{
81		//予定がない場合
82		echo '<br>';
83	}
84	else if ($works != 'rest')
85	{
86		echo '<div class="row">';
87		//postid順に配列に入っているのでs_order順にした配列を作る
88		$works_array = array();
89		foreach ($works as $id => $val)
90		{
91			$works_array[$val["s_order"]] = $id;
92		}
93		ksort($works_array);
94		foreach ($works_array as $rder => $id)
95		{
96			$args = array(
97				'post_type' => 'cast',
98				'post__in' => array(
99					$id
100				) ,
101			);
102			query_posts($args);
103			while (have_posts()):
104				the_post();
105				set_query_var('work', $works[$id]);
106				get_template_part('content', ('castschedule'));
107			endwhile;
108			wp_reset_query();
109 
110		}
111		echo '</div>';
112	}
113	else
114	{
115		//休み
116		echo '定休日';
117	}
118	return ob_get_clean();
119}
120add_shortcode('scheduleshtml', 'schedulesHtml'); //schedulesHtml()をショートコード[scheduleshtml]に登録
121 
122 
123/*** TOPページ等に本日出勤キャストを表示 ***/
124/* ショートコード[todayscasthtml]の関数 */
125function todaysCastHtml ($day = '') { //本日の出勤
126	ob_start();
127	date_default_timezone_set('Asia/Tokyo');
128	$time9 =  - 5;//5時に次の日のスケジュールに切り替わる仕様 .$time9.  date_i18n
129	$day = $day != '' ? $day : date("Y-m-d",strtotime("+".$time9." hour"));
130	$works = outschedule($day);
131	addSchedules($works); //addSchedules()を呼び出す
132	return ob_get_clean();
133}
134
135function addSchedules($works) {
136	$schedule = 'schedule';
137	if (!$works) {
138		//予定がない場合
139		echo '<div>更新中</div>';
140	} else if ( $works !='rest' ) {
141		$works_array = array();
142		foreach($works as $id => $val){
143			$works_array[$val["s_order"]] = array(
144			'id'=> $id,
145			'time' => $val
146			);
147		}
148		ksort($works_array);
149		foreach ($works_array as $id => $work) {
150			$args = array(
151			'post_type' => 'cast',
152			'post__in' => array($work['id']),
153			'orderby' => 'post__in'
154			);
155			//$test =
156			query_posts($args);
157			//printR($test);
158		
159			while ( have_posts() ) : the_post();
160			set_query_var( 'schedule', $work['time'] );
161			get_template_part( 'content', 'todaycastlist' ); //content-castlist.phpは用意しておいて下さい。
162			endwhile;
163			wp_reset_query();
164		}
165	}
166	else {
167		//休み
168		echo '<div>本日定休日です</div>';
169	}
170}
171add_shortcode('todayscasthtml', 'todaysCastHtml'); //todaysCastHtml()をショートコード[todayscasthtml]に登録
172 
173 
174/*** 新人キャストショートコード ***/
175function outNewType () {
176	ob_start();
177 
178	$args = array(
179	'post_type' => 'cast',
180	'posts_per_page' => -1,
181	'tax_query' => array(
182		'relation' => 'AND',
183		array(
184			'taxonomy' => 'krc_new',
185			'field' => 'slug',
186			'terms' => "新人",
187		)
188	));
189 
190	query_posts($args);
191	if ( have_posts() ) :
192		while ( have_posts() ) :
193			the_post();
194			get_template_part( 'content', 'castlist' ); //content-castlist.phpは用意しておいて下さい。
195		endwhile;
196	endif;
197 
198	wp_reset_query();
199	return ob_get_clean();
200 
201}
202add_shortcode('newcasthtml', 'outNewType'); //outNewType()をショートコード[newcasthtml]に登録
203 
204 
205/*** 翌日5時までを本日として表示させる ***/
206function today() {
207	date_default_timezone_set('Asia/Tokyo');
208	$today = getdate();
209	if($today['hours'] >= 0 and $today['hours'] < 5) {//0時〜5時の表示
210	echo date('n/j', strtotime('-1 day'));//日付
211	} else {//5時以降の表示
212		echo date('n/j');//日付
213	}
214}
215add_shortcode('today', 'today'); //today()をショートコード[today]に登録
216 
217 
218 
219/*** キャスト一覧をフロントページに表示 ***/
220function castList() {
221$args = array(
222'posts_per_page' => 8, // 表示する投稿数
223'post_type' => 'cast'
224);
225$my_posts = get_posts($args);
226 
227query_posts($args);
228if ( have_posts() ) :
229	while ( have_posts() ) :
230		the_post();
231		get_template_part( 'content', 'castlist' ); //content-castlist.phpは用意しておいて下さい。
232	endwhile;
233endif;
234 
235wp_reset_postdata();
236}
237?>
主に、スケジュールページのショートコード[scheduleshtml]、
本日出勤キャストページのショートコード[todayscasthtml]、[today]、
新人キャストページのショートコード[newcasthtml]の関数を記述しております。

その他

キャスト一覧ページで、デフォルトのページヘッダータイトルは「在籍女性」ですが、プラグインフォルダ内のclass-krc-model-casts.phpで変更できます。

class-krc-model-casts.php 一部変更

1//キャストカスタム投稿作成
2public function create_cast_post_type () {
3	$labels = array(
4	    //'name'                  => __( '在籍女性', 'krc' ),
5	      'name'                  => __( 'キャスト一覧', 'krc' ),

krc-cast-managerを組み込んでできたサイト

最低限装飾したデモサイトを作ってみました。

キャスト一覧ページ( archive-cast.php )

新人キャストページ
新人キャストページ
キャスト一覧ページは「サイトURL/cast」にあります。
content-castlist.phpから引っ張ってきてarchive-cast.phpで表示させています。

スケジュールページ( single-cast.php )

スケジュールはページ下部に表示されます

個別キャスト
個別キャスト
スケジュールページは固定ページでページを作っています。
そこにショートコードで[scheduleshtml]でスケジュールを呼び出しています。

個別キャストページ( [scheduleshtml] )

キャスト情報はページ上部に表示されます

個別キャスト
個別キャスト
content-cast.phpから引っ張ってきてsingle-cast.phpで表示させています。
下のスケジュールは、functions.phpで作った関数を呼び出しています。
キャストの画像はSlickスライダー使って表示させています。

本日出勤キャスト表示( [todayscasthtml] )

本日出勤
本日出勤
functions.phpで作ったショートコードを呼び出しています。
トップページなど好きなところに表示させます。

新人キャスト表示( [newcasthtml] )

キャスト一覧ページ
functions.phpで作ったショートコードを呼び出しています。
トップページなど好きなところに表示させます。

まとめ

以上がWordPressのテンプレート構造、プラグイン「krc-cast-manager」の導入方法の説明になります。

無料在席キャスト管理システム「krc-cast-manager」を使いこなせると、単にブログサイトを作るだけではなく、スタッフ管理やちょっとしたセミナーのスケジュール管理にも応用できるのではないでしょうか。

今回は、プラグインを動かすまでに留めたため、レイアウトはBootstrapを使ってざっくりと指定しております。

機会があれば、ElementorやDiviなどのNoCodeツールと連携してリッチなデザインにしてみたいと思います。
ABOUT ME
WEBさん
WEBさん
WordPressの不具合をなおす人
あなたのお仕事をする時間を使ってITに関することを調べたり、トライしてみたりして、それでもうまくいかない。そんなことはありませんか? WEB先案内をご利用いただくと、困ったときにITの顧問としてあなたのITに関するお悩みにお答えし、サポートを行うことができます。
記事URLをコピーしました