この記事は公開または最後に更新されてから3158日が経過しています。情報が古くなっている可能性があるのでご注意下さい。

wordpress のカレンダーはとても味気ない。
日曜も土曜も祝日もなにもつかない。 id="today" だけ。
もうちょっと華やかにならないものかと、プラグインを入れていましたが、これもなぜか私の環境だとうまく動かないのです。
なんとかしたいなあと吐き出されたソースをじっと眺めていたりして。

<li id="calendar-2" class="widget widget_calendar"><h2 class="widgettitle">&nbsp;</h2>
<div id="calendar_wrap"><table id="wp-calendar">
	<caption>2012年5月</caption>
	<thead>
	<tr>
		<th scope="col" title="日曜日"></th>
		<th scope="col" title="月曜日"></th>
		<th scope="col" title="火曜日"></th>
		<th scope="col" title="水曜日"></th>
		<th scope="col" title="木曜日"></th>
		<th scope="col" title="金曜日"></th>
		<th scope="col" title="土曜日"></th>
	</tr>
	</thead>

	<tfoot>
	<tr>
		<td colspan="3" id="prev"><a href="https://~/?m=201204" title="2012年4月の投稿を表示">&laquo; 4月</a></td>
		<td class="pad">&nbsp;</td>
		<td colspan="3" id="next" class="pad">&nbsp;</td>
	</tr>
	</tfoot>

	<tbody>
	<tr>
		<td colspan="2" class="pad">&nbsp;</td><td><a href="https://~/?m=20120501" title="4/29キビタキ3, 4/29キビタキ2, 4/29キビタキ1">1</a></td><td>2</td><td>3</td><td>4</td><td><a href="https://~/?m=20120504" title="5/4明治神宮">5</a></td>
	</tr>
	<tr>
		<td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td id="today">11</td><td>12</td>
	</tr>
	<tr>
		<td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td>
	</tr>
	<tr>
		<td>20</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td>
	</tr>
	<tr>
		<td>27</td><td>28</td><td>29</td><td>30</td><td>31</td>
		<td class="pad" colspan="2">&nbsp;</td>
	</tr>
	</tbody>
	</table></div></li>
HTML
CopyExpand

wordpress設定の一般の週のはじめを日曜日に設定しています。
日曜を週のはじめに設定していれば当然のことながら土曜が週のおわりになります。
日曜と土曜がそれぞれテーブルの端に位置しているということは、前後のコードにもそれぞれ特徴がでています。
これなら置換すれば日曜と土曜のclass付けはなんとかなりそう。

テーブルの左端の列になる日曜には、改行やタブ、空白を除けば必ず<tr><td>がセットになります。
class属性を挿入するとなると<tr><td>までをclass属性を付けて置換すればいいでしょう。

<?php
$calendar_output=str_replace("<tr><td","<tr><td class=\"nitiyou\"",$calendar_output)
?>
PHP
CopyExpand

ちなみに $calendar_output はカレンダーを出力するときのフィルターフック get_calendar から受け取るカレンダー出力文字列。

土曜日の場合はテーブルの右端の列になるので同じく改行などを除けば</td></tr></td>の後に必ず</tr>がセットになるパターンとなりますが、土曜の場合は問題となってくるのがclass属性を付ける場合に<td の後に付けたいわけですが、日付けの1ケタないし2ケタの数字があるということと、その日に投稿があった場合に投稿に対するリンクのアンカータグが入ることがあるということです。
投稿がある場合はどちらにしろリンクによって文字色は指定されていますので、これはそのままリンクの色指定にしておいた方がいいので無視することにしてしまいますが、1ケタもしくは2ケタの数字が含まれる文字列の置換は正規表現を使うことになります。

<?php
$pattern="/(<td>)(\d{1,2})(<\/td><\/tr>)/";
$calendar_output=preg_replace($pattern,"<td class=\"doyou\">$2$3",$calendar_output);
?>
PHP
CopyExpand

正規表現はややこしいのですがこれはもっともシンプルな部類です。
(\d{1,2})の部分だけです。そのまま数字が1つないし2つあるという表現です。
preg_replace の( )の中の$2と$3には正規表現パターンの( )で指定された2番目、3番目にマッチする部分が入っているということです。

曜日の表題部分は日曜日も土曜日もそのものずばりで文字列が存在するので title="日曜日" にclass属性を付加して置換します。日曜の場合は<tr><thを置換してもよさそうです。私の場合はもうひとつのサイトの関係もあってこちらにしました。

流れとしては、はずはじめにカレンダー出力文字列から、改行、タブ、空白などの制御文字列を全て取り除いた後で、上記の置換をそれぞれ実施しCSSの方でスタイルを設定すれば、日曜を週のはじめに設定した場合に限って、とりあえず日曜と土曜の色指定はできるはずです。

しかし、ここまでくると祝祭日についてもなんとか色指定をしたくなってしまうのが人情というものです。
思うに祝祭日のリストがあればできるように思います。
ネット上にないものかと探してみると、ちゃんとあるものですね。
ありがたい以下のページを利用させていただきました。
AddinBox 祝日について
とても素晴らしいページで祝祭日のリストがxml形式でダウンロードできるようになっていますが、私は年数を入力して祝日一覧を表示させてコピペしてエクセルに貼り付け、年月日以外の列を削除してからcsv形式にてファイル保存しました。
一応ダウンロードできるようにリンクしておきます。
右クリックメニューで対象をファイルに保存でダウンロードできると思います。
holidaylist.txt
私はアップロードして使用するファイルなのでセキュリティ上、拡張子をphpにして使用しています。あまり関係ないですけど。
ちなみにこのリスト内の日付の書式は 2012/5/5 という具合に/で区切っています。

出力されるカレンダーがいつのものであるかは<caption></caption>タグによって出力されているので、ここから年と月を取得し、休日リストをファイルから配列に読み込んだあと照合させ、年と月が合致したデータの日にちの数字だけを取り出して配列に格納します。そして、配列に格納された数字を順に、その日にちの数字を含むタグごとclass属性をつけたものに置換します。
この場合も投稿があった日はアンカータグによりリンクの色がつきますので、アンカータグがついている場合は無視します。そして土曜日が祭日の場合も先にこの処理によって <td class="nitiyou"> のように <td> タグにclassがついているので土曜の置換をするときには該当しません。
以上の理屈でコードを作ってみました。

<?php
function add_today_class2calendar($calendar_output){
	$filename='./holidaylist.php';
	$fp=fopen($filename,'rb');
	flock($fp,LOCK_EX);
	$line=array();
	while(!feof($fp)){
		$line[]=fgets($fp);
	}
	fclose($fp);
	
	$calendar_output=str_replace(array("\r\n","\n","\r","\t"), '', $calendar_output);
	
	$frompos=mb_strpos($calendar_output,"<caption>")+9;
	$topos=mb_strpos($calendar_output,"/caption")-$frompos-2;
	$tukihi=mb_substr($calendar_output,$frompos,$topos);
	$nen=mb_substr($tukihi,0,mb_strpos($tukihi,"年"));
	$tuki=str_replace("月","",mb_substr($tukihi,mb_strpos($tukihi,"年")+1));
	$nen=$nen."/".$tuki."/";
	$answer=array();
	foreach($line as $val){
		if(strpos($val,$nen)!==false){
			$answer[]=substr($val,strrpos($val,"/")+1);
		}
	}
	if(count($answer)>0){
		foreach($answer as $val){
			$val=trim($val);
			$oristr=">".$val."</td>";
			$newstr=" class=\"nitiyou\">".$val."</td>";
			$calendar_output=str_replace($oristr,$newstr,$calendar_output);
		}
	}
	
	$pattern="/(<td>)(\d{1,2})(<\/td><\/tr>)/";
	$calendar_output=preg_replace($pattern,"<td class=\"doyou\">$2$3",$calendar_output);

	$search=array("<tr><td","<tr><th","title=\"土曜日\"");
	$change=array("<tr><td class=\"nitiyou\"","<tr><th class=\"nitiyou\"","title=\"土曜日\" class=\"doyou\"");
	$calendar_output=str_replace($search,$change,$calendar_output);
	
	return $calendar_output;
}

add_filter('get_calendar','add_today_class2calendar');
?>
PHP
CopyExpand

2~9行目はリストファイルholidaylist.phpを読み込む処理です。
11行目で改行やらタブやらを全て取り除いています。
13~18行目で<caption></caption>タグから年月を取得し、 2012/5 という書式に組立てなおしています。
19~24行目で休日リストの中に該当する年月があるかを照合して、あった場合は日にちの数字のみにして配列に格納します。
25~32行目で該当する休日があった場合に、日にちの数字を含んだタグごとclass属性を付けて置換しています。
34~35行目で土曜日の置換を行い、37~39行目で表題の日曜、土曜、と日曜の数字の置換をまとめて行っています。

一応これで目的は達成されたと思います。
ただし、週のはじめを日曜に設定している場合だけですけど。

くどいようですが、DIYは完全自己責任。
DIYの基本中の基本は事前バックアップです。
function.phpの事前バックアップは必須です。

いっそのこと投稿カレンダーを自作してしまおうというのは下記です。
wordpressのカレンダーを自作

Leave a Reply!

JavaScript is necessary to send a comment.
You can edit and delete your comment if you input a edit key.
Edit key is necessary for attesting you when you edit and delete it.
The tag of HTML cannot be used in comment.
When you comment for the first time, it is displayed after the approval of the administrator.
Because I cannot speak English so much, it takes time to answer.
Required fields are marked *.

※Please enter more than 5 characters only alphabets.
※Edit or delete are possible for 2000 days after approval.

*

♠Simplistic Comment User Editable v4.0

♠When visitors leave comments on the site this site collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.
♠This site does not use cookie when visitors leave comments and commenter edit comment.
♠This site uses Akismet to reduce spam. Learn how your comment data is processed.

Comments feed

Trackback URL : https://strix.main.jp/wp-trackback.php?p=15784

Sanbanse Funabashi

Top

スクロールさせるか画像をクリックすると元に戻ります。