【プラグイン】無料在席キャスト管理システム krc-cast-manager を使ってみた
WEB先案内
先日、夜のお店のWordPressサイトをメンテナンスする機会がありました。 サイトには「krc-cast-manager」という無料在席キャスト管理のプラグインがインストールされており、その不具合を修復するという内容でした。 ココナラでも2回ほどこのプラグインに関するご相談をいただいたことがあります。 実は、このプラグインは無料とは思えないくらい優秀で、夜のお店の界隈では有名なプラグインのようです。 WEB先案内の性格上、ちょっとクセがあるけど便利でマニアックなプラグインに目がないので、頑張って検証環境で構築してみました。 ところが、このプラグインはインストールするだけでは動きません。(考えが浅はかでした・・・) 前提知識として、テンプレートの理解とPHPコーディングスキルが必要です。 さらっといってしまいましたが、これだけでもハードルが高いと思います。 なので、まずは、テンプレートを理解するため、テーマテンプレートとモジュールテンプレートを簡単に説明します。 次に、プラグインとテーマを連携するため、テンプレート作成とショートコード関数を作ります。 最後に実際に構築したデモサイトの画面コピーをご覧いただきます。 それでは、はじめます! ٩( ‘ω’ )و ※WordPress初学者には難易度の高い内容となっております(>人<;)
テンプレート構造
テーマテンプレート
WordPress がURLの要求に従って読み込むファイルを「テーマテンプレート」といいます。 テーマの中には、テーマテンプレートだけでなく、他のスタイルシート・画像・ファイルも含めることができます。 ただ、以下のファイルが WordPress にとって特別な意味を持つことは覚えておいてください。 追加情報はテンプレート階層をご覧ください。
No | ファイル名 | 説明 |
---|---|---|
1 | style.css | メインのスタイルシート テーマにはこのファイルが必須で、テーマのヘッダ情報を含まなければなりません。 |
2 | rtl.css | RTL スタイルシート ウェブサイトのテキスト方向が右から左の場合、このファイルが自動的に適用されます。 RTL スタイルシートは the RTLer プラグインを使って生成することもできます。 |
3 | index.php | メインテンプレート (親テーマのテンプレートを利用するのではなく) このテーマ自身のテンプレートを設けるなら index.php は必須。 |
4 | comments.php | コメントテンプレート |
5 | front-page.php | フロントページテンプレート home.phpとfront.phpが両方存在した場合は、front-page.phpがフロントページ表示用のテンプレートとして使われます。 |
6 | home.php | ホームページテンプレート フロントページの表示(にデフォルトとして設定されている最新の投稿)に使われる。 固定ページをフロントページとして設定した場合、指定した固定ページがフロントページの表示に使われます。 |
7 | single.php | 個別投稿テンプレート ひとつの投稿が要求 (クエリ) されたときに使用。 このクエリテンプレートが存在しないときは index.php が使われる。 この他のクエリテンプレートも同様。 |
8 | single-<post-type>.php | カスタム投稿タイプの個別投稿が要求 (クエリ) されたときに使われるテンプレート 例えば books というカスタム投稿タイプを個別表示するためには single-books.php が使われる。 |
9 | page.php | 固定ページテンプレート 特定の固定ページが要求されたときに使用。 |
10 | category.php | カテゴリテンプレート あるカテゴリが要求されたときに使用。 |
11 | tag.php | タグテンプレート タグが要求されたときに使用。 |
12 | taxonomy.php | タクソノミーテンプレート カスタム分類内の個別項目が要求されたときに使用。 |
13 | author.php | 作成者テンプレート 作成者が要求されたときに使用。 |
14 | date.php | 日付別テンプレート ある日付または時刻が要求されたときに使用。年、月、日、時、分、秒。 |
15 | archive.php | アーカイブテンプレート あるカテゴリ、作成者、日付が要求されたときに使用。 各クエリの種類に対応する category.php、author.php、date.php がそれぞれ存在する場合は、 そのクエリに対してアーカイブテンプレートは無効となる。 |
16 | search.php | 検索結果テンプレート ある検索が実行されたときに使用。 |
17 | attachment.php | 添付ファイルテンプレート 特定の添付ファイルを個別表示するときに使用。 |
18 | image.php | 添付画像ファイルテンプレート 特定の添付画像ファイルを個別表示するときに使用。存在しない場合は attachment.php が使用される。 |
19 | 404.php | 404 Not Found テンプレート WordPress が要求に合う投稿やページを見つけられなかったときに使用。_ |
20 | function.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 | ファイル名 | 説明 |
---|---|---|
1 | header.php | ヘッダーテンプレート ヘッダー部分で読み込まれる。 |
2 | footer.php | フッターテンプレート フッター部分で読み込まれる。 |
3 | sidebar.php | サイドバーテンプレート サイドバー部分で読み込まれる。 |
4 | searchform.php | 検索フォームテンプレート 検索フォームの表示。 |
5 | comments.php | コメントテンプレート comments_template()で読み込まれる。 |
6 | content-page.php | 固定ページ内コンテンツテンプレート 固定ページ内コンテンツの表示。page.phpにおいてget_template_part('content','page')で読み込まれる。 このファイルが存在しない場合、content.phpが読み込まれる。 |
7 | content-single.php | 個別投稿ページ内コンテンツテンプレート 個別投稿ページでのコンテンツの表示。 single.phpにおいてget_template_part('content','single')で読み込まれる。 このファイルが存在しない場合、content.phpが読み込まれる。 |
8 | content.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
<?php
/**
* The template for displaying archive pages
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/
*
* @package zakra
*
* Template Name: キャスト一覧
*/
get_header(); ?>
<div id="primary" class="content-area">
<?php echo apply_filters( 'zakra_after_primary_start_filter', false ); // WPCS: XSS OK. ?>
<?php if ( have_posts() ) : ?>
<header class="page-header">
<?php
zakra_entry_title();
the_archive_description( '<div class="archive-description">', '</div>' );
?>
</header><!-- .page-header -->
<?php do_action( 'zakra_before_posts_the_loop' ); ?>
<div class="row">
<?php
/* Start the Loop */
while ( have_posts() ) :
the_post();
get_template_part('content',('castlist')); // content-castlist.phpを呼び出す
endwhile;
?>
</div>
<?php
do_action( 'zakra_after_posts_the_loop' );
else :
get_template_part( 'template-parts/content', 'none' );
endif;
?>
<?php echo apply_filters( 'zakra_after_primary_end_filter', false ); // // WPCS: XSS OK. ?>
</div><!-- #primary -->
<?php
get_sidebar();
get_footer();
PHPcontent-cast.php
/*
* プラグインで設定した
*「カスタムフィールド」「画像」「タイプ管理」「グレード管理」「新人区分」
* を各変数に格納します
*/
<?php
$cast_fields = get_post_custom(); //カスタムフィールドを全部取得
$cast_screens = json_decode($cast_fields['_krc_cast_screens'][0]); //画像配列を用意
$cast_type_terms = get_the_terms($post->ID, 'krc_type'); //タイプタクソノミーを取得
$cast_grade_terms = get_the_terms($post->ID, 'krc_grade'); //グレードタクソノミーを取得
$cast_new_terms = get_the_terms($post->ID, 'krc_new'); //新人区分タクソノミーを取得
?>
/*
* ブラウザがレンダリングできるようにHTMLに組み込みます
*/
<div class="cast">
<!-- スライドショー -->
<div class="cast-photo">
<?php if(empty($cast_screens)): ?>
<img src="<?php echo get_stylesheet_directory_uri(); ?>/images/no.jpg" alt="<?php the_title(); ?>">
<?php else: ?>
<div class="slider">
<ul class="top-slider">
<?php foreach($cast_screens as $index => $value): ?>
<li>
<a href="<?php echo $value; ?>" rel="gallery">
<img src="<?php echo $value; ?>" alt="<?php the_title(); ?> 写真 <?php echo ($index+1); ?>">
</a>
</li>
<?php endforeach; ?>
</ul>
<ul class="thumbnail">
<?php foreach($cast_screens as $value): ?>
<li alt="<?php the_title(); ?>">
<img src="<?php echo $value; ?>" alt="<?php the_title(); ?>">
</li>
<?php endforeach; ?>
</ul>
</div>
<?php if( empty($cast_new_terms) ): ?>
<?php else: ?>
<span class="new_cast badge">New</span>
<?php endif;?>
<?php endif; ?>
</div>
<div class="cast-profile">
<div class="cast-meta">
<figure class="wp-block-table is-style-stripes">
<table>
<tbody>
<tr>
<td>名前</td>
<td>
<?php echo esc_html($cast_fields['_krc_name'][0]);?>
</td>
</tr>
<tr>
<td>年齢</<?php echo esc_html($cast_fields['_krc_name'][0]);?>td>
<td>
<?php if(empty($cast_fields['_krc_age'][0])): ?>- <?php else: ?>
<?php echo esc_html($cast_fields['_krc_age'][0]);?>
<?php endif; ?>歳</td>
</tr>
<tr>
<td>身長</td>
<td>
<?php if(empty($cast_fields['_krc_tall'][0])): ?>- <?php else: ?>
<?php echo esc_html($cast_fields['_krc_tall'][0]);?>
<?php endif; ?>
cm</td>
</tr>
<tr>
<td>スリーサイズ</td>
<td>
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; ?>
)
W:
<?php if(empty($cast_fields['_krc_waist'][0])): ?>- <?php else: ?>
<?php echo esc_html($cast_fields['_krc_waist'][0]);?>
<?php endif; ?>
H:
<?php if(empty($cast_fields['_krc_hips'][0])): ?>- <?php else: ?>
<?php echo esc_html($cast_fields['_krc_hips'][0]);?>
<?php endif; ?>
</td>
</tr>
</tbody>
</table>
</figure>
</div>
<h2 class="sub-section">コメント</h2>
<div class="cast-pr"><?php the_content(); ?></div>
</div>
</div>
<div class="cast-schedule">
<h2 class="sub-section">スケジュール</h2>
<?php singlecalendar(get_the_ID()); ?> //function.phpのsinglecalender()を呼び出す
</div>
<div class="wp-block-button is-style-fill">
<a href="/schedule" class="wp-block-button__link">出勤情報はこちら</a>
</div>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.0.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css" />
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
/*
* キャスト画像をスライド表示するjQuery
*/
<script type="text/javascript">
jQuery(function($) {
$('.top-slider').slick({
slidesToShow: 1,
slidesToScroll: 1,
arrows: false,
fade: true,
asNavFor: '.thumbnail'
});
$('.thumbnail').slick({
slidesToShow: 3,
slidesToScroll: 1,
asNavFor: '.top-slider',
arrows: false,
dots: true,
centerMode: true,
focusOnSelect: true
});
});
</script>
PHPキャストの画像はSlickスライダー使って表示させています。 キャストの画像を設定していない場合に表示させる画像を、子テーマ内の「imagesフォルダ」に「no.jpg」という名前で保存しておいてください。
content-castlist.php
/*
* プラグインで設定した
*「カスタムフィールド」「画像」「タイプ管理」「グレード管理」「新人区分」
* を各変数に格納します
*/
<?php
$cast_fields = get_post_custom(); //カスタムフィールドを全部取得
$cast_screens = json_decode($cast_fields['_krc_cast_screens'][0]); //画像配列を用意
$cast_type_terms = get_the_terms($post->ID, 'krc_type'); //タイプタクソノミーを取得
$cast_grade_terms = get_the_terms($post->ID, 'krc_grade'); //グレードタクソノミーを取得
$cast_new_terms = get_the_terms($post->ID, 'krc_new'); //新人区分タクソノミーを取得
?>
/*
* ブラウザがレンダリングできるようにHTMLに組み込みます
*/
<div class="cast">
<a href="<?php the_permalink();?>">
<figure class="cast-photo">
<?php if( empty($cast_screens) ): ?>
<img src="<?php echo get_stylesheet_directory_uri();?>/images/no.jpg" alt="<?php the_title();?>">
<?php else: ?>
<img src="<?php echo esc_url($cast_screens[0]);?>" alt="<?php the_title();?>">
<?php endif;?>
<?php if( empty($cast_new_terms) ): ?><?php else: ?>
<span class="cast-new badge">New</span>
<?php endif;?>
<?php if ( $fncName != 'todaysCastHtml'): ?>
<?php if (today_schedule(get_the_ID())):?>
<span class="todays-cast badge">本日出勤</span>
<?php endif;?>
<?php endif;?>
</figure>
<figcaption class="text-center">
<div class="cast-name">
<?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; ?>歳)
</div>
<div class="cast-size">
T:<?php if(empty($cast_fields['_krc_tall'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_tall'][0]);?>
<?php endif; ?>
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; ?>)
W:<?php if(empty($cast_fields['_krc_waist'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_waist'][0]);?>
<?php endif; ?>
H:<?php if(empty($cast_fields['_krc_hips'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_hips'][0]);?>
<?php endif; ?>
</div>
</figcaption>
</a>
</div>
PHP新人キャストには「NEW」、 本日出勤のキャストには「本日出勤」と表示されるようにしています。
content-castschedule.php
/*
* プラグインで設定した
*「カスタムフィールド」「画像」「タイプ管理」「グレード管理」「新人区分」
* を各変数に格納します
*/
<?php
$cast_fields = get_post_custom(); //カスタムフィールドを全部取得
$cast_screens = json_decode($cast_fields['_krc_cast_screens'][0]); //画像配列を用意
$cast_type_terms = get_the_terms($post->ID, 'krc_type'); //タイプタクソノミーを取得
$cast_grade_terms = get_the_terms($post->ID, 'krc_grade'); //グレードタクソノミーを取得
$cast_new_terms = get_the_terms($post->ID, 'krc_new'); //新人区分タクソノミーを取得
?>
/*
* ブラウザがレンダリングできるようにHTMLに組み込みます
*/
<div class="cast">
<a href="<?php the_permalink();?>">
<figure class="cast-photo">
<?php if( empty($cast_screens) ): ?>
<img src="<?php echo get_stylesheet_directory_uri(); ?>/images/no.jpg" alt="<?php the_title(); ?>">
<?php else: ?>
<img src="<?php echo $cast_screens[0]; ?>" alt="<?php the_title();?>">
<?php endif;?>
<?php if( empty($cast_new_terms) ): ?><?php else: ?>
<span class="cast-new badge">New</span>
<?php endif;?>
</figure>
<figcaption>
<div class="cast-name">
<?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; ?>歳)
</div>
<div class="cast-size">
T:<?php if(empty($cast_fields['_krc_tall'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_tall'][0]);?>
<?php endif; ?>
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; ?>)
W:<?php if(empty($cast_fields['_krc_waist'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_waist'][0]);?>
<?php endif; ?>
H:<?php if(empty($cast_fields['_krc_hips'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_hips'][0]);?>
<?php endif; ?>
</div>
<div class="worktime">
<i class="far fa-clock"></i>
<?php
if ($work['starttime'] !== '0') echo esc_html($work['starttime']); ?>
-
<?php if ($work['endtime'] !== '0') echo esc_html($work['endtime']);
?>
</div>
</figcaption>
</a>
</div>
PHPcontent-todaycastlist.php
/*
* プラグインで設定した
*「カスタムフィールド」「画像」「タイプ管理」「グレード管理」「新人区分」
* を各変数に格納します
*/
<?php
$cast_fields = get_post_custom(); //カスタムフィールドを全部取得
$cast_screens = json_decode($cast_fields['_krc_cast_screens'][0]); //画像配列を用意
$cast_type_terms = get_the_terms($post->ID, 'krc_type'); //タイプタクソノミーを取得
$cast_grade_terms = get_the_terms($post->ID, 'krc_grade'); //グレードタクソノミーを取得
$cast_new_terms = get_the_terms($post->ID, 'krc_new'); //新人区分タクソノミーを取得
?>
/*
* ブラウザがレンダリングできるようにHTMLに組み込みます
*/
<div class="cast">
<a href="<?php the_permalink();?>">
<figure class="cast-photo">
<?php if( empty($cast_screens) ): ?>
<img src="<?php echo get_stylesheet_directory_uri();?>/images/no.jpg" alt="<?php the_title();?>">
<?php else: ?>
<img src="<?php echo esc_url($cast_screens[0]);?>" alt="<?php the_title();?>">
<?php endif;?>
<?php if( empty($cast_new_terms) ): ?><?php else: ?>
<span class="cast-new badge">New</span>
<?php endif;?>
</figure>
<figcaption>
<div class="cast-name">
<?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; ?>歳)
</div>
<div class="cast-size">
T:<?php if(empty($cast_fields['_krc_tall'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_tall'][0]);?>
<?php endif; ?>
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; ?>)
W:<?php if(empty($cast_fields['_krc_waist'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_waist'][0]);?>
<?php endif; ?>
H:<?php if(empty($cast_fields['_krc_hips'][0])): ?>- <?php else: ?><?php echo esc_html($cast_fields['_krc_hips'][0]);?>
<?php endif; ?>
</div>
<!-- 出勤時間を表示 -->
<div class="worktime">
<i class="far fa-clock"></i>
<?php
date_default_timezone_set('Asia/Tokyo');
$today = getdate();
if($today['hours'] >= 0 and $today['hours'] < 5) {//0時〜5時の表示
$today = strtotime(date("Y-m-d", strtotime("today")));
echo '<span class="before5am">';
for ($i = 0; $i <= 0; $i++) {//--- ループここから ---
$y = date('D', strtotime('+'.$i.'-1 day', $today));
if ( date('Y-m-d', strtotime('+'.$i.'-1 day', $today)) == $day ) $y = 'target';
echo '';
if ( $casttime = today_schedule($id, date('Y-m-d', strtotime('+'.$i.'-1 day', $today))) ) {
if ($casttime['starttime'] !== '0') echo esc_html($casttime['starttime']);
echo ' - ';
if ($casttime['endtime'] !== '0') echo esc_html($casttime['endtime']);
}
echo '</span>';
}//--- ループここまで ---
} else {
date_default_timezone_set('Asia/Tokyo');
$today = strtotime(date("Y-m-d", strtotime("today"))); //5時以降の表示
echo '<span class="after5am">';
for ($i = 0; $i <= 0; $i++) {//--- ループここから ---
$y = date('D', strtotime('+'.$i.' day', $today));
if ( date('Y-m-d', strtotime('+'.$i.' day', $today)) == $day ) $y = 'target';
echo '';
if ( $casttime = today_schedule($id, date('Y-m-d', strtotime('+'.$i.' day', $today))) ) {
if ($casttime['starttime'] !== '0') echo esc_html($casttime['starttime']);//入り時間
echo ' - ';
if ($casttime['endtime'] !== '0') echo esc_html($casttime['endtime']);//上がり時間
}
echo '</span>';
} //--- ループここまで ---
}
?>
</div>
</figcaption>
</a>
</div>
PHP日にちは朝の5時に変わるようになっています。
single-cast.php
<?php get_header(); ?>
<div id="primary" class="content-area">
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part('content',('cast'));?> //content-cast.phpを呼び出す
<?php endwhile; // End of the loop. ?>
</div><!-- #primary -->
<?php
get_sidebar();
get_footer();
PHPfunctions.phpに追加
<?php
/*** 個人ページに表示するスケジュール ***/
function singlecalendar($id) {
$week = array("日", "月", "火", "水", "木", "金", "土");
$today = strtotime(date("Y-m-d", strtotime("+3 hour")));
echo '<div class="krc_calendar">';
for ($i = 0;$i <= 6;$i++)
{
$yy = date('w', strtotime('+' . $i . ' day'));
$y = date('D', strtotime('+' . $i . ' day', $today));
if (date('Y-m-d', strtotime('+' . $i . ' day', $today)) == $day) $y = 'target';
echo '<dl><dt class="' . mb_strtolower($y) . '">' . strtoupper(date('n/j(' . $week[$yy] . ')', strtotime('+' . $i . ' day', $today))) . '</dt>';
if ($casttime = today_schedule($id, date('Y-m-d', strtotime('+' . $i . ' day', $today)))) //today_schedule()を呼び出して本日の出勤情報の有無を判断
{
echo '<dd>';
if ($casttime['starttime'] !== '0') echo esc_html($casttime['starttime']);
echo ' - ';
if ($casttime['endtime'] !== '0') echo esc_html($casttime['endtime']);
echo '</dd></dl>';
}
else
{
echo '<dd>-</dd></dl>';
}
}
echo '</div>';
}
/*** 本日の出勤確認 ***/
function today_schedule($id, $day = '')
{
$day = $day != '' ? $day : date("Y-m-d", strtotime("+3 hour"));
$day = htmlentities($day, ENT_QUOTES, 'utf-8');
$works = outschedule($day);
if ($works && $works != 'rest' && array_key_exists($id, $works))
{
return $works[$id];
}
else
{
return false;
}
}
/*** スケジュール ***/
function outschedule($day) { //DBから該当の日付のデータを取得
global $wpdb;
$table_name = $wpdb->prefix . 'krc_schedules';
$schedules = $wpdb->get_var(
$wpdb->prepare("SELECT work FROM $table_name WHERE day = %s AND status = %d", $day, 0)
);
$works = unserialize($schedules);
return $works; //配列にして返す
}
/* ショートコード[scheduleshtml]の関数 */
function schedulesHtml() {
ob_start();
$day = isset($_GET["works"]) ? $_GET['works'] : date("Y-m-d");
$works = outschedule($day);
$len = 6; //+1
$week = array("日", "月", "火", "水", "木", "金", "土");
echo '<nav class="week_calendar"><ul>';
for ($i = 0;$i <= $len;$i++)
{
$yy = date('w', strtotime('+' . $i . ' day'));
$y = date('D', strtotime('+' . $i . ' day'));
if (date('Y-m-d', strtotime('+' . $i . ' day')) == $day) $y = 'target';
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>';
}
echo '</ul></nav>';
$w = date('w', strtotime($day));
// echo '<div class="wp-block-group__inner-container home-block">';
echo '<h2>' . date('n/j', strtotime($day));
echo '(' . $week[$w] . ')';
echo 'の出勤スケジュール</h2>';
if (!$works)
{
//予定がない場合
echo '<br>';
}
else if ($works != 'rest')
{
echo '<div class="row">';
//postid順に配列に入っているのでs_order順にした配列を作る
$works_array = array();
foreach ($works as $id => $val)
{
$works_array[$val["s_order"]] = $id;
}
ksort($works_array);
foreach ($works_array as $rder => $id)
{
$args = array(
'post_type' => 'cast',
'post__in' => array(
$id
) ,
);
query_posts($args);
while (have_posts()):
the_post();
set_query_var('work', $works[$id]);
get_template_part('content', ('castschedule'));
endwhile;
wp_reset_query();
}
echo '</div>';
}
else
{
//休み
echo '定休日';
}
return ob_get_clean();
}
add_shortcode('scheduleshtml', 'schedulesHtml'); //schedulesHtml()をショートコード[scheduleshtml]に登録
/*** TOPページ等に本日出勤キャストを表示 ***/
/* ショートコード[todayscasthtml]の関数 */
function todaysCastHtml ($day = '') { //本日の出勤
ob_start();
date_default_timezone_set('Asia/Tokyo');
$time9 = - 5;//5時に次の日のスケジュールに切り替わる仕様 .$time9. date_i18n
$day = $day != '' ? $day : date("Y-m-d",strtotime("+".$time9." hour"));
$works = outschedule($day);
addSchedules($works); //addSchedules()を呼び出す
return ob_get_clean();
}
function addSchedules($works) {
$schedule = 'schedule';
if (!$works) {
//予定がない場合
echo '<div>更新中</div>';
} else if ( $works !='rest' ) {
$works_array = array();
foreach($works as $id => $val){
$works_array[$val["s_order"]] = array(
'id'=> $id,
'time' => $val
);
}
ksort($works_array);
foreach ($works_array as $id => $work) {
$args = array(
'post_type' => 'cast',
'post__in' => array($work['id']),
'orderby' => 'post__in'
);
//$test =
query_posts($args);
//printR($test);
while ( have_posts() ) : the_post();
set_query_var( 'schedule', $work['time'] );
get_template_part( 'content', 'todaycastlist' ); //content-castlist.phpは用意しておいて下さい。
endwhile;
wp_reset_query();
}
}
else {
//休み
echo '<div>本日定休日です</div>';
}
}
add_shortcode('todayscasthtml', 'todaysCastHtml'); //todaysCastHtml()をショートコード[todayscasthtml]に登録
/*** 新人キャストショートコード ***/
function outNewType () {
ob_start();
$args = array(
'post_type' => 'cast',
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'krc_new',
'field' => 'slug',
'terms' => "新人",
)
));
query_posts($args);
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
get_template_part( 'content', 'castlist' ); //content-castlist.phpは用意しておいて下さい。
endwhile;
endif;
wp_reset_query();
return ob_get_clean();
}
add_shortcode('newcasthtml', 'outNewType'); //outNewType()をショートコード[newcasthtml]に登録
/*** 翌日5時までを本日として表示させる ***/
function today() {
date_default_timezone_set('Asia/Tokyo');
$today = getdate();
if($today['hours'] >= 0 and $today['hours'] < 5) {//0時〜5時の表示
echo date('n/j', strtotime('-1 day'));//日付
} else {//5時以降の表示
echo date('n/j');//日付
}
}
add_shortcode('today', 'today'); //today()をショートコード[today]に登録
/*** キャスト一覧をフロントページに表示 ***/
function castList() {
$args = array(
'posts_per_page' => 8, // 表示する投稿数
'post_type' => 'cast'
);
$my_posts = get_posts($args);
query_posts($args);
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
get_template_part( 'content', 'castlist' ); //content-castlist.phpは用意しておいて下さい。
endwhile;
endif;
wp_reset_postdata();
}
?>
PHP主に、スケジュールページのショートコード[scheduleshtml]、 本日出勤キャストページのショートコード[todayscasthtml]、[today]、 新人キャストページのショートコード[newcasthtml]の関数を記述しております。
その他
キャスト一覧ページで、デフォルトのページヘッダータイトルは「在籍女性」ですが、プラグインフォルダ内のclass-krc-model-casts.phpで変更できます。
class-krc-model-casts.php 一部変更
<?php
//キャストカスタム投稿作成
public function create_cast_post_type () {
$labels = array(
//'name' => __( '在籍女性', 'krc' ),
'name' => __( 'キャスト一覧', 'krc' ),
PHPkrc-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