WordPressあれこれ

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

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

※本記事はTwitter API v2の動作テストになります

先日、夜のお店の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-cast-manager

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

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

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

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

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

使い方

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

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

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

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

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

追加するファイル

準備するファイルは下記の7つです。
※()内はテンプレートの分類です

 

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();

 

content-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>
  • キャストの画像は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>

新人キャストには「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>

 

content-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>

日にちは朝の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();

 

functions.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();
}

主に、スケジュールページのショートコード[scheduleshtml]、
本日出勤キャストページのショートコード[todayscasthtml]、[today]、
新人キャストページのショートコード[newcasthtml]の関数を記述しております。

その他

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

class-krc-model-casts.php 一部変更
//キャストカスタム投稿作成
public function create_cast_post_type () {
	$labels = array(
	    //'name'                  => __( '在籍女性', 'krc' ),
	      '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ツールと連携してリッチなデザインにしてみたいと思います。

WordPressの保守運用ならWEB先案内!

WordPressでのお困りの不具合等を復旧致します!

ココナラでも提供しております。ココナラだけでも、多数のご依頼を頂いています。またココナラではうれしい五つ星評価(最高評価)も頂いております。

WordPressの作業代行

お見積もりも、もちろん無料です。

日祝・時間を問わず対応しております。お気軽にご相談ください。

こんな不具合を解消しています。

下記のようなエラー復旧のご依頼を頂いています。

    • 『WordPressにログインできない』
    • 『ユーザー名、パスワードがわからなくなった』
    • 『ワードプレスを更新したらおかしくなった』
    • 『XXXX年間ビジターアンケートが表示された』
    • 『ログインしようとしたら画面が真っ白(表示されなくなった)』
    • 『サイトによくわからない文字が表示されている』
    • 『400、500などのエラー表示が出ている』
    • 『ウィジェットやバーが表示されない』
    • 『ページが真っ白、エラーページが表示される』
    • 『プラグインが動かない』
    • 『403エラーが出て、サイトが見れなくなった』
    • 『ホームページが改ざんされてしまった』
    • 『不正なアクセスの検知をした旨のメールが届いた…』
    • 『Fatal error: Uncaught Error:
      Call to undefined function wp_unregister_GLOBALS() 』に関するエラー
    • 『作業はやるので代わりに調べて欲しい』
    • 『調べた内容は本当にできる?』
    • 『詳しい人のアドバイスが欲しいだけ』
    • 『WordPressを始めてみたけどこの後どうすればいいの?』
    • 『インストールしたテーマの使い方がわからない…』
    • 『外観>カスタマイズ』で設定できる内容
    • 『ERR_TOO_MANY_REDIRECTS』に関するエラー
    • 『WordPressのバージョンを上げたらおかしくなった』
    • 『テーマを更新したらデザインが崩れてしまった』
    • 『サーバーを移行したら表示がおかしくなった』
    • 『phpのバージョンを上げたらおかしくなった』
    • 『画像をメディアにアップロードできない』
    • 『サイト内の画像がすべて表示されなくなった』
    • 『ドメインを変更したら表示がおかしくなった』
    • 『サーバー移管SSL化(https)』
    • 『他のブログからの引っ越し(アメーバブログ・他のWordPress等)』
    • 『用途に応じたサーバー選び』

    その他『とにかく助けて欲しい!』など、お気軽にお問い合わせ下さい

    どのようなエラーでも復旧可能?

    下記3点のケースを除けば基本的に復旧は可能です。 復旧出来ない可能性のあるケース

    • 元データ自体が無くなってしまっている
    • サイトを改ざんされてり内部ファイルを書き換えられたり削除されている
    • データを誤って削除してしまい、バックアップが無い場合

     

    バックアップをお持ちではなくともサーバー側で自動的にバックアップを取っている場合があり、復旧出来ることもあります。諦めずまずはお問い合わせ下さい。

    お問い合わせ

    「お見積もり無料です!」

    費用は作業完了後にご納得の上でのお支払です。

    作業の流れ(お見積もり)

    • ご連絡頂く
    • 詳細をお聞きする
    • ログイン情報を頂く
    • サーバー・サイトにログインして状況を確認
    • お見積もり金額の提示
    • 依頼頂くかキャンセルされるかご判断下さい。(ここでキャンセルも可)
    • ご依頼確定となれば作業開始
    • 作業完了
    • サイトの確認をして頂く(問題ないようでしたらお支払いに進む)
    • お支払いのご案内(メールにてご請求の案内)
    • ご依頼・作業終了となります。

    WordPress保守管理します!

    WordPress保守管理(月額)サービスも行っております。

    WEB先案内
    WEB先案内があなたの悩みを解決します!
    お問い合わせ
    WEB先案内があなたの悩みを解決します!
    お問い合わせ