複数のテーブルを結合して、一つのテーブルのように見立てて、WHEREできる。
tb_menber
menber_id name birthday address
tb_profile
tall blood hobby
SELECT * FROM `tb_member` INNER JOIN `tb_profile`
すると
menber_id name birthday address tall blood hobby
に対して WHERE文が使える
複数のテーブルを結合して、一つのテーブルのように見立てて、WHEREできる。
tb_menber
menber_id name birthday address
tb_profile
tall blood hobby
SELECT * FROM `tb_member` INNER JOIN `tb_profile`
すると
menber_id name birthday address tall blood hobby
に対して WHERE文が使える
変数に紛れ込んでいる改行コードを削除する。
サーバー仕様、データベースの仕様によって挙動が違う
共通で使えそうなもの
$text = preg_replace('/\n|\r|\r\n/', "",$text);
デバイスの向きを判定するには「orientation」というプロパティになります。
//縦向きの場合 @media screen and (orientation:portrait){ p {font-size: 1em; } } //横向きの場合 @media screen and (orientation:landscape){ p {font-size: 1.2em; } }
portraitは縦向き、landscapeは横向きとなります。縦と横でCSSを切り替えることができます。
画面サイズ、ウィンドウサイズを取得するスクリプトです。
<p>画面サイズ:<span id="ScrSize"></span></p> <p>ウィンドウサイズ:<span id="WinSize"></span></p> <script type="text/javascript"> //画面サイズの取得 getScreenSize(); //ウィンドウサイズの取得 getWindowSize(); //画面サイズを取得する function getScreenSize() { var s = "横幅 = " + window.parent.screen.width + " / 高さ = " + window.parent.screen.height; document.getElementById("ScrSize").innerHTML = s; } //ウィンドウサイズを取得する function getWindowSize() { var sW,sH,s; sW = window.innerWidth; sH = window.innerHeight; s = "横幅 = " + sW + " / 高さ = " + sH; document.getElementById("WinSize").innerHTML = s; } </script>
これを元に
縦と横の数値を比較して
横のほうが大きければ
横使いようのレイアウトを返す。
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /web1.download/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /web1.download/index.php [L] </IfModule> # END WordPress
WordPressでパーマリンクが有効にならない時
mod_rewriteが効かないと勘違いしやすい
サーバー設定かと思い「http.conf」などを見て、動かいないはずがない、変だぞ!
そんなことにハマるケースも多いです。
.htaccess を見ても文法ばかりを気にして、ドメインが違っているなんて、気づきにくいことかもしれません。
またハマってしまったので。。。
4行目、8行目にドメインが記載されています。
PHPのソート関数では数値が昇順降順にならないという話も多いが
第二引数に「SORT_NUMERIC」を入れるとうまく行く
arsort($point_id_array, SORT_NUMERIC);
arsort asort は値とキーの関係を保ったままソートされる
array(8) { [2]=> string(4) "80.2" [3]=> string(4) "78.3" [1]=> string(4) "77.1" [4]=> string(4) "25.4" [0]=> string(3) "6.0" [6]=> string(3) "2.6" [7]=> string(3) "0.7" [5]=> string(3) "0.5" }
rsort sort は値とキーの関係を保たない
array(8) { [0]=> string(4) "80.2" [1]=> string(4) "78.3" [2]=> string(4) "77.1" [3]=> string(4) "25.4" [4]=> string(3) "6.0" [5]=> string(3) "2.6" [6]=> string(3) "0.7" [7]=> string(3) "0.5" }
border-radius: 20px;
-webkit-border-top-left-radius: 10px; -webkit-border-top-right-radius: 20px; -webkit-border-bottom-right-radius: 30px; -webkit-border-bottom-left-radius: 40px; -moz-border-radius-topleft: 10px; -moz-border-radius-topright: 20px; -moz-border-radius-bottomright: 30px; -moz-border-radius-bottomleft: 40px;
html5 では Javascript を使わなくてもできる。
input タグに placeholder=”SAMPLETEXT”
<input type="email" name="mail" placeholder="hsmt@example.com">
box-sizing:border-box;
hover でずれることがあるので
.box{ box-sizing:border-box; border:1px solid gray; } .box:hover{ border:1px solid gray; box-sizing:border-box; }
親に position: relative;
子に position: absolute;
と書くと親のサイズ内に子が収まるようになる。
#header { width: 100%; position: relative; background: url(./img/main.png); background-size: contain; border: 3px solid black; overflow: hidden; } /* 高さを幅の % に固定 */ #header:before { content: ""; display: block; padding-top: 44%; overflow: hidden; } #header_in { margin: 0; display: inline; position: absolute; top: 0; width: 100%; height: 100%; border: 1px solid red; }
CSSで背景に画像を敷いて、レスポンシブデザインにする場合
アスペクト比が維持できない。
幅は%指定でできる。
高さはどうするか?
#header { width: 100%; background: url(./img/main.png); border: 1px solid red; } /* 高さを幅の % に固定 */ #header:before { content: ""; display: block; padding-top: 35%; }
SELECT * FROM `table_name1` INNER JOIN `table_name2` ON table_name1.hoge_id = table_name2.dore_id
同じフィールド名があるときは「table_name.culumn_name」とするが
table_name.culumn_name OK
`table_name.culumn_name` NG
シングルクォーテーションでくくってはダメらしい。
$_SERVER[SERVER_NAME]
↑こういう使い方は動きますがNGです。
きちんとクォーテーションで囲んでやればOK
$_SERVER[“SERVER_NAME”]
カスタムフィールドは、wp_options というテーブルに保存されます。サイトの基本情報やプラグイン、テーマファイルなど、様々な設定情報と同じテーブルに保存されています。書き方も暗号かとおもうほど複雑難解です。慣れれば読めるようになります。
しかし、画像の場合ここには保存されずにIDのみが保存されます。
記事やページを記録する wp-posts というテーブルに保存されていますので、上記から抽出したIDを元にソートをかけると、やっと目的の画像ファイル名にたどり着けます。
↓wp_options
wordpress のデータベース構造は最小公倍数に設計されているのでとてもシンプルですが、構造がシンプルな代わりに保存方法が無限にありますので解析するにはかなりの熟練が必要です。
CSSなどでtableの幅を指定しても反映されないことがしばしばある。
対策は
table {
table-layout:fixed;
}
これで回避できる。
<a href="#menu" data-ajax="false">
data-ajax=”false” をつければページ内アンカーが有効になる
「SC_CartSession.php」内で処理するのだが
var_dump($_POST)
が採れる場所と空になる場所がある
よく読めばいいことなのだが割愛して$_POSTを取得できる場所
247行目付近の
if (!$find) { の中では「$_POST」を取得できる。
そこ(247行目付近)で一旦セッションなどに保存すれば他の場所でも利用できる。
他の場所でPOSTを採取しようとしてもできないので、とにかくここでSESSIONに仮保存する。
strtotime()
はUnixタイムスタンプを返す組み込み関数。日時の文字列を渡すとそれに応じたUNIXタイムスタンプを返してくれる。
で、strtotime()
は日時以外に、様々な相対日時を指定可能になっている。strtotime( "yesterday" )
とやると前日の午前0時0分0秒のUNIXタイムスタンプが返ってくる。これをdate()
関数と組み合わせて使うことで、相対日時を簡単に取得することができる。
以下はstrtotime()
で使える日時指定のリスト。
strtotime( "+1 day" )
が現在時のちょうど24時間後になるのに対し、strtotime( "tomorrow" )
だと明日の0時0分0秒が得られる。たまにstrtotime( "tomorrow" )
code>と
strtotime( "+1 day" )
は同じと書いているのを見かけるが間違い。異なった数値が返ってくるので使い分ける。 strtotime( "now" ) - strtotime( "today" )
で今日が始まって何秒経過したとかできて便利。
日を指定せず、YYYY-MMを与えるとその月の1日になり、Januaryのように英語月名を与えると今日の日付になる。
+1 month
を使う時は、日付まで指定して使うと予想外の値になる場合がある。例えば、strtotime( "2013-08-31 +1 month" )
とすると、返ってくる値は2013-09-30ではなく2013-10-01である。strtotime( "2013-08-30 +1 month" )
なら2013-09-
30になる。どうやら+1 month
は、単純に月に1を足しているだけのもよう。つまり、2013-08-31という値を+1 monthすると、まず2013-09-31という文字列を作成し、次いでこれを2013-10-01に変換しているようなのだ。よって、月送りには日付を指定せずに使うのが良い。
月末日は月によってバラバラなので、last day ofは非常に便利。「月」の項目でも説明したが、strtotime("2013-08-31 +1 month")
は10月1日になってしまう。2013年8月の翌月の末日を得たい場合は、strtotime( "last day of 2013-08 +1 month" )
とする。これで2013-09-30が得られる。
ただし、PHPのバージョンによっては(5.4.4以前?)、first day ofとlast day ofは動かない。確実に月初や月末を得たい場合はmktime()
を使う方が良い。mktime()
の第5引数を0にすると、前の月の末日が得られる。
config.inc.php に
$cfg[‘LoginCookieValidity’] = 604800;
を書くのは前提として
延長されずにタイムアウトしてしまう。
Debian系Linuxの場合
/etc/cron.d/php5 にセッションのクリア命令が書いてある
これをどうにかすればタイムアウトを延長できる。
$time = time() + 70 * 24 * 3600; // 70日有効, 第3引数に過去時間をセットする事で削除可能
setcookie(“クッキー名”, “内容”, $time, “/”);
クッキーの保存数に制限があるので
クッキー名[0],クッキー名[1],クッキー名[2]… のように並列にすると一つのクッキーとして扱われる。
削除と更新、上書き
上書きはできないので一旦削除する
setcookie(“クッキー名”, “内容”, – $time, “/”); // 時刻を負の数として時間切れにすることで削除とみなされ、上書きできるようになる。
取り出すときは
$cookie = $_COOKIE[クッキー名];
header(“Location: ” . $_SERVER[‘PHP_SELF’]);
これでPOSTやGETを持たない同一ページへリロードさせてしまう。
webサーバーに zlib1g-dev がないだけ。
apache 関連のファイルに mod_rewrite をロードさせようと追記して
apache再起動
。。。「すでにロードされている」メッセージ
でも、.htaccess が効かない
なぜだ?
/etc/apache2/sites-available/000-default.conf
↓編集前
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /home/hashimoto/www/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ServerName localhost </VirtualHost>
↓「Directory」を追記した
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /home/hashimoto/www/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ServerName localhost <Directory /home/hashimoto/www/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> </VirtualHost>
無事に .htaccess が反応するようになった。
CGIも動かなかったがここにかけば動くのだろう
ず〜っとひっかかっていたことがあるので、書きます。
EC-CUBE の制作で「status」って何?
「status」というのは「地位、権力」といった意味があります。
カタカナで書くと「スターテス」もしくは「ステイタス」です。
EC-CUEBは時々、間違った外来カタカタを使うことでも有名です。
「state」は「状態,ありさま,ようす,様相;事態,事情,形勢」という意味です。
なぜ、「state」とすべき箇所を「status」とするのか
答えは。。。。。簡単。。。。関係者が低知能なのです。
以前のバージョンでは
「footer」を「fotter」と書いてありました。
小学生レベルのローマ字読みですね。
「status」はどんなところで使われているのか?
商品の状態、公開か非公開か、まさに状態「state」と表現すべき箇所で「status」です。
同じように、受注の対応状況、「発送済み、入金待ち」など、まさに状態「state」と表現すべき箇所で「status」です。
まだまだ続きます
何でも複数形にしようとしたがる
例えば商品一覧
↓EC-CUBEでは puroducts_list なんです。
puroducts_list = 商品たち一覧
↓product_list でいいと思うのですが。
product_list = 商品_一覧
「たくさんあります。沢山リスト。」みたいに二回書くのが好きみたいです。
中学生レベルの複数形の表現くらいはマスターしてからプログラミング業務に従事してほしいものです。
これが日本のweb業界の平均以上というかTOPクラスの人たちの知能レベルです。
同じ日本人として恥ずかしい限りです。
画像の縦位置というか上下位置というか、中央に表示する。
.listphoto { width: 150px; height: 150px; border: 1px solid silver; display: table; } .listphoto .vertical_middle { width: 100%; height: 100%; display: table-cell; vertical-align: middle; } .listphoto .vertical_middle img { padding: 2px; max-height: 146px; max-width: 146px; border: none; vertical-align: middle; }
CORESERVER で発生した件
SMTPポートが465で接続できていたが、突然”SSL/TLSでの接続中に。。。”というエラーで接続できなくなった。
回避策
SMTPポートを”587”にしたら送信できた。
phpMyadminで「Cannot load or save configuration」とエラーが出ることがある。
phpMyadmin の直下に config というディレクトリを作れば解決する。
AUTO_INCREMENTの値として代入する数値は「’」コロンで囲まない。
$sql = "ALTER TABLE `dtb_products_class_product_class_id_seq` AUTO_INCREMENT = 777";
ついでに
EC-CUBE のあるバージョンで発生した事例。
CSVによる商品登録のさい
dtb_products_class_product_class_id_seq や dtb_products_product_id_seq において
・AUTO_INCREMENT を更新する
・sequence を更新する
両方更新しないと管理画面からの商品登録でエラーになる。
define (‘ADMIN_FORCE_SSL’, TRUE);
が原因、FALSEにすれば直る
さくらサーバーの公式マニュアルでは「 PASVモード 」ON と書いてあるが、OFFしないと接続できないケースもあった。
レンタルサーバー|さくらインターネット に EC-CUBEを設置するには少々コツがいります。
ファイルパーミッション(アクセス権)は
ディレクトリ(フォルダ): 0705
*.php: 0705
*.tpl: 0705
その他のファイル: 0604
EC-CUBEのルートディレクトリにある.htaccess は削除します。
かわりにサーバーの管理画面からphp.iniが設定できるので、 magic_quotes_gpc = off にします。
エラーメッセージ、問題ないが多くの警告が表示されますので、これもOFFにします。
パラメータの IMAGE_SIZE 「画像サイズ制限(KB)」 を変更する。
dtb_blocposition を操作することで対応できる。
device_type_id | PC=10、携帯電話=1、スマートフォン=2 |
---|---|
page_id | トップページ=1、一覧ページ=2、詳細ページ=3、マイページ=4、その他カスタムで作成したページへID付与。(dtb_pagelayout参照) |
target_id | 0=Unused、1=LeftNavi、2=MainHead、3=RightNavi、4=MainFoot、5=TopNavi、6=BottomNavi、7=HeadNavi、8=HeaderTopNavi、9=FooterBottomNavi、10=HeaderInternalNavi (mtb_target参照) |
bloc_id | カテゴリー=1、利用ガイド=2、かごの中=3等。(dtb_bloc参照) |
bloc_row | カラム内でのブロックの表示優先順位。0は非表示で、target_idに5(未使用ブロック)が選択されている場合に設定可能。 |
filename | カテゴリー=1、利用ガイド=2、かごの中=3等。(dtb_bloc参照)bloc_idと対応している。 |
ブロックIDを調べるには dtb_bloc を見る。
参考処理コード
<html dir="ltr" lang="ja"> <head> <meta charset="UTF-8" /> </head> <body> <?php include './data/config/config.php'; $db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD); mysql_query("SET NAMES utf8"); mysql_select_db(DB_NAME, $db); $sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '1'"; $rs1 = mysql_query($sql1,$db); $item1 = mysql_fetch_assoc($rs1); var_dump($item1); // ページIDのMAX $page_id_max = '37'; // 表示するカラムID $target_id = '3'; $sql1 = "SELECT * FROM `dtb_blocposition`"; $rs1 = mysql_query($sql1,$db); // UPDATE while($item1 = mysql_fetch_assoc($rs1)){ if( ( ($item1[bloc_id] == 6) || ($item1[bloc_id] == 3) || ($item1[bloc_id] == 8) || ($item1[bloc_id] == 2) || ($item1[bloc_id] == 10) ) && ($item1[device_type_id] == 10) ){ // 表示順 if($item1[bloc_id] == 6){ $bloc_row = 0; }elseif($item1[bloc_id] == 3){ $bloc_row = 1; }elseif($item1[bloc_id] == 8){ $bloc_row = 2; }elseif($item1[bloc_id] == 2){ $bloc_row = 3; }elseif($item1[bloc_id] == 10){ $bloc_row = 4; } // 表示する $sql2 = "UPDATE `dtb_blocposition` SET `target_id` = '$target_id', `bloc_row` = '$bloc_row' WHERE `device_type_id`='10' AND `page_id`='$item1[page_id]' AND `bloc_id`='$item1[bloc_id]'"; }else{ // 表示しない(カラム) $sql2 = "UPDATE `dtb_blocposition` SET `target_id` = '0', `bloc_row` = '0' WHERE `device_type_id`='10' AND `page_id`='$item1[page_id]' AND `bloc_id`='$item1[bloc_id]'"; } // echo $sql2.'<br>'; $rs2 = mysql_query($sql2,$db); } // 該当ページの、該当ブロックの登録がない場合はINSERT // 表示するブロックIDの配列 $array_block_id = array(6,3,8,2,10); // 該当ページIDをループ for($i = 0; $i <= $page_id_max; $i ++){ $page_id = $i; for($a = 0; $array_block_id[$a] != ''; $a ++){ $sql3 = "SELECT * FROM `dtb_blocposition` WHERE `device_type_id`='10' AND `page_id`='$page_id' AND `bloc_id`='$array_block_id[$a]'"; $rs3 = mysql_query($sql3,$db); $item3 = mysql_fetch_assoc($rs3); // var_dump($item3); // echo '<br>'; if($item3 == ''){ // 表示順 if($array_block_id[$a] == 6){ $bloc_row = 0; }elseif($array_block_id[$a] == 3){ $bloc_row = 1; }elseif($array_block_id[$a] == 8){ $bloc_row = 2; }elseif($array_block_id[$a] == 2){ $bloc_row = 3; }elseif($array_block_id[$a] == 10){ $bloc_row = 4; } $sql4 = "INSERT INTO `dtb_blocposition` ( `device_type_id`, `page_id`, `target_id`, `bloc_id`, `bloc_row`, `anywhere` ) VALUES ( '10', '$page_id', '$target_id', '$array_block_id[$a]', '$bloc_row', '0' )"; // echo $sql4.'<br>'; $rs4 = mysql_query($sql4,$db); } } } echo '処理完了!'; ?> </body> </html>
EC-CUBE では、
基本情報管理 → 郵便番号DB登録
で 郵便番号の住所変換が出来るようになる。
しかし 「郵便番号DB登録」は とても時間がかかる。
サーバーのスペックにもよるが30分くらいかかるケースも少なくない。
下記のようにSQL文を書いて流し込むと
遅いサーバーでも10秒くらいで出来る。
処理の流れとしては、
1) KEN_ALL_utf-8.CSV を一行ずつ読み込む
2)「,」カンマで分割して、SQL文を発行する
$line = file('./data/downloads/KEN_ALL_utf-8.CSV'); for($i = 0; $line[$i] != ''; $i ++){ // for($i = 0; $i <= 10; $i ++){ echo $i.'<br>'; $array = explode(",", $line[$i]); $sql1 = "INSERT INTO `mtb_zip` ( `code`, `old_zipcode`, `zipcode`, `state_kana`, `city_kana`, `town_kana`, `state`, `city`, `town`, `flg1`, `flg2`, `flg3`, `flg4`, `flg5`, `flg6` ) VALUES ( '$array[0]','$array[1]','$array[2]','$array[3]','$array[4]','$array[5]','$array[6]','$array[7]','$array[8]','$array[9]','$array[10]','$array[11]','$array[12]','$array[13]','$array[14]' )"; $rs1 = mysql_query($sql1,$db); // echo $sql1.'<br>'; }
私がすごいのではない。
EC-CUBE がダメダメなのだ(--;
<ul> <?php $category_recent_post = 5; // 記事数 $category_recent_id = 1; // カテゴリID $posts = get_posts('numberposts=' . $category_recent_post . '&category=' . $category_recent_id); global $post; if($posts) { foreach($posts as $post) { setup_postdata($post); echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>'; } } ?> </ul>
array_push の値を配列にするだけである。
array_push($array, array(value1,value2,value3,…));
ユーザー名やパスワードが間違っていない。
config.inc.php が間違っていない。
ログインがエラーにならないのに
ログイン画面に戻ってしまう。
ブラウザによっては「アクセスが拒否されました」と表示される。
つまり、パスワード云々ではなく、拒否される
権限が無いのね。
試しに
phpMyadmin/setup にアクセスしてみる。
↓こんなエラーだ
session_start(*************): open failed: Permission denied (13)
セッションが書き込めないのね、ということで
/var/lib/php/session のパーミッションを確認する
[root@hogehoge php]# ls -l
drwxrwx— 2 apache apache session
apache からの書き込みがOKでも動かない
動いているサーバーの設定を見てみると
webユーザーにも許可が出ている。
webユーザーも読み書きできるようにパーミッションを変えたら
phpMyadmin が無事に動きました。
EC-CUBEやWordpressは動いていたので、session_save_path を疑いませんでしたが
彼らは session_save_path を指定して権限を付与している。
phpMyadmin はデフォルトのsession_save_path を使っている。
session_save_path を指定して、権限を付与するのもOKってことですね。
俗に言う「(タグ許可)」です。
confium.php を見てみると
<!–{$arrForm.note|h|nl2br}–>
<!–{$arrForm.main_comment|nl2br_html}–>
|h|nl2br → |nl2br_html
これだけです。
。。。おっと、待った。
まだでした。
LLTEXT_LEN にしてあげたほうがいいですね。
wordpressの検索で複数キーワードは使えないのか?
半角カンマで区切ればできますが、
スペース区切りとかではNGです。
。。。直すしかない。
「WP Multibyte Patch プラグイン」を有効にするだけです。
「文字数ベース」抜粋の補助機能を提供します。抜粋の最大文字数と more 文字列を設定ファイルより変更できます。
言語設定が ja の場合、デフォルトで文字列カウント方式の設定を「文字数ベース」に固定します。
検索の際に全角スペースを区切り文字として認識させます。また、検索文字列内の重複するスペースを取り除きます。
送信メールのエンコーディングを JIS (ISO-2022-JP) 、UTF-8、自動判別の3つのモードから選ぶことができます。有効時のデフォルトは JIS (ISO-2022-JP) です。WordPress 本体の実装とは異なり、UTF-8 モードではボディ部も base64 エンコード (7bit) します。
日本語を含む多くのエンコーディングのデータが破壊される問題を修正します。
マルチバイト文字で書かれたページからのピンバック処理機能一式 (エンコーディング検出、変換、トリム) を実装します。また、一部の UTF-8 文字が破壊される問題を修正します。
マルチバイトを含むファイル名のファイルがアップロード、またはメール添付された場合にファイル名を md5 に変換します。
bp_create_excerpt() でマルチバイト投稿の抜粋が作られない問題を修正します。HTML タグを取り除いた形の文字数ベースの抜粋を生成します。本機能はデフォルトではオフになっておりますので、ご利用の際は wpmp-config.php を編集して有効化してください。
ご注意: Activity の抜粋機能は表示時ではなく Activity データ記録時の実データに適用されます。また、抜粋化されるタイプとされないタイプの投稿があります。これらは BuddyPress の仕様によるものですのでご了承ください。
Twenty Twelve テーマの Open Sans Web フォントが一部ブラウザにおいて日本語表示の不具合を引き起こす問題の対応として、翻訳ファイルの有無に関わらず当該フォントの無効化を行う機能を提供します。
設定ファイル (wpmp-config.php) から各パッチ機能を個別に有効化・無効化できます。
データベースのオーバーヘッドは、INSERT、DELETE、UPDATEを行っているうちにできるゴミ(未使用)領域のようなものです。
これを解消するためには、テーブルの最適化が必要です。
phpMyAdminからDB表示、画面一番下の「オーバーヘッドのあるテーブルを確認」→チェックが入る→ドロップダウンリストから「テーブルを最適化する」、で実行できます。
記事ID
<?php the_ID();>?
IDが表示されてしまう。
<?php $id = get_the_ID(); echo $id; ?>
自由にPHPで利用したり出来る。
<style> .fadein { position:relative; height:332px; width:500px; } .fadein img { position:absolute; left:0; top:0; } </style> <script> $(function(){ $('.fadein img:gt(0)').hide(); setInterval(function(){$('.fadein :first-child').fadeOut().next('img').fadeIn().end().appendTo('.fadein');}, 7000); }); </script> <div class="fadein"> <img src="<!--{$TPL_URLPATH}-->img/index-image1.jpg"> <img src="<!--{$TPL_URLPATH}-->img/index-image2.jpg"> <img src="<!--{$TPL_URLPATH}-->img/index-image3.jpg"> </div>
現在
mktime()
指定日時
mktime('時', '分', '秒', '月', '日', '年',)
EC-CUBEで、ブログなどから直接買い物かごに入れる場合などに利用する。
<form name="form1" id="form1" method="post" action="'.ROOT_URLPATH.'products/detail.php?product_id='.$item1[product_id].'"> <input type="hidden" name="transactionid" value="'.$_SESSION[transactionid].'" /> <input type="hidden" name="mode" value="cart" /> <input type="hidden" name="product_id" value="'.$item1[product_id].'" /> <input type="hidden" name="product_class_id" id="product_class_id4" value="'.$item2[product_class_id].'" /> <input type="hidden" name="quantity" value="1" /> <input type="image" src="'.ROOT_URLPATH.'user_data/packages/default/img/set-cart.jpg"> </form>
※ 注意点
http://hogehoge.com/car に投げても商品は入りません。
あて先は「 products/detail.php?product_id=123 」
post する mode は cart
追加言語のインストール中 JA:
. . .
Error_occurred
なんてエラーで止まる。
原因は「ftp_connect」関数が使えないことらしい。
Windowsサーバーではインストールできないということだ。
でもWindowsサーバーで動かす方法はある。
Linuxサーバーでインストールしたものを移植すればいい。
公式マニュアルより
http://manual.cs-cart.jp/?page_id=347
CS-Cart日本語版v2.1.4-jp-1よりPHP標準の「ftp_connect」関数が利用できないサーバーはCS-Cartアップグレード時に手動でのファイルパーミッション操作が必要などの理由よりインストールができなくなっております。
data/class/SC_CustomerList.php
336行目付近
「 // 検索用SQL 」にフィールドを追加する。
「検索用」と書かれているが、「検索結果の表示用」にも流用しているらしい。
まぎらわしい。
この記事ではWordpress3.2を使用しています。
さっそくですがカテゴリー編集画面に項目を追加してみましょう。
現在使用している「functions.php」に以下を追加します。
functions.php
add_action ( 'edit_category_form_fields', 'extra_category_fields'); function extra_category_fields( $tag ) { $t_id = $tag->term_id; $cat_meta = get_option( "cat_$t_id"); ?> <tr class="form-field"> <th><label for="extra_text">その他テキスト</label></th> <td><input type="text" name="Cat_meta[extra_text]" id="extra_text" size="25" value="<?php if(isset ( $cat_meta['extra_text'])) echo esc_html($cat_meta['extra_text']) ?>" /></td> </tr> <tr class="form-field"> <th><label for="upload_image">画像URL</label></th> <td> <input id="upload_image" type="text" size="36" name="Cat_meta[img]" value="<?php if(isset ( $cat_meta['img'])) echo esc_html($cat_meta['img']) ?>" /><br /> 画像を追加: <img src="images/media-button-other.gif" alt="画像を追加" id="upload_image_button" value="Upload Image" style="cursor:pointer;" /> </td> </tr> <?php }
項目を追加したい場合は「$cat_meta」の配列名を変更して追加してください。
これでカテゴリー編集画面を見ると下図のようになっているはずです。
項目を追加しただけでは保存されませんので、保存する処理を記述しましょう。
先ほど記述した「extra_category_fields」の下に追加します。
functions.php
add_action ( 'edited_term', 'save_extra_category_fileds'); function save_extra_category_fileds( $term_id ) { if ( isset( $_POST['Cat_meta'] ) ) { $t_id = $term_id; $cat_meta = get_option( "cat_$t_id"); $cat_keys = array_keys($_POST['Cat_meta']); foreach ($cat_keys as $key){ if (isset($_POST['Cat_meta'][$key])){ $cat_meta[$key] = $_POST['Cat_meta'][$key]; } } update_option( "cat_$t_id", $cat_meta ); } }
追加した項目がテキストフィールドだけなら必要ありませんが、今回は画像フィールドもあるので、その場でアップロードできるようにcssとjsを読み込みます。
まずは新しいjavascriptを作成します。
upload.js
(function($) { $(function() { $('#upload_image_button').click(function() { formfield =$('#upload_image').attr('name'); tb_show('', 'media-upload.php?type=image&post_id=&TB_iframe=true'); return false; }); window.send_to_editor = function(html) { imgurl = $('img',html).attr('src'); $('#upload_image').val(imgurl); tb_remove(); } }); })(jQuery);
このjsファイルは「upload.js」として現在使用しているテーマの「js」フォルダに保存します。
次に「functions.php」に戻って下記を追加します。
functions.php
add_action('admin_print_scripts', 'my_admin_scripts'); add_action('admin_print_styles', 'my_admin_styles'); function my_admin_scripts() { global $taxonomy; if( 'category' == $taxonomy ) { wp_enqueue_script('media-upload'); wp_enqueue_script('thickbox'); wp_register_ script('my-upload', get_bloginfo('template_ directory') .'/js/upload.js'); wp_enqueue_script('my-upload'); } } function my_admin_styles() { global $taxonomy; if( 'category' == $taxonomy ) { wp_enqueue_style('thickbox'); } }
これで画像を追加の横のアイコンをクリックすると、いつもの画像を挿入するウィンドウが表示されます。
入力したデータをテンプレートで表示してみます。
ここではリスト表示をしてみます。
<ul class="clearfix"> <?php $tag_all = get_terms("category", "fields=all"); foreach($tag_all as $value): $cat_data = get_option('cat_'.intval($value->term_id)); ?> <li> <?php echo esc_html($value->name) ?> <img src="<?php echo esc_html($cat_data['img']) ?>" width="110" height="110" /> <?php echo esc_html($cat_data['extra_text']) ?><br /> </li> <?php endforeach; ?> </ul>
カテゴリーで追加したカスタムフィールドのデータは「wp_options」に保存されていますので、「term_id」でidを取得したら「get_option」で取得できます。
WordPress にデザインをかけようとするとデフォルトのCSSが細かすぎて厄介者だ!
毎日のようにWordpressを使っていると無駄を省きたいと考えるのは皆同じことだろう。
最近主流のデザインは
ヘッダーやフッターの背景は画面いっぱい、ヘーダーの内容・フッターの内容は指定幅、というものがほとんどだ。
下記のようなCSSを基本にスタートすると作業が早い。
※ID名・クラス名が増えているので、注意する。
herder.php と footer.php に<3つ(#header_inner、#main_inner、#footer_inner)を追記することが必須です。 ↓style.css
/* Theme Name: Twenty Eleven Theme URI: http://wordpress.org/extend/themes/twentyeleven Author: the WordPress team Author URI: http://wordpress.org/ Description: The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. Make it yours with a custom menu, header image, and background -- then go further with available theme options for light or dark color scheme, custom link colors, and three layout choices. Twenty Eleven comes equipped with a Showcase page template that transforms your front page into a showcase to show off your best content, widget support galore (sidebar, three footer areas, and a Showcase page widget area), and a custom "Ephemera" widget to display your Aside, Link, Quote, or Status posts. Included are styles for print and for the admin editor, support for featured images (as custom header images on posts and pages and as large images on featured "sticky" posts), and special styles for six different post formats. Version: 1.4 License: GNU General Public License v2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Tags: dark, light, white, black, gray, one-column, two-columns, left-sidebar, right-sidebar, fixed-width, flexible-width, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready Text Domain: twentyeleven */ /* =Reset default browser CSS. Based on work by Eric Meyer: http://meyerweb.com/eric/tools/css/reset/index.html -------------------------------------------------------------- */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { border: 0; font-family: inherit; font-size: 100%; font-style: inherit; font-weight: inherit; margin: 0; outline: 0; padding: 0; vertical-align: baseline; } :focus {/* remember to define focus styles! */ outline: 0; } body { background: #fff; line-height: 1; } ol, ul { list-style: none; } table {/* tables still need 'cellspacing="0"' in the markup */ border-collapse: separate; border-spacing: 0; } caption, th, td { font-weight: normal; text-align: left; } blockquote:before, blockquote:after, q:before, q:after { content: ""; } blockquote, q { quotes: "" ""; } a img { border: 0; } narticle, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } /* ここからデザイン ------------------------------------------------------*/ html {} body { font-family: "メイリオ", meirio, Verdana,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic Pro","MS Pゴシック","MS PGothic",sans-serif; font-size: 12px; line-height: 20px; } #page { } /* カラム割 -------------------------------------------------------*/ /* メニューバー、背景を画面幅いっぱいに、でもコンテンツは指定幅にという流行のレイアウトに対応 画面幅のカラム(インデントなし) 指定幅のカラム(インデントあり) */ #header { } #header_inner { width: 1000px; margin: 0 auto; } #main { width: 1002px; margin: 0 auto; } #main_inner { float: left; width: 1000px; margin: 0 auto; } #footer { clear: both; } #footer_inner { width: 1000px; margin: 0 auto; } /* メインカラムとサイドバーの関係 */ #primary { float: right; width: 696px; } #secondary { float: left; width: 300px; } /* レイアウト確認Border #header, #header_inner, #main, #main_inner, #footer, #footer_inner, #primary, #secondary {border: 2px solid red; }*/ #header { border: 1px solid skyblue; } #header_inner { border: 1px solid limegreen; } #main_inner { border: 1px solid gray; } #primary { border: 1px solid mediumvioletred; } #secondary { border: 1px solid mediumturquoise; } #footer { border: 1px solid blueviolet; } #footer_inner { border: 1px solid magenta; } /* EOF)カラム割 */ /* =Print ----------------------------------------------- */ @media print { body { background: none !important; font-size: 10pt; } footer.entry-meta a[rel=bookmark]:link:after, footer.entry-meta a[rel=bookmark]:visited:after { content: " [" attr(href) "] "; /* Show URLs */ } #page { clear: both !important; display: block !important; float: none !important; max-width: 100%; position: relative !important; } #branding { border-top: none !important; padding: 0; } #branding hgroup { margin: 0; } #site-title a { font-size: 21pt; } #site-description { font-size: 10pt; } #branding #searchform { display: none; } #branding img { display: none; } #access { display: none; } #main { border-top: none; box-shadow: none; } #primary { float: left; margin: 0; width: 100%; } #content { margin: 0; width: auto; } .singular #content { margin: 0; width: 100%; } .singular .entry-header .entry-meta { position: static; } .entry-meta .edit-link a { display: none; } #content nav { display: none; } .singular .entry-header, .singular .entry-content, .singular footer.entry-meta, .singular #comments-title { margin: 0; width: 100%; } .singular .hentry { padding: 0; } .entry-title, .singular .entry-title { font-size: 21pt; } .entry-meta { font-size: 10pt; } .entry-header .comments-link { display: none; } .page-link { display: none; } .singular #author-info { background: none; border-bottom: none; border-top: none; margin: 2.2em 0 0; padding: 0; } #respond { display: none; } .widget-area { display: none; } #colophon { display: none; } /* Comments */ .commentlist > li.comment { background: none; border: 1px solid #ddd; -moz-border-radius: 3px 3px 3px 3px; border-radius: 3px 3px 3px 3px; margin: 0 auto 1.625em; padding: 1.625em; position: relative; width: auto; } .commentlist .avatar { height: 39px; left: 2.2em; top: 2.2em; width: 39px; } .commentlist li.comment .comment-meta { line-height: 1.625em; margin-left: 50px; } .commentlist li.comment .fn { ndisplay: block; } .commentlist li.comment .comment-content { margin: 1.625em 0 0; } .commentlist .comment-edit-link { display: none; } . commentlist > li::before, .commentlist > li.bypostauthor::before { content: ''; } .commentlist .reply { display: none; } /* Post author highlighting */ .commentlist > li.bypostauthor { color: #444; } .commentlist > li.bypostauthor .comment-meta { color: #666; } .commentlist > li.bypostauthor:before { content: none; } /* Post Author threaded comments */ .commentlist .children > li.bypostauthor { background: #fff; border-color: #ddd; } .commentlist .children > li.bypostauthor > article, .commentlist .children > li.bypostauthor > article .comment-meta { color: #666; } } /* =IE7 ----------------------------------------------- */ #ie7 article.intro { margin-left: -7.6%; margin-right: -7.6%; padding-left: -7.6%; padding-right: -7.6%; max-width: 1000px; } #ie7 section.featured-post { margin-left: -7.6%; margin-right: -7.6%; max-width: 850px; } #ie7 section.recent-posts { margin-right: 7.6%; } /* =IE8 ----------------------------------------------- */ #ie8 section.feature-image.large img { width: 100%; }
バージョン差分を手作業で反映した場合、バージョン番号が古いままになってしまうので、書き換える。
/data/class/SC_Initial.php の40行目付近
「My WordPress Cheat Sheet」というサイトで、Wordpressのテンプレート用のタグのチートシートが公開されている。便利なので(。_。)φメモメモ ・・・ウッシッシ
<?php if(have_posts()) : ?> <?php while(have_posts()) : the_post(); ?> // HTMLやPHPのコード <?php endwhile; ?> <?php else : ?> <?php endif; ?>
<?php get_header(); ?> <?php get_sidebar(); ?> <?php get_footer(); ?> <?php comments_template(); ?>
<?php bloginfo('name'); ?> - ブログタイトル <?php bloginfo('charset'); ?> - ブログのcharset <?php bloginfo('description'); ?> - キャッチフレーズ <?php bloginfo('url'); ?> - ブログのURL <?php bloginfo('rss2_url'); ?> - RSSのURL <?php bloginfo('template_url'); ?> - テンプレートディレクトリのURL <?php bloginfo('pingback_url'); ?> - トラックバックのURL <?php bloginfo('stylesheet_url'); ?> - CSSファイルのURL <?php bloginfo('wpurl'); ?> - WordPressのURL
is_home() // メインページかどうか is_front_page() // フロントページかどうか is_single() // 個別記事のページかどうか is_sticky() - check if a post is sticky is_page() // 個別ページかどうか is_category() // あるカテゴリーのアーカイブページかどうか
<?php the_time(); ?> - 記事の投稿時間 <?php the_date(); ?> - 記事の投稿月日 <?php the_title(); ?> - 記事のタイトル <?php the_permalink(); ?> - 記事のパーマリンク <?php the_category(); ?> - 記事のカテゴリ <?php the_author(); ?> - 記事の投稿者 <?php the_ID(); ?> - 記事のID <?php wp_list_pages(); ?> - 全ページのリスト出力 <?php wp_tag_cloud(); ?> - タグクラウド <?php wp_list_cats(); ?> - 全カテゴリのリスト出力 <?php get_calendar(); ?> - カレンダー <?php wp_get_archives() ?> - 日付別アーカイブリスト <?php posts_nav_link(); ?> - 記事の前後のページへのリンク <?php next_post_link(); ?> - 記事の次のページへのリンク <?php previous_post_link(); ?> - 記事の前のページへのリンク
// カテゴリーベース <ul id="menu"> <li <?php if(is_home()) { ?> class="current-cat"<?php } ?>> <a href="<?php bloginfo('home'); ?>">Home</a></li> <?php wp_list_categories('title_li=&orderby=id'); ?> </ul> // ページベース <ul id="menu"> <li <?php if(is_home()) { ?> class="current_page_item"<?php } ?>> <a href="<?php bloginfo('home'); ?>">home</a></li> <?php wp_list_pages('sort_column=menu_order&depth=1&title_li='); ?> </ul>
<?php query_posts('category_name=Name&showposts=10'); ?>
<?php include (TEMPLATEPATH . '/searchform.php'); ?>