WordPressテーマカストマイズで工夫したことを忘れないように記録しておきます。
・myFunction.phpの設置
・Teacup掲示板投稿の取り込み・再構成・HTML保存
・掲示板投稿日の最新チェックとNew!マーク
・Newカウント値のメニューへの表示(myFunctionに記述)
・メニューだけ再表示
・掲示板巡回データの保存・再利用
0)myFunction.phpの設置
functions.phpに次の1行を追加し、関数追加編集を容易にする。
Include_my_php(array(‘file’=>’myFunction’));
1)Teacup掲示板投稿の取り込み・再構成・HTML保存
一般掲示板の投稿データの取り込みと整形
投稿タイトル部と本体を分け、本体は「続きを読む」で表示
//
$url…掲示板のURL
$unq…ID=生成用のユニーク接頭子
$filter..単独掲示板か複数集約モードか
$mno…メニューIDの基準値
dispNewS()…投稿日からNew!判定の関数
echo_save()..echoでHTML出力するとともに、$buffに貯める
//
function put_Teacup($url,$unq ,$filter, $mno)
{
$response = wp_remote_get($url, array( 'timeout' => 5));
if(is_wp_error($response)) {
// wp_dieは、エラーメッセージを表示し、WordPressの処理を中断する関数
wp_die(esc_html($response->get_error_message()));
}
$html_header = 'text/html; charset=UTF-8';
if(!isset($response['headers']['content-type']) ||
$response['headers']['content-type'] != $html_header) {
echo($response['headers']['content-type']);
wp_die('ヘッダー情報がHTMLではありません。');
}
$table = "";
$pos = 8192;
$stop = 6; if ($filter!="") $stop = 11;
$body = $response['body'];
for ($i=1;$i<$stop;$i++) {
$pos = mb_strpos($body,"<H2>",$pos);
if ($pos === false) break;
$pos2 = mb_strpos($body,"<TABLE ",$pos);
if ($pos2 === false) print "<br>mb_strpos2がfalseを返しました。<br>";
$pos3 = mb_strpos($body,'<TD VALIGN="top" WIDTH="30">',$pos2+8);
if ($pos3 === false) print "<br>mb_strpos3がfalseを返しました。<br>";
$pos4 = mb_strpos($body,"<TABLE ",$pos-230);
$table .= mb_substr($body,$pos4,$pos-$pos4);
$table1 = "<H4>".mb_substr($body,$pos+4,mb_strpos($body,"</TD>",$pos2-80)-($pos+4));
$pos = mb_strpos($table1,"投稿日")+4;
$pos4 = mb_strpos($table1,"日",$pos);
$table1 = mb_substr($table1,0,$pos).dispNewS(mb_substr($table1,$pos,$pos4-$pos), $mno).mb_substr($table1,$pos);
$table .= str_replace("編集済","",str_replace("返信・引用","",str_replace("</H2>","</H4></TD><TD align=right nowrap><A href=\"JavaScript:hiraku('tuzuki".$unq.$i."');\"><font size=2>▼続きを読む</A></TD></TR>\n<TR><TD>",$table1)));
$table .= "</TR></TABLE>\n<DIV CLASS='tuzukiwak' ID='tuzuki".$unq.$i."'>";
$pos2 = mb_strpos($body,"<TT>",$pos2);
$table .= '<TABLE WIDTH="100%" CELLPADDING="1" CELLSPACING="2" BORDER="0"><TR><TD VALIGN="top" ALIGN="left">'.outofteacup(mb_substr($body,$pos2,$pos3-$pos2));
$table .= "</TR><TR><TD align=right nowrap><A href=\"JavaScript:tatamu('tuzuki".$unq.$i."');\"><font size=2>▲たたむ</A> <a href='#header'>▲TOP</a></TD></tr></table></td></tr></table>\n\n";
$pos = $pos3 + 10;
}
echo_save($table."</DIV>\n");
}
2)掲示板投稿日の最新チェックとNew!マーク
function dispNewS($str, $mno) {
$dateYMD = str_replace(" ","0",str_replace(array('年','月'), '-', $str));
return dispNew(strtotime($dateYMD), $mno);
}
function dispNew($date, $mno) {
$days = 35; // 最新の範囲日数(仏教徒)
$today = date('U');
$date1 = $date;
if ($date==null) $date1 = get_the_time('U');
$period = date('U', ($today - $date1)) / 86400;
if ($days > $period) {
array_push($GLOBALS['menew'], $mno); // 別ページとの連携
if ($date==null) echo '<font color=red>New!</font>';
else return '<font color=red>New!</font>';
}
return "";
}
function echo_save($str) {
global $buff;
echo ($str);
$buff .= $str;
}
3)Newカウント値のメニューへの表示(myFunctionに記述)
$num = 0;
function add_nav_menu_custom_class( $sorted_menu_items ) {
global $num;
if (is_page_template('sample-page.php') ||
is_page_template('notation-page.php')) {
$num = 1;
foreach ( $sorted_menu_items as &$item ) {
if (in_array($num,$GLOBALS['menew'])) {
$item->new = count(array_filter($GLOBALS['menew'], "find_v"));
} else $item->new = false;
$num++;
}
}
return $sorted_menu_items;
}
function find_v($v) {
global $num;
return ($v == $num);
}
add_filter( 'wp_nav_menu_objects', 'add_nav_menu_custom_class' );
function my_walker_nav_menu_start_el( $item_output, $item, $depth, $args ) {
if ( isset($item->new) && ($item->new!=false)) {
// New の表示
$item_output = preg_replace( '@</a>@', " <font color=red>New!</font>({$item->new})</a>", $item_output );
}
return $item_output;
}
add_filter( 'walker_nav_menu_start_el', 'my_walker_nav_menu_start_el', 10, 4 );
4)メニューだけ再表示
// Javascriptを出力しておく。
<SCRIPT language="JavaScript"><!--
function menuCUT() {
document.getElementById('access').outerHTML =
"<div id='repmenu'><div class='menu-header'><ul class='menu'><li>メニュー</li></ul></div></div>";
}
function menuRDY() {
a = document.getElementById('access').outerHTML;
document.getElementById('access').outerHTML = "";
document.getElementById('repmenu').outerHTML = a;
}
//--></SCRIPT>
// Newカウンターの更新
<?php
$GLOBALS['menew'] = explode(" ", get_option('menew',""));
get_header(); // メニューの初期表示
?>
<script type="text/Javascript">
window.setTimeout("menuCUT()",100);
</script>
//
// PHPでの本体出力処理・・・・
//
// menuの再作成
<div id="access" role="navigation">
<div class="skip-link screen-reader-text"><a href="#content" title="<?php esc_attr_e( 'Skip to content', 'twentyten' ); ?>"><?php _e( 'Skip to content', 'twentyten' ); ?></a></div>
<?php wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'primary' ) ); ?>
</div><!-- #access -->
// 再表示
<script type="text/Javascript">
window.setTimeout("menuRDY()",400);
</script>
5)掲示板巡回データの保存・再利用
<?php
$buff = "";
$nenji = get_option('nenjiBBS',array('stamp'=>0, 'html'=>""));
$today = date('U');
$date = $nenji['stamp'];
$period = date('U', ($today - $date)) / 3600; // 1時間以内は、従前再利用
if ($filter=="" && (1> $period)) :
echo ($nenji['html']);
else:
//
// PHPでの本体出力処理・・・・
//
if ($filter=="") {
$nenji['stamp'] = date('U');
$nenji['html'] = $buff;
update_option('nenjiBBS', $nenji);
}
endif;
$buff = "";
// menuの再作成
// 再表示
?>
以上