WordPressプラグイン『krc-cast-manager』の補足解説

筆者は基本的にアダルトサイトの受注はお断りしているのだが、つい最近、訳あって『krc-cast-manager』という風俗系サイト用のキャスト管理プラグインを使用する機会があった。ニッチなプラグインだが、ポイントを押さえていて質が高く助かった。

ところで、プラグイン制作者様の解説ページは丁寧に利用方法が説明されているが、それでも一部わからない箇所があった。一応筆者は制作業のプロなのでなんとかなったが、素人なら挫折したかもしれない。せっかく良いプラグインなので勿体無い。

ということで、補足的に自分なりに解説してみようと思う。

『krc-cast-manager』の解説

公式の解説ページ

以下が公式の解説ページ。
両ページは熟読しておいたほうがよいだろう。

解説ページ:前編
解説ページ:後編

利用方法:フォルダ名変更を忘れない!

公式の解説ページにきちんと書かれているが、一応おさらい。

GitHubからダウンロードする。

zipでダウンロードすると、ディレクトリ名が「krc-cast-manager-master」となるので、zipを展開後に「krc-cast-manager」とフォルダ名をリネームする必要がある

フォルダ名を変更後、「../wp-content/plugins」フォルダに格納する。WordPresss管理画面のプラグイン設定ページで有効化すればOKだ。

URLが「krc_cast」となるが、他のに変更したい

プラグインの通常使用すると、キャスト一覧ページのURLが「krc_cast」となる。制作者様からすれば「krc_」は残したいのだろうなと勝手に心中察したが、そうはいっても違和感があるのでこのURLを変更する方法を解説する。

『Sublime Text 3』や『Dreamweaver』など、フォルダ内検索&一括変換の機能をもつエディタを活用しよう。「krc_cast」→「cast」のようにフォルダ内一括変換を実行しよう
※数字から始まる文字列に変換するのは避けること。単純な英単語に変換するのがよい。

このような機能を持つエディタがなければ、15ファイル(77箇所)を手動で変更しなければならない。骨が折れるが、どうしても変更したい方は頑張ろう。

※既にキャスト登録を終えている場合でも、本項の変更したら、もう一度最初から登録をしなければなりません。

用意するファイル

WordPressのテーマファイルに追加するファイルをまとめ。その中身も紹介する。

※前述のURL変更(一括変換)で、「krc_cast」を「cast」に変更したと想定。
※ページが404エラーになる場合は、WordPresss管理画面の【設定>パーマリンク設定】で一度「保存ボタン」を押してみよう。

【キャスト一覧ページ】archive-cast.php

解説ページでは「archive.phpをコピーしてリネームする」とある。

概ね以下のようになるだろう。

<?php
get_header();?>

 <?php if (have_posts()):?>
  <div class="cast-wrapper">
   <?php while (have_posts()):the_post();?>
    <?php get_template_part('content',('castlist'));?>
   <?php endwhile;?>
  </div>
  <?php if (function_exists("pagination")):?>
   <?php pagination($additional_loop->max_num_pages);?>
  <?php endif;?>
 <?php endif;?>

<?php get_footer();?>

※10〜12行目はページ送りの呼び出し。サイト毎に異なると思うので要確認。

【キャスト一覧ページ】content-castlist.php

解説ページでは「content.phpをコピーしてリネームする」とある。

概ね以下のようになるだろう。

<?php
?>

<?php
 $cast_fields = get_post_custom(); //カスタムフィールドを全部取得
 $cast_screens = json_decode($cast_fields['_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'); //新人区分タクソノミーを取得
?>

<div class="one-cast">
 <div class="cast-photo">
  <a href="<?php the_permalink();?>">
   <?php if( empty($cast_screens) ): ?>
    <img src="<?php echo get_template_directory_uri();?>/img/noimg.jpg" alt="<?php echo esc_html($cast_fields['_krc_name'][0]);?>">
   <?php else: ?>
    <img src="<?php echo esc_url($cast_screens[0]);?>" alt="<?php echo esc_html($cast_fields['_krc_name'][0]);?>">
   <?php endif;?>
  </a>
 </div>

 <div class="cast-name"><?php echo esc_html($cast_fields['_krc_name'][0]);?></div>
 <div class="cast-meta">
  <div class="cast-age"><?php echo esc_html($cast_fields['_krc_age'][0]);?>歳 T:<?php echo esc_html($cast_fields['_krc_tall'][0]);?></div>
  <div class="cast-size">B:<?php echo esc_html($cast_fields['_krc_bust'][0]);?>(<?php echo esc_html($cast_fields['_krc_cups'][0]);?>) W:<?php echo esc_html($cast_fields['_krc_waist'][0]);?> H:<?php echo esc_html($cast_fields['_krc_hips'][0]);?></div>
  <div class="cast-new"><?php echo esc_html($cast_new_terms[0]->name);?></div>
 </div>
</div>

【キャスト詳細ページ】single-cast.php

解説ページでは「single.phpをコピーしてリネームする」とある。

概ね以下のようになるだろう。

<?php
get_header(); ?>

<?php while (have_posts()):the_post();?>
 <?php get_template_part('content',('cast'));?>
<?php endwhile;?>

<?php get_footer();?>

【キャスト詳細ページ】content-cast.php

解説ページでは「content.phpをコピーしてリネームする」とある。

概ね以下のようになるだろう。

<?php
?>

<?php
 $cast_fields = get_post_custom(); //カスタムフィールドを全部取得
 $cast_screens = json_decode($cast_fields['_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'); //新人区分タクソノミーを取得
?>

<div class="one-cast">
 <div class="cast-photo">
  <?php if( empty($cast_screens) ): ?>
   <div class="cast-photo-wrapper"><img src="<?php echo get_template_directory_uri();?>/img/noimg.jpg" alt="<?php the_title();?>"></div>
  <?php else: ?>
   <div class="slideshow">
    <?php foreach ($cast_screens as $value):?>
     <div class="slide">
      <img src="<?php echo $value;?>" alt="<?php the_title();?>">
     </div>
    <?php endforeach;?>
   </div>
  <?php endif;?>
 </div>

 <div class="cast-name"><?php echo esc_html($cast_fields['_krc_name'][0]);?></div>
 <div class="cast-meta">
  <div class="cast-age"><?php echo esc_html($cast_fields['_krc_age'][0]);?>歳 T:<?php echo esc_html($cast_fields['_krc_tall'][0]);?></div>
  <div class="cast-size">B:<?php echo esc_html($cast_fields['_krc_bust'][0]);?>(<?php echo esc_html($cast_fields['_krc_cups'][0]);?>) W:<?php echo esc_html($cast_fields['_krc_waist'][0]);?> H:<?php echo esc_html($cast_fields['_krc_hips'][0]);?></div>
  <div class="cast-new"><?php echo esc_html($cast_new_terms[0]->name);?></div>
 </div>
</div>

スケジュール有効化

スケジュールの概念を有効化する。

functions.phpへの追記

解説ページに従って、functions.phpに以下のように追記する。

//キャストの個人ページでスケジュールを表示したい
function singlecalendar($id) {
 $week = array("日", "月", "火", "水", "木", "金", "土");
 $today = strtotime(date("Y-m-d", strtotime("+3 hour")));
 echo '<div class="krc_calendar clearfix">';
 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))) ) {
   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;  //配列にして返す
}

function schedulesHtml() { //ショートコードの中身
 $day = isset($_GET["works"]) ? $_GET['works'] : date("Y-m-d");
 $works = outschedule($day);
 $len = 6; //+1

 $week = array("日", "月", "火", "水", "木", "金", "土");
 $w = date('w', strtotime($day));
 echo '<header class="sub_h_header">';
 echo '<h2 class="sub_h">' . date('n/j', strtotime($day));
 echo '(' . $week[$w] . ')';
 echo 'の出勤スケジュール</h2>';
 echo '</header>';

 echo '<nav class="krc_calendar clearfix"><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) . '"><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>';

 if (!$works) {
  //予定がない場合
  echo '<br>';
 } else if ( $works !='rest' ) {
  echo '<div class="container"><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></div>';
 } else {
  //休み
  echo '<br>';
 }
}
add_shortcode('scheduleshtml', 'schedulesHtml'); //[scheduleshtml]というショートコードを作成

「content-cast.php」に追記

前述の「content-cast.php」の任意の場所に、以下のように追記する。

<?php singlecalendar(get_the_ID());?>

cssに追記

cssは以下のような感じで。

.krc_calendar {
 border-top: 1px solid #ccc;
 border-left: 1px solid #ccc;
 border-bottom: 1px solid #ccc;
 font-size: 13px;
 margin: 24px 0;
}
.krc_calendar dl {
 border-right: 1px solid #ccc;
 width: 14.285%;/* 100割る7 */
 float: left;
 display: block;
}
.krc_calendar dl dt {
 border-bottom: 1px solid #ccc;
 text-align: center;
 padding: 2px;
}
.krc_calendar dl dd {
 text-align: center;
 text-decoration: none;
 padding: 24px 2px;
 display: block;
}

【スケジュールページ】作成

固定ページを作成

WordPresss管理画面の【固定ページ>新規作成】でスケジュールページを作成。本文に[scheduleshtml]というショートコードのみ記述し、スラッグを「schedule」にして公開する。

page-schedule.php

前述の「content-cast.php」の任意の場所に、以下のように追記する。

<?php
get_header();?>

<div class="schedule-wrapper">
 <?php while (have_posts()):the_post();?>
  <?php remove_filter('the_content','wpautop');?>
  <?php the_content(__('続きを読む <span class="meta-nav">→</span>'));?>
  <?php wp_link_pages(array('before'=>'<div class="page-links">'.__('Page:'),'after'=>'</div>'));?>
 <?php endwhile;?>
</div>

<?php get_footer();?>

「本日の出勤キャスト」を表示

functions.phpへの追記

解説ページに従って、functions.phpに以下のように追記する。

//TOPページ等に本日の出勤キャストを表示したい
function todaysCastHtml ($day = '') { //本日の出勤
 $time9 = 9 - 6;//6時に次の日のスケジュールに切り替わる仕様
 $day = $day != '' ? $day : date("Y-m-d",strtotime("+".$time9." hour"));
 $works = outschedule($day);
 addSchedules($works);
}
function addSchedules($works) {
 $schedule = 'schedule';

 if (!$works) {
  //予定がない場合
  echo '<br>';
 } 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', 'castlist' ); //content-castlist.phpは用意しておいて下さい。
   endwhile;
   wp_reset_query();
  }
 } else {
  //休み
  echo '
'; } }

任意のphpファイルへ記述

「本日の出勤キャスト」を表示したいphpファイルの任意の箇所へ、下記のように記述する。

<?php todaysCastHtml();?>

「本日出勤日」というアイコンを付ける

「content-castlist.php」など、任意の場所に追記する。

<?php if (today_schedule(get_the_ID())):?>
 <div class="todays-cast">本日出勤日</div>
<?php endif;?>

曜日表記を変える

(SUN)(MON)のように表記されるのを、(日)(月)のように変更する。

functions.phpの追記部分、以下の箇所を、

strtoupper(date('n/j(D)', strtotime('+'.$i.' day')))

次の表記に変更。

strtoupper(date('n/j(' . $week[$yy] . ')', strtotime('+'.$i.' day')))

スケジュールの時間を細かく調整する

デフォルトでは「遅早表記」「時間表記」のふたつが指定できる。
「時間表記」は「10時」から「26時」という表記方法だ。

変更するには、「../plugins/krc-cast-manager/js/krc-cast-schedule.js」を修正する。
12行目からの

var time_popup = '<dd class="time_input"><div class="time_popup"><dl><dt><label for="遅早表記">遅早表記</label></dt><dd><select name="fastslow" class="fastslow"><option value="0">指定無</option><option value="早番">早番</option><option value="中番">中番</option><option value="遅番">遅番</option></select></dd></dl><dl><dt><label for="時間表記">時間表記</label></dt><dd><select name="starttime" class="starttime"><option value="0">指定無</option>';
time_popup += '<option value="OPEN">OPEN</option>';
for (var i = 10; i <= 26; i++) {
 time_popup += '<option value="' + i + '時">' + i + '時</option>';
}
time_popup += '</select><br>から</dd><dd><select name="endtime" class="endtime"><option value="0">指定無</option>';
for (var i = 10; i <= 26; i++) {
 time_popup += '<option value="' + i + '時">' + i + '時</option>';
}
time_popup += '<option value="LAST">LAST</option>';
time_popup += '</select></dd></dl></div></dd>';

この部分を、例えば以下のように調整する。

var time_popup = '<dd class="time_input"><div class="time_popup"><dl><dt><label for="時間表記">時間表記</label></dt><dd><select name="starttime" class="starttime"><option value="0">指定無</option>';
time_popup += '<option value="12:00">12:00</option><option value="12:30">12:30</option><option value="13:00">13:00</option><option value="13:30">13:30</option><option value="14:00">14:00</option><option value="14:30">14:30</option><option value="15:00">15:00</option><option value="15:30">15:30</option><option value="16:00">16:00</option><option value="16:30">16:30</option><option value="17:00">17:00</option><option value="17:30">17:30</option><option value="18:00">18:00</option><option value="18:30">18:30</option><option value="19:00">19:00</option><option value="19:30">19:30</option><option value="20:00">20:00</option><option value="20:30">20:30</option><option value="21:00">21:00</option><option value="21:30">21:30</option><option value="22:00">22:00</option><option value="22:30">22:30</option><option value="23:00">23:00</option><option value="23:30">23:30</option><option value="0:00">0:00</option><option value="0:30">0:30</option><option value="1:00">1:00</option><option value="1:30">1:30</option><option value="2:00">2:00</option><option value="2:30">2:30</option><option value="3:00">3:00</option><option value="3:30">3:30</option><option value="4:00">4:00</option><option value="4:30">4:30</option><option value="5:00">5:00</option>';
time_popup += '</select><br>から</dd><dd><select name="endtime" class="endtime"><option value="0">指定無</option>';
time_popup += '<option value="12:00">12:00</option><option value="12:30">12:30</option><option value="13:00">13:00</option><option value="13:30">13:30</option><option value="14:00">14:00</option><option value="14:30">14:30</option><option value="15:00">15:00</option><option value="15:30">15:30</option><option value="16:00">16:00</option><option value="16:30">16:30</option><option value="17:00">17:00</option><option value="17:30">17:30</option><option value="18:00">18:00</option><option value="18:30">18:30</option><option value="19:00">19:00</option><option value="19:30">19:30</option><option value="20:00">20:00</option><option value="20:30">20:30</option><option value="21:00">21:00</option><option value="21:30">21:30</option><option value="22:00">22:00</option><option value="22:30">22:30</option><option value="23:00">23:00</option><option value="23:30">23:30</option><option value="0:00">0:00</option><option value="0:30">0:30</option><option value="1:00">1:00</option><option value="1:30">1:30</option><option value="2:00">2:00</option><option value="2:30">2:30</option><option value="3:00">3:00</option><option value="3:30">3:30</option><option value="4:00">4:00</option><option value="4:30">4:30</option><option value="5:00">5:00</option>';
time_popup += '</select></dd></dl></div></dd>';

この例では、「遅早表記」は削除。
「時間表記」は30分毎にしたいため、for構文の繰り返し処理は諦めて30分毎に直書きした。