getName();
echo'
';
echo $KEYCLOAK_USER->getEmail();
echo'
';
echo $KEYCLOAK_USER->getId();
echo'
';
}
//*/
}
function is_ajax_request(){
return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}
function curl_post_request($url, $ary_data, $is_json_request=false) {
$ch = curl_init();
$a=array();
foreach($ary_data as$k=>$v){
$a[]=$k.'='.$v;
}
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&',$a));
// In real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS,
// http_build_query(array('postvar1' => 'value1')));
// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if($is_json_request){
//Set the content type to application/json # https://thisinterestsme.com/sending-json-via-post-php/
curl_setopt($ch, CURLOPT_HEADER, false);
$payload = json_encode($ary_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($payload)
));
}
$server_output = curl_exec($ch);
curl_close($ch);
return $server_output;
}
function is_aia_staff_openid_email($email){
}
function _convert_number2sortable($s){
foreach(array(
'二十'=>20,
'十九'=>19,
'十八'=>18,
'十七'=>17,
'十六'=>16,
'十五'=>15,
'十四'=>14,
'十三'=>13,
'十二'=>12,
'十一'=>11,
'十'=>10,
'九'=>'09',
'八'=>'08',
'七'=>'07',
'六'=>'06',
'五'=>'05',
'四'=>'04',
'三'=>'03',
'二'=>'02',
'一'=>'01',
) as$k=>$v){
if(strpos($s,$k)===false){continue;}
$s = str_replace($k,$v,$s);
}
return$s;
}
function normalize_aia_email($email, $need_care_valid_or_not=true){
if($need_care_valid_or_not and !filter_var($email,FILTER_VALIDATE_EMAIL)){
var_dump($email);
die('invalid AIAcademy email');
}
return trim(strtolower($email));
}
function get_datetime_weekday($date){
$dw = str_replace(array(' ',"\n","\r"),'',shell_exec('date -d"'.$date.'" "+%w"'));
return $dw;
}
function is_weekday_sunday($dw){
$dw=(int)$dw;
return $dw===0;
}
function fix_post_data($_POST_VALUE){ // tested on chrome
if(is_int($_POST_VALUE) or is_float($_POST_VALUE)){
return $_POST_VALUE;
}
if(is_string($_POST_VALUE)){
return stripslashes($_POST_VALUE);
}else{
if(is_array($_POST_VALUE)){
foreach($_POST_VALUE as$k=>$v){
$_POST_VALUE[$k]=fix_post_data($v);
}
}
}
return $_POST_VALUE;
}
function now($format='Y-m-d H:i:s'){ // %Y-%m-%d %H:%M:%S
// 保存當前時區
$originalTimeZone = date_default_timezone_get();
// 設定時區為台北時間
date_default_timezone_set('Asia/Taipei');
$time= date($format);
// 恢復原始時區
date_default_timezone_set($originalTimeZone);
return $time;
// foreach(array('Y'=>'%Y', 'm'=>'%m', 'd'=>'%d', 'H'=>'%H', 'i'=>'%M', 's'=>'%S')as$k=>$v){
// $format = str_replace($k,$v,$format);
// }
// $ret = shell_exec("date '+".$format."'");
// #if($is_remove_new_line_break){
// $ret = str_replace(array("\r","\n"),'',$ret);
// #}
// return$ret;
}
function ajax_response($code, $data, $msg=''){
return array('code'=>$code, 'msg'=>$msg, 'data'=>$data);
}
function is_aia_student_login(){ // 20180712 So far, only for mgr-students
return isset($_SESSION['aia_student_school_no']) && $_SESSION['aia_student_school_no'];
}
function get_aia_student_school_no(){ // 20180712
return isset($_SESSION['aia_student_school_no']) ? $_SESSION['aia_student_school_no'] : '';
}
function can_view_content(){
if(get_aia_student_school_no()){ return true; } # 20180712 added this line
global$KEYCLOAK_USER;
if(!$KEYCLOAK_USER){$KEYCLOAK_USER = get_keycloak_user_by_session_or_cache();}
$user = wp_get_current_user();
return (isset($KEYCLOAK_USER) && $KEYCLOAK_USER) || strpos($user->user_login,'student')===0 || $user->user_login;
}
function get_dates_diff($date1,$date2){
$datetime1 = date_create($date1); # or use new DateTime($date1);
$datetime2 = date_create($date2);
$interval = date_diff($datetime1, $datetime2);
return $interval;
}
define('WEB_URL', '/');
define('STUDENT_MGR_URL',WEB_URL.'mgr/');
define('HR_WEB_URL', WEB_URL.'hr/');
define('ENTER_LOGS_URL', WEB_URL.'enter_logs/');
define('ENTER_LOGS_JS_URL', ENTER_LOGS_URL.'js/');
define('ENTER_LOGS_JS_VENDOR_URL', ENTER_LOGS_JS_URL.'vendors/');
define('ENTER_LOGS_JQUERY_UI_URL', ENTER_LOGS_JS_VENDOR_URL.'jquery-ui-1.12.1.custom/');
define('ENTER_LOGS_ADMIN_URL', ENTER_LOGS_URL.'admin/');
define('ENTER_LOGS_ADMIN_LIB_URL', ENTER_LOGS_ADMIN_URL.'lib/');
define('ENTER_LOGS_DASHBOARD_URL', ENTER_LOGS_URL.'dashboard/');
define('ENTER_LOGS_DASHBOARD_LIB_URL', ENTER_LOGS_DASHBOARD_URL.'lib/');
define('LIVE_DOMAIN', 'class.aiacademy.tw');
define('LIVE_DOMAIN_WITH_WWW', 'class.aiacademy.tw');
define('IS_HTTPS', stripos($_SERVER['SERVER_PROTOCOL'],'https') === true);
define('LIVE_DOMAIN_WITH_PROTOCOL', 'https://'.LIVE_DOMAIN);
function get_override_or_append_GET($ary_for_override_or_append){
$a = $_GET; // default
if(!$a){
$a=$ary_for_override_or_append;
}else{
foreach($ary_for_override_or_append as$k=>$v){
$a[$k]=$v;
}
}
return $a;
}
function getCourseCalendarHtmlFromGoogleSpreadsheet($url){
$gid = explode('&gid=', $url)[1];
$doc = explode('/',$url)[5];
$cache = '';
$fn = __DIR__.'/cache4calendar/'.$doc.'```'.$gid.'.cache';
$s = 'no content...';
if (file_exists($fn)){
$s = file_get_contents($fn);
}
/*if(strpos($s, 'C.S')===false or strpos($s,'C.L')===false){
$s = getHtml($url);
}*/
return $s;
}
function getHtml($url, $post = null) {
if(isset($GLOBALS[$url])){
# echo'from memory--'.strlen($GLOBALS[$url]).'--'.$url.'
';
return $GLOBALS[$url];
}
# start to try to use db cache value
$WP_OPTION_KEY_BEFORE_MD5 = 'getHtml::'.$url;
$WP_OPTION_KEY = md5($WP_OPTION_KEY_BEFORE_MD5);
$DATE_FORMAT = 'Y-m-d H:i:s';
$opt_val = get_option($WP_OPTION_KEY);
if($opt_val){
$create_time = substr($opt_val,0,strpos($opt_val,'@'));
$now = date($DATE_FORMAT);
$interval = get_dates_diff($create_time, $now);
if($interval->y===0 && $interval->m===0 && $interval->d===0 && $interval->h===0 && $interval->i<1){
$val = substr($opt_val, strpos($opt_val,'@')+1);
# echo'from db--'.strlen($val).'--'.$url.'
';
$GLOBALS[$url] = $val;
return $val;
}
}
# realtime get
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
if(!empty($post)) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
$result = curl_exec($ch);
curl_close($ch);
#
// echo'insert memory for '.$url.'--'.strlen($result).'--'.$WP_OPTION_KEY.'--'.$WP_OPTION_KEY.'_before_md5';
$GLOBALS[$url] = $result;
update_option($WP_OPTION_KEY, date($DATE_FORMAT) . '@' . $result);
update_option($WP_OPTION_KEY.'_before_md5', $WP_OPTION_KEY_BEFORE_MD5);
return $result;
}
#######
define('LECTURER_NAME', 'lecturer');
define('LECTURER_URI_PREFIX', '/'.LECTURER_NAME.'/');
if(strpos($_SERVER['REQUEST_URI'], LECTURER_URI_PREFIX)===0 and strlen($_SERVER['REQUEST_URI'])>strlen(LECTURER_URI_PREFIX)){
$a = explode('/', $_SERVER['REQUEST_URI']);
$html = getHtml('https://'.LIVE_DOMAIN.WEB_URL.$a[2].'/?nc');
die($html
.'' #debug mark
);
}
/**
* WordPress 基本設定檔。
*
* 本檔案包含以下設定選項: MySQL 設定、資料表前綴、
* 私密金鑰、WordPress 語言設定以及 ABSPATH。如需更多資訊,請
* 前往 {@link http://codex.wordpress.org/Editing_wp-config.php 編輯
* wp-config.php} Codex 頁面。或者向您的空間提供商諮詢關於 MySQL 設定資訊。
*
* 這個檔案用於安裝程式自動生成 wp-config.php 設定檔。
* 您不需要將它用於您的網站,可以手動複製這個檔案,
* 並重新命名為 "wp-config.php",然後輸入相關訊息。
*
* @package WordPress
*/
define('ROOT_PATH', dirname(__FILE__) . '/');
$DB_USER_PWD_FILE = ROOT_PATH . 'db_user_pwd.php';
if(!file_exists($DB_USER_PWD_FILE) or (isset($db_user) and !$db_user) or (isset($db_pwd) and !$db_pwd) or (isset($db_name) and !$db_name)){
// ** MySQL 設定 - 您可以從主機服務提供商獲取相關資訊。 ** //
/** WordPress 的資料庫名稱,請更改 "database_name_here" */
define('DB_NAME', 'class_aiacademy_tw');
/** MySQL 資料庫使用者名稱,請更改 "username_here" */
define('DB_USER', 'root');
/** MySQL 資料庫密碼,請更改 "password_here" */
define('DB_PASSWORD', 'swC651121!#');
}else{
require_once $DB_USER_PWD_FILE;
define('DB_NAME', $db_name);
/** MySQL database username */
define('DB_USER', $db_user);
/** MySQL database password */
define('DB_PASSWORD', $db_pwd);
}
/** MySQL 主機位址 */
define('DB_HOST', 'mysql8');
/** 建立資料表時預設的文字編碼 */
define('DB_CHARSET', 'utf8mb4');
/** 資料庫對照型態。如果不確定請勿更改。 */
define('DB_COLLATE', 'utf8_unicode_ci');
/**#@+
* 認證唯一金鑰設定。
*
* 將這些更改為不同的唯一字串或符號。
* 您可以使用 {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org 私密金鑰服務} 來自動產生。
* 您可於任何時候修改這些字串讓 Cookies 失效。這將會強制所有使用者必須重新登入。
*
* @since 2.6.0
*/
/*
define('AUTH_KEY', 'A%+E/S1/]p%(#tAX!mm$Nmx?; dFq|7XZ)B@nl=80b4lx$g$5n_|{CroI*u*O+jd');
define('SECURE_AUTH_KEY', 'vFTqk2t$8@q*gyfbjP&V)^j1S}&bP,_(yiO6o^y`bDOQ4Vl)yHDMR;qn[ l.PTIH');
define('LOGGED_IN_KEY', 'O]Q ud l`^&-0)tQQvDD1]JR/V=FtUXr) y5?:a;ohBb6V^Q!4 [kk`eK(ez!Bj5');
define('NONCE_KEY', 'u.(ihOLvw!yog=}5MqQ`zk6$PqAPj|r`trIpYgyXpx_m~!1:;bQE(B1vMjb9Wez$');
define('AUTH_SALT', '$,?rk8vm1GN5SA`M&anLDw8vi=yCTr-,XSvoP+5~)&0GXk9LlMIq{r=ivWI_t/>_');
define('SECURE_AUTH_SALT', 'GpOjf|!0nnjN{8PF[bl@}-x#0QqBh2cfdhq)(j9K<*vXb[@?_.(z WDd2GJr!z0m');
define('LOGGED_IN_SALT', '(CGLK!-Q7?YggmYnGC&_0`t#TArVdg[Te7`@X56m3gg2.JRPjYi8SEO_w[');
define('NONCE_SALT', '~@&qrSG;8v._YnyqScHVuHTq!DOPojPFSwnceZ?j53$f3X]h[bYCc*:>ObAF m)nn1UO`D3@*{Eq1_@!Hw>W2Tq');
define('LOGGED_IN_KEY', 'HmG&btcn;,-xCi-vYTM@ajiekgJv?,/#}.A<[kw9*b&,||>:Y{O=-7o,[Yd$Y`1Q');
define('NONCE_KEY', 'sW1parent);
return $video_cat_area_code;
}
function get_video_cat_joinno($cat_id=0){
$cat_id = $cat_id ? $cat_id : get_query_var('cat')+0;
$cur_cat = get_category($cat_id);
$tmp = explode('-',$cur_cat->slug);
return $tmp[count($tmp)-1];
}
define('HOME_PAGE_ID', 4);
function d(){}
function dd(){}
function is_facebook_bot(){
return isset($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'facebook')!==false;
}
function is_twitter_bot(){
return isset($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'twitter')!==false;
}
function is_google_bot(){
return isset($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'google')!==false;
}
function is_bot(){
$b = isset($_SERVER['HTTP_USER_AGENT']) && (
strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'bot')!==false
|| is_google_bot()
|| is_facebook_bot()
|| is_twitter_bot()
);
return $b;
}
function need_og_tags(){
return is_facebook_bot() || is_twitter_bot(); # https://dev.twitter.com/cards/getting-started#crawling
}
function need_twitter_card_tags(){
return is_twitter_bot();
}
function my_safe_html($s, $ary_allow=array()){
foreach($ary_allow as$k=>$v){
$s = str_replace($k,$v,$s);
}
$s = htmlspecialchars($s);
foreach($ary_allow as$k=>$v){
$s = str_replace($v, $k, $s);
}
return $s;
}
function safe_db_value($s){
return str_replace(array('=','--',';','"', "'"), '',$s);
}
function str_replace_first($from, $to, $content) { # https://stackoverflow.com/questions/1252693/using-str-replace-so-that-it-only-acts-on-the-first-match
$from = '/'.preg_quote($from, '/').'/';
return preg_replace($from, $to, $content, 1);
}
function auto_add_target_blank($content){
preg_match_all('/]+>/i', $content, $m);
foreach($m as$k=>$v){
foreach($v as$k2=>$v2){
#echo $k.'--'.$k2.'--'. htmlspecialchars($v2);
if(strpos($v2, ' href="http')!==false and strpos($v2,$_SERVER['SERVER_NAME'])===false and strpos($v2,'target="_blank"')===false){
$content = str_replace($v2, substr($v2,0,strlen($v2)-1).' target="_blank">', $content);
}
}
}
return $content;
}
function imgsrc_rm_domain($imgsrc){
$b=false;
$a = array($_SERVER['SERVER_NAME'], LIVE_DOMAIN, LIVE_DOMAIN_WITH_WWW);
$a = array_unique($a);
foreach($a as$domain){
if(strpos($imgsrc, $domain)!==false){ $b=$domain;break; }
}
if($b){
list($tmp, $imgsrc) = explode($b, $imgsrc);
}
return $imgsrc;
}
function get_attribute_value_in_one_tag($tag_html, $attr='src') {
preg_match('/ '.$attr.'=".+?"/i', $tag_html, $m);
return str_replace(array(' '.$attr.'="', '"'), '', $m[0]);
}
function get_all_imgsrc($html){
preg_match_all('/ src=".*?"/',$html,$m);
$ret = array();
if($m){
foreach($m[0] as$v){
$v=str_replace(' src=', '', $v);
$v=substr($v,1);
$v=substr($v,0,strlen($v)-1);
$ret[]=$v;
}
}
return$ret;
}
function display_img($imgsrc, $attr='', $need_lazy_loading = true){
if($attr and strpos($attr,' ')!==0){$attr = ' '.$attr;}
$img = '
';
if(!$need_lazy_loading){return$img;}
return ''
.implode(' data-original=', explode(' src=', $img, 2)) #https://stackoverflow.com/questions/1252693/
;
}
function get_featured_imgsrc($post_id,$ary_size_conf=array(320,320)){
$imgsrc='';
$html_thumb = get_the_post_thumbnail($post_id, $ary_size_conf);
$thumb = preg_match('/ src=".*?"/', $html_thumb,$m);
if(isset($m[0])&&$m[0]!=''){
$imgsrc = str_replace(array('"'," src="),'',$m[0]);
}
return$imgsrc;
}
$ary_frontend_modules_config = array(
// https://github.com/kazzkiq/balloon.css/blob/master/balloon.css
// 'balloon'=>array('CSS'=>$IS_PC ? array(CSS_URL.'balloon.css') : array()) // using Javascript dynamic loading
/*
*/
'bootstrap'=>array(
'CSS'=>array(BOOTSTRAP_URL.'css/bootstrap.min.css', BOOTSTRAP_URL.'css/bootstrap-theme.min.css'),
'JS'=>array(BOOTSTRAP_URL.'js/bootstrap.min.js')
),
'bootstrap_daterangepicker'=>array(
'CSS'=>array(
BS_DATERANGEPICKER_URL.'daterangepicker.css'
),
'JS'=>array(
BS_DATERANGEPICKER_URL.'moment.min.js',
BS_DATERANGEPICKER_URL.'daterangepicker.js',
//
// 'https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js', // lt IE9
// 'https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js', // lt IE9
)
),
'base'=>array('CSS'=>array(CSS_URL.'base.css'.FE_VER)),
'lazyload'=>array('JS'=>array(JS_URL.'lazyload.js')),
'banner'=>array('CSS'=>array(CSS_URL.'banner.css'),'JS'=>array(JS_URL.'banner.js')),
'fonts'=>array('CSS'=>array(CSS_URL.'fonts.css')),
'animations'=>array('CSS'=>array(CSS_URL.'animations.css')),
);
array_unshift($ary_frontend_modules_config['bootstrap_daterangepicker']['CSS'],
$ary_frontend_modules_config['bootstrap']['CSS'][0],
$ary_frontend_modules_config['bootstrap']['CSS'][1]
);
array_unshift($ary_frontend_modules_config['bootstrap_daterangepicker']['JS'],
$ary_frontend_modules_config['bootstrap']['JS'][0]
);
function get_frontend_by_page_id($page_id, $type){
$ary_conf = array(
'439'=>array('CSS'=>CSS_URL.'articles-of-association.css', 'JS'=>JS_URL.'articles-of-association.js')
);
$ret = '';
if(isset($ary_conf[$page_id]) and isset($ary_conf[$page_id][$type]) and $ary_conf[$page_id][$type]){
$asset = $ary_conf[$page_id][$type];
if($type=='JS'){
$ret.='';
}else{
$ret.='';
}
}
return$ret;
}
function collect_frontend_assets($ary_frontend_modules){
global $ary_frontend_modules_config;
$ary_CSS = $ary_JS = array();
foreach($ary_frontend_modules as$module){
$assets = $ary_frontend_modules_config[$module];
foreach(array('JS','CSS')as$type){
// if(!is_array($assets[$type])){var_dump($assets[$type]);continue;}
if(!isset($assets[$type]) or !is_array($assets[$type])){continue;}
foreach($assets[$type] as $url){
if(!in_array($url, ${'ary_'.$type})){
array_push(${'ary_'.$type}, $url);
}
}
}
}
return array('CSS'=>$ary_CSS, 'JS'=>$ary_JS);
}
function get_css_js_assets_handle($css_js_relative_url){
if(strpos($css_js_relative_url, '?')!==false){
list($css_js_relative_url, $_) = explode('?', $css_js_relative_url);
}
$css_js_relative_url = str_replace('/', '-', $css_js_relative_url);
$css_js_relative_url = str_replace('.', '_', $css_js_relative_url);
$handle = 'ZZZ'.$css_js_relative_url;
return$handle;
}
function load_css_assets($ary_css, $launch_css_path=''){
if(!is_array($ary_css)){var_dump($ary_css);return;}
if($launch_css_path){array_push($ary_css, $launch_css_path);}
foreach($ary_css as$v){
if($v){
// echo'';
wp_enqueue_style(get_css_js_assets_handle($v),$v);
}
}
}
function load_js_assets($ary_js, $launch_js_path=''){
if(!is_array($ary_js)){var_dump($ary_js);return;}
if($launch_js_path){array_push($ary_js, $launch_js_path);}
foreach($ary_js as$v){
if($v){
// echo'';
wp_enqueue_script(get_css_js_assets_handle($v),$v);
}
}
}
function get_customize_field_post_meta($post_id,$is_force_convert_to_string){
$a = get_post_meta($post_id);
$ret = array();
foreach($a as $k=>$v){
if(substr($k,0,1)==='_'){continue;}
if($is_force_convert_to_string){
$ret[$k] = is_array($v) && count($v)>0 ? $v[0] : '';
}else{
$ret[$k] = $v;
}
}
return $ret;
}
function get_uri_without_querystring(){
$uri = $_SERVER['REQUEST_URI'];
if(strpos($uri,'?')!==false){list($uri,) = explode('?', $uri);}
return $uri;
}
function get_sql_limit($page, $pagesize){
if($page==1){return ' LIMIT '.$pagesize;}
return ' LIMIT '.(($page-1)*$pagesize).', '.$pagesize;
}
function display_date($date, $find='-', $to='/'){
$s = str_replace($find,$to,$date);
return $s;
}
function convert_num2day($num){
$a = array('?','一','二','三','四','五','六','日');
return isset($a[$num]) ? $a[$num] : '---';
}
function get_video_title($post, $video_cat_area_code, $video_cat_joinno){
$debug = isset($_GET['deb']);
$title_prefix = '';
$s = get_post_meta($post->ID, 'limit_at_join_no_and_place', true);
if($s){
$a = explode(',',$s);
foreach($a as$_){
list($course_date,$area_code,$join_no)=explode('-',$_);
if($area_code==$video_cat_area_code /*lowercase*/
and $join_no==$video_cat_joinno){
$title_prefix = $course_date; # for student
break;
}
}
if($title_prefix==''){ ## for /wp-admin/
if($debug){
$title_prefix = $s;
}else{
$title_prefix = explode('-',$a[0]);
$title_prefix = $title_prefix[0];
}
}
}
return ($title_prefix ? $title_prefix.' ' : '').$post->post_title. ($debug ? 'debug='.$video_cat_area_code : '');
}
function bread($uri){
$ret = ' 首頁';
if(is_category()){
$cat_id = get_query_var('cat')+0;
$ret.=''.get_cat_name($cat_id).'';
}elseif(is_single()){
global$post;
$cats = get_the_category();
$IS_LECTURER_CAT = $IS_VIDEO_CAT = false;
$v = $cats[0];
if($v->cat_ID==LECTURER_CAT_ID){$IS_LECTURER_CAT=true;}
if($IS_LECTURER_CAT){
$ret.='全部師資';
}elseif($IS_VIDEO_CAT){
$ary_video_cats_parent = array();
$ary_video_cats_parent[TAIPEI_AREA_CODE] =TP_TECH_VIDEO_CAT_ID;
$ary_video_cats_parent[HSINCHU_AREA_CODE]=HC_TECH_VIDEO_CAT_ID;
$ary_video_cats_parent[TAICHUNG_AREA_CODE]=TC_TECH_VIDEO_CAT_ID;
$ary_video_cats_parent[SOUTH_AREA_CODE]=ST_TECH_VIDEO_CAT_ID;
foreach($cats as$c){
if(in_array($c->parent, $ary_video_cats_parent)){
$IS_VIDEO_CAT = true;
}
$tmp = explode('-', $c->slug);
if($c->parent===$ary_video_cats_parent[$video_cat_area_code]
and $tmp[count($tmp)-1]==$video_cat_joinno){
$v = $c;
}
}
$ret.=''.$v->cat_name.'';
}
if($IS_VIDEO_CAT){
$post_title = get_video_title($post, $video_cat_area_code, $video_cat_joinno);
}else{
$post_title = $post->post_title;
}
$ret.=''.$post_title.'';
}else{ // start not-single
$define_names = get_post_meta(HOME_PAGE_ID, 'bread_names_by_nodejs_crontab',true);
if(!$define_names){ # avoid nodejs/crontab disable
$define_names = get_post_meta(HOME_PAGE_ID, 'bread_names',true);
}
$define_names = explode("\n",$define_names);
$ary_define_names = array();
foreach($define_names as$v){
$_ = explode('=', $v);
$ary_define_names[$_[0]] = $_[1];
}
$paths = get_post_meta(HOME_PAGE_ID, 'bread_paths_by_nodejs_crontab', true);
if(!$paths){ # avoid nodejs/crontab disable
$paths = get_post_meta(HOME_PAGE_ID, 'bread_paths', true);
}
$ary_paths = explode("\n", $paths);
#
$slug = '';
foreach(explode('/',$uri)as$v){
if($v){$slug=$v;} #get the last one post_name
}
$slug = str_replace("\r",'',$slug);
#
foreach($ary_paths as$v){
if(strlen($v)<=1){continue;}
$_= explode('<',$v);
$_0=str_replace("\r",'',$_[0]);
#if(isset($_GET['ee'])){echo$slug.'--'.$_0;var_dump($slug==$_0);echo'
';}
if($slug==$_0){
$count_ = count($_);
for($i=$count_-1;$i>0;$i--){
$href = str_replace("\r",'',$_[$i]);
$ret.=''.$ary_define_names[$href].'';
}
$ret.=''.$ary_define_names[$slug].'';
break;
}
}
} //end not-single
return''.$ret.'
';
}
define('TBL_EXAM','exam'); # might rename to exam_answer
define('TBL_EXAM_SCORE','exam_score'); # might rename to exam_answer_score
define('TBL_AM_I_STUDENT','am_i_student');
define('TBL_SUBSCRIBE', $table_prefix.'_subscribe');
define('TBL_SUBSCRI_HISTORY', $table_prefix.'_subscri_history');
/* 設定完成,請儲存檔案。然後開始 Blogging 吧! */
// error_reporting(E_ALL);
// ini_set('display_errors', 1);
/** WordPress 目錄的絕對路徑。 */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
define('MMR_CACHE_DIR', ABSPATH . 'fe'); # front-end
define('MMR_CACHE_URL', '/fe');
define('COMPETITION201803_OPEN_DATETIME', '2018-04-02 13:00');
define('TBL_COMPETITION_UPLOAD', 'competition_upload');
define('TBL_COMPETITION_TEAM', 'competition_team');
define('TBL_COMPETITION_MEMBER', 'competition_member');
define('COMPETITION_MAX_UPLOAD_TIMES', 25);
define('COMPETITION_DATA_FILEPATH', ABSPATH.'/competition_data/201803ans.csv'); #official
define('COMPETITION_TEAM_DATA_FILEPATH', ABSPATH.'/competition_data/team/'); #team
define('COMPETITION_TEAM_DATA_URI', WEB_URL.'competition_data/team/');
function get_competition_team_members($team_id=''){
global$wpdb;
$where = $team_id ? ' AND team_id='.$team_id : '';
$ret = $wpdb->get_results('SELECT * FROM '.TBL_COMPETITION_MEMBER.' INNER JOIN '.TBL_COMPETITION_TEAM.' USING(team_id) WHERE 1 '.$where);
return $ret;
}
function get_competition_team_name($school_no, $key=''){
global$wpdb;
$where = ' AND school_no="'.$school_no.'"';
$ret = $wpdb->get_row('SELECT * FROM '.TBL_COMPETITION_MEMBER.' INNER JOIN '.TBL_COMPETITION_TEAM.' USING(team_id) WHERE 1'.$where);
if(!$key){
return $ret;
}elseif($key=='team_id'){
return $ret->team_id;
}elseif($key=='team_name'){
return $ret->team_name;
}
}
if(0 and isset($_GET['amp'])){
die('
Hello, AMP world.
');
}
//check cache START
function get_keycloak_login_cache_cookie_value($string_keycloak_user){
return md5('academy---'.$string_keycloak_user.'---AI');
}
function get_keycloak_login_cache_row($cookie_value){
global$wpdb;
$sql='SELECT * FROM '.TBL_KEYCLOAK_LOGIN_CACHE. ' WHERE cookie_value="'.$cookie_value.'" AND create_datetime>=((NOW() - INTERVAL 30 DAY))';
$row = $wpdb->get_row($sql);
return $row;
}
function get_keycloak_user_by_session_or_cache(){
#var_dump($_SESSION['keycloak_user']); echo'
'; var_dump($_COOKIE[KEYCLOAK_COOKIE_KEY]);
// Session
if(isset($_SESSION['keycloak_user']) and $_SESSION['keycloak_user']){
// die(unserialize($_SESSION['keycloak_user']));
$data_unserialize = unserialize($_SESSION['keycloak_user']);
// return unserialize($_SESSION['keycloak_user']);
if($_SERVER['REMOTE_ADDR']=='61.222.27.93'){
// print_r($data_unserialize);
// die("###end###");
}
return $data_unserialize;
}
// Cookie
if(isset($_COOKIE[KEYCLOAK_COOKIE_KEY]) and $_COOKIE[KEYCLOAK_COOKIE_KEY]){
$cookie_value = $_COOKIE[KEYCLOAK_COOKIE_KEY];
$row = get_keycloak_login_cache_row($cookie_value);
if($row and $row->keycloak_user){
return unserialize(base64_decode($row->keycloak_user));
}
}
return null;
}
// // Save user into DB
// $ALSO_UPDATE_CACHEandDB_START_TIME = false; // unknow 100% Spec/Goal. Set `false` for current.
// $cookie_value=null;
// if(isset($_SESSION['keycloak_user']) and $_SESSION['keycloak_user']){ // from session
// $cookie_value = get_keycloak_login_cache_cookie_value($_SESSION['keycloak_user']);
// }elseif($ALSO_UPDATE_CACHEandDB_START_TIME){ // from cache
// $_keycloak_user_from_cache = serialize(get_keycloak_login_cache_row());
// if($_keycloak_user_from_cache){
// $cookie_value = get_keycloak_login_cache_cookie_value($_keycloak_user_from_cache);
// }
// }
// $bool = ((isset($_SESSION['keycloak_user']) and $_SESSION['keycloak_user']) # <--- means ONLY ADD/UPDATE while just loginned
// or $ALSO_UPDATE_CACHEandDB_START_TIME);
// #var_dump($bool);var_dump($cookie_value);
// if($bool){
// setcookie(KEYCLOAK_COOKIE_KEY, $cookie_value, time()+2678400); // 1 month
// $_keycloak_user = serialize(get_keycloak_user_by_session_or_cache());
// #var_dump($_keycloak_user); #var_dump($cookie_value);
// $row = get_keycloak_login_cache_row($cookie_value);
// if($row){
// $wpdb->update(TBL_KEYCLOAK_LOGIN_CACHE,
// array('create_datetime'=>shell_exec("date '+%Y-%m-%d %H:%M:%S'"), 'keycloak_user'=>base64_encode($_keycloak_user)),
// array('cookie_value'=>$cookie_value));
// }else{
// $wpdb->insert(TBL_KEYCLOAK_LOGIN_CACHE, array(
// 'cookie_value'=>$cookie_value,
// 'create_datetime'=>shell_exec("date '+%Y-%m-%d %H:%M:%S'"),
// 'keycloak_user'=>base64_encode($_keycloak_user),
// ));
// }
// }
// $uri = $_SERVER['REQUEST_URI'];
// $uri_without_querystring = explode('?',$uri)[0];
// $is_whitelist_no_need_student_login = false;
// $ary_bypass_uri = array(
// '/stedglogin',
// '/enter_logs',
// '/wp-admin',
// '/wp-login.php',
// '/tools/vimeo/',
// '/staff/',
// STUDENT_MGR_URL,
// '/exam/',
// '/notification/',
// '/vote/',
// '/aigc2023-ddmc',
// '/wp-content/themes/bridge/css/custom_css.php',
// '/wp-content/themes/bridge/css/style_dynamic.php',
// '/wp-content/themes/bridge/css/style_dynamic_responsive.php',
// '/wp-content/themes/bridge/js/default_dynamic.php',
// HR_WEB_URL
// );
// $ary_bypass_uri[] = '/student';
// $ary_bypass_uri[] = '/api/v2';
// $ary_bypass_uri[] = '/api';
// foreach($ary_bypass_uri as$uri){
// if(strpos($uri_without_querystring, $uri)===0){$is_whitelist_no_need_student_login=true;break;}
// }
// if($is_whitelist_no_need_student_login || $uri_without_querystring==='' || $uri_without_querystring==='/'
// || (isset($_GET['door_key']) && $_GET['door_key']==='sadfoiweuSLKJKLIOSFewS12148978090232lajslf')
// ){
// //do nothing
// }else{
// if(!can_view_content()){
// $KEYCLOAK_USER = get_keycloak_user_by_session_or_cache();
// # mgr can access class now.
// #if(is_mgr_student($KEYCLOAK_USER)){
// # header('location:http://video.aiacademy.tw/?cannot_access_class');
// # exit;
// #}
// die('');
// #die('');
// }
// }
$need_login_data = preg_match(AIA_CALENDAR_URL_PATTERN, $_SERVER['REQUEST_URI'])===1;
foreach(array('/competition-upload','/competition-upload-history', '/competition-result')as$v){
if(strpos($_SERVER['REQUEST_URI'], $v)===0){$need_login_data=true;break;}
}
# 20180327 START IBM Competition
// $u = wp_get_current_user();
// $user_login = ($u->user_login);
// if(in_array($user_login, array('fareastone','ibm')) and strpos($_SERVER['REQUEST_URI'], WEB_URL.'competition')!==0 and strpos($_SERVER['REQUEST_URI'], WEB_URL.'wp-admin')!==0 and $_SERVER['REQUEST_URI']!=='/' and strpos($_SERVER['REQUEST_URI'], '/wp-login.php')!==0){
// die('Not allow for this username.');
// }
# 20180327 END IBM Competition
#implement cache
$USE_CACHE = !isset($_GET['nc']); #nc means no_Vcache
if($USE_CACHE and !$need_login_data
and false # <-- because everypage need correct window.studentUserName
){
define('VCACHE_FOLDER_NAME', 'Vcache-aiaaia');
$uri = $_SERVER['REQUEST_URI'];
$a = explode('?', $uri); #while development
$uri = $a[0];
if($uri==='' || $uri==='/'){
$filename = 'DO-NOT-CACHE-AT-HOME';#'index';
}else{
if(substr($uri,0,1)==='/'){$uri=substr($uri,1);}
if(substr($uri,-1)==='/'){$uri=substr($uri,0,-1);}
$filename = str_replace('/', '---', $uri);
}
$cache_file = __DIR__.'/'.VCACHE_FOLDER_NAME.'/'.$filename;
if(file_exists($cache_file)){
$html = file_get_contents($cache_file);
if($html){
die($html);
}
}
}
function get_string_by_tmpl($str_tmpl, $dict=array()){
$ret = $str_tmpl;
foreach($dict as $k=>$v){
$ret = str_replace('{{'.$k.'}}', $dict[$k], $ret);
}
$ret = preg_replace('/{{.*?}}/', '', $ret);
return$ret;
}
function _get_week_day($date, $is_display_chinese_number=true){
$w = date('w',strtotime($date));
if($is_display_chinese_number){
$A = array('日','一','二','三','四','五','六');
return$A[$w];
}
return$w;
}
function post_request($url, $ary_data, $referer='') { # http://www.jonasjohn.de/snippets/php/post-request.htm
// Convert the data array into URL Parameters like a=b&foo=bar etc.
$data = http_build_query($ary_data);
// parse the given URL
$url = parse_url($url);
if ($url['scheme'] != 'http') {
die('Error: Only HTTP request are supported !');
}
// extract host and path:
$host = $url['host'];
$path = $url['path'];
// open a socket connection on port 80 - timeout: 30 sec
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp){
// send the request headers:
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
if ($referer != '')
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);
$result = '';
while(!feof($fp)) {
// receive the results of the request
$result .= fgets($fp, 128);
}
}
else {
return array(
'status' => 'err',
'error' => "$errstr ($errno)"
);
}
// close the socket connection:
fclose($fp);
// split the result header from the content
$result = explode("\r\n\r\n", $result, 2);
$header = isset($result[0]) ? $result[0] : '';
$content = isset($result[1]) ? $result[1] : '';
// return as structured array:
return array(
'status' => 'ok',
'header' => $header,
'content' => $content
);
}
/** 設定 WordPress 變數和包含的檔案。 */
require_once(ABSPATH . 'wp-settings.php');
// define('FS_METHOD', 'direct');
// define('WP_MEMORY_LIMIT', '256M');
// define('WP_MAX_MEMORY_LIMIT', '256M');