常時SSL化に失敗してログインできない時の対処法
WEB先案内
WEB先案内 ITブログ
2023-05-07
ショートコード[todayscasthtml]の不具合を解消するPHPコードを追記しました。
先日、夜のお店の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 ファイルがあれば、ページの生成にはこのテンプレートが使われます。
テーマでは、オプションとして、テーマのサブディレクトリ内に functions.php というファイル名で「関数ファイル」を置くことができます。 このファイルは基本的にプラグインのような動作をし、現在使っているテーマ内に存在していれば、(管理画面とサイト表示の両方で)自動的に WordPress の初期化中に読み込まれます。
同じ関数が「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') で読み込まれる。 |
HTMLファイルの宣言文からヘッダーエリアに使用するファイルとして、『header.php』があります。 どこの領域までをヘッダーにするかは制作者の判断になりますが、例えばgoogleのようにロゴをイベント毎に変えたかったり、ヘッダーの装飾を変えたかったりする際には、HTML宣言文からid=”header”要素までを「header.php」内にすることによって、このファイルを修正することによってどのカテゴリー、固定ページを一括で変更することができます。 「header.php」を呼び出すWordPressのテンプレートタグは『<?php get_header(); ?>』となります。
ページ下部のフッターエリアからHTMLの閉じタグまでの最後のエリアを使用するファイルとして、『footer.php』があります。 コピーライトのみのような場合やフッターにも情報を多く入れる場合など、ページのフッター情報を一元管理する際には、id=”footer”要素とHTMLの終了タグを「footer.php」内にすることによって、このファイルを修正することによってどのカテゴリー、固定ページを一括で変更することができます。 「footer.php」を呼び出すWordPressのテンプレートタグは『<?php get_footer(); ?>』となります。
ブログや通常サイトなどの2カラムのサイトで、サイドの領域を使用するファイルとして『sidebar.php』があります。 メインコンテンツのサイドにある領域を一元管理にする際には、id=”sidebar”要素などを「sidebar.php」内に設定します。こうすることによってどのカテゴリー、固定ページを一括で変更することができます。 「sidebar.php」を呼び出すWordPressのテンプレートタグは『<?php get_sidebar(); ?>』となります。 またheader、footer、sidebarなどがありますが、必ずしもheaderだからヘッダーエリアしか使えないということはなく、分かりやすさのために命名されているものと思ってください。 テンプレートファイルだけでページを分けてしまうと共通部分の修正作業を個別に行わなければいけなるのでサイト全体を考える際に各要素のモジュール化を意識するとよいでしょう。
ページ内にサイト内検索のフォームなどを入れる際に用意されているモジュールテンプレートとして「searchform.php」があります。 よく見るのは、サイトのヘッダーエリアなどにあるものです。 検索結果で見つからない場合などに、「ページがみつかりませんでした」のメッセージの下に呼び出すことで、ユーザーがわざわざ上にいかなくてもすぐに別のキーワードなどで探せるので便利です。 「searchform.php」を呼び出すWordPressのテンプレートタグは『<?php get_search_form(); ?>』となります。
通常サイトではあまりないかもしれませんが、コメントエリアのコードをまとめるものとして「comments.php」があります。「comments.php」を呼び出すWordPressのテンプレートタグは『<?php get_comments_template(); ?>』となります。 ここまでの5つが名前が決まっているモジュールテンプレートファイルとなります。
kurubusi.netさんが無料で公開しているワードプレスのプラグインです。 風俗サイト用:無料在席キャスト管理WordPressプラグイン 風俗のサイト用に作られたみたいですが、それ以外にもスタッフ管理などにも使えたりと色々重宝しそうです。 繰り返しますが、プラグインをインストールすればすぐに使えるというわけではなく、ある程度自分でコードを書いたり設定したりしないといけません。 具体的には、テーマテンプレート一覧 と モジュールテンプレート一覧 の赤色で強調したテンプレートを主に作っていきます。 後ほど説明するPHPコードを読んで分からなくなったら、戻って読み直してください。(WEB先案内は何回も読んでやっと理解しました(^◇^;))
kurubusi.netさんは別のページでこのプラグインの表示のさせ方を公開してくれています。 他にもこのkrc-cast-managerを使い、そのデモサイトやソースコードを書いてくれているサイトがいくつかあったので、そちらも参考になると思います。 印象としては、重要な部分が割愛されているため上級者向けの説明だと思います(^◇^;) まずは上記のkurubusi.netさんのサイトから zipファイル をダウンロード。 ファイルの名前を「krc-cast-manager-master」から「krc-cast-manager」へ変更し、ワードプレスのプラグインに追加します。
準備するファイルは下記の7つです。 ※()内はテンプレートの分類です
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();
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.phpのsinglecalender()を呼び出す
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」という名前で保存しておいてください。
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」、 本日出勤のキャストには「本日出勤」と表示されるようにしています。
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>
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時に変わるようになっています。
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();
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で変更できます。
1//キャストカスタム投稿作成
2public function create_cast_post_type () {
3 $labels = array(
4 //'name' => __( '在籍女性', 'krc' ),
5 'name' => __( 'キャスト一覧', 'krc' ),
最低限装飾したデモサイトを作ってみました。
キャスト一覧ページは「サイトURL/cast」にあります。 content-castlist.phpから引っ張ってきてarchive-cast.phpで表示させています。
スケジュールはページ下部に表示されます
スケジュールページは固定ページでページを作っています。 そこにショートコードで[scheduleshtml]でスケジュールを呼び出しています。
キャスト情報はページ上部に表示されます
content-cast.phpから引っ張ってきてsingle-cast.phpで表示させています。 下のスケジュールは、functions.phpで作った関数を呼び出しています。 キャストの画像はSlickスライダー使って表示させています。
functions.phpで作ったショートコードを呼び出しています。 トップページなど好きなところに表示させます。
functions.phpで作ったショートコードを呼び出しています。 トップページなど好きなところに表示させます。
以上がWordPressのテンプレート構造、プラグイン「krc-cast-manager」の導入方法の説明になります。 無料在席キャスト管理システム「krc-cast-manager」を使いこなせると、単にブログサイトを作るだけではなく、スタッフ管理やちょっとしたセミナーのスケジュール管理にも応用できるのではないでしょうか。 今回は、プラグインを動かすまでに留めたため、レイアウトはBootstrapを使ってざっくりと指定しております。 機会があれば、ElementorやDiviなどのNoCodeツールと連携してリッチなデザインにしてみたいと思います。