Category Archives: PHP

初心者による初心者のためのPHP講座 第3回 文字列

※「\」が「\」に見える場合は、別のPCからアクセスする事をお勧めする。この記事では、意図して「\」を使用しており、「\」と「\」の区別が出来たほうが分かりやすい。 「文字列」とは、文字を集まり、つまりは文字で書かれた単語や文の事を指し、単語、文の長さに関係なく、PHPで文字列を扱う際は、それが文字列である事を表す構文を使う必要がある。 「第2回 PHPの基本構造」でも、echo()関数の引数として文字列を用いている。 例えば「こんにちは」と表示させたい時は、echo()関数を用いて <?php echo “こんにちは”; ?> と命令文を書く必要がある。 「”こんにちは”」の部分が文字列であり、文字列を扱う場合は、文字列を「”」または「’」で囲む方法が良く用いられる。 このルールは、関数の引数として文字列を扱う場合だけでなく、変数に代入したり、条件式で用いる場合なども同様である。(変数と条件式は別の機会に説明する。) 引用符 「’」で文字列を囲む方法は、文字列の始まりと終わりを意味する「’」を文字列に直接書きこむ事が出来ない。 しかし、「’」の前に「\」または「\」を置き、「\’」または「\‘」とすることで、文字列内に「’」を書きこむことが出来る。 ※バックスラッシュ「\」は、多くの日本語フォントでは「\」と表示されるが、同じ意味であり、日本語キボード上でも「\」と表示されているが、入力は「\」で良い。 また、「\」または「\」も同様に直接記述することが出来ず、「\」または「\」を記述する場合は、「\\」または「\\」とする必要がある。 文字列に空白、改行が含まれる場合は、空白と改行は、そのまま文字列に反映される。 <!doctype html> <?php echo ‘<?xml version=”1.0″ encoding=”utf-8″?>’; ?> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml” lang=”ja” xml:lang=”ja”> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title>引用符を使った文字列</title> </head> <body> <?php echo ‘\’こんにちは\’<br />’; echo ‘\\こんにちは\\’; ?> </body> </html> 上記のスクリプトの実行結果を表示 以上のような「\」または「\」を使った特殊な記述を「エスケープシーケンス」と言う。 エスケープシーケンスには、「\」または「\」を文字の前に置く以外に、特別なコードで置き換える方法もあり、構文やシステム都合のよる理由で、文字そのままでは不都合が生じる場合や文字で表現できない場合は、特別な文字や機能を特別なコードで置き換えたもの使用することがあり、これら全般をエスケープシーケンスと読んでいる。 ここで言うエスケープシーケンスは、狭義のものであるが、その他のエスケープシーケンスについては、別の機会に説明する。 また、特殊な文字や機能をエスケープシーケンスで置き換えることを「エスケープする」と言う。 なお、ここまでは、「\」と「\」の両方を表記してきたが、以後は「\」をもってエスケープシーケンスを意味し、エスケープされた文字を意味するものとする。 二重引用符 文字列は、「”」で囲む場合は、文字列内でも「’」の使用が許されるが「”」を使用する際は、「\”」とする必要がある。 また引用符「’」の場合と異なり、様々なエスケープシーケンスを文字列中に使用することが出来る。 \n ・・・ UNIX系の改行(LF)を意味する。 \r ・・・ 昔のMacなどの改行(CR)を意味するが、文字列中で改行させたい時は、通常は\nを使う。 \t ・・・ タブ(水平タブ)を意味でする。 \v ・・・ 垂直タブを意味する。PHP 5.2.5以降でサポート。 \f ・・・ フォームフィード(FF)。PHP 5.2.5以降でサポート。 \$ ・・・ ドル記号。 \\ ・・・ バックスラッシュ。 上記以外に(アスキー)文字の8進数表記を「\nnn」、16進数表記を「\xnn」と書くことも出来る。 ※nは、8進数の場合は、0から7の数字で、16進数の場合は、数字の0から9およびアルファベットのaからf。 「\n」での改行は、タグの「<br />」を意味しておらず、あくまでHTMLソース上の改行であるため、ブラウザ上で反映されるわけではない、効果を確認するためにはブラウザでソースを見ること。 例えば、PHPでHTMLタグを含む文字列を表示させる場合、「\n」を使って改行を入れるとソースも見やすくなる。 「\r\n」は「CRLF」、つまりWindowsなどの改行コードとなる。 インターネットプロトコルでは、意外にもUNIX系の「LF」でなく、DEC系の「CRLF」が使われてきた経緯もあり、改行コードとして「CRLF」が必要なケースもあり得るので、使う機会があるかもしれない。 ともかく、改行コードの扱いはシステムによって事なる場合があり、意外に曲者なので、記憶しておくとトラブルの際の助けになるかもしれない。 私の経験では、ダウンロードしたPHPのメールフォームで送信されたメールが、メーラーのよっては正常に表示されず、メールフォーム自体もインターネットの決まりごと(RFC)を順守したものだったが、決まりを順守しない方向に改行コードを変更したら、問題が解消した経験がある。 エスケープシーケンス以外の特徴として、文字列内に変数を直接記述し、変数を使用することが許される。(文字列内で変数が展開される。) 変数の直後に文字が続く場合は、変数の終わりが判断できなくなるため、「{$text}」のように「{}」で囲むと良い。 ちなみに、関数を「{}」で囲むことで、文字列内に関数の戻り値を展開することも出来るのだが、本来、仕様にない事かもしれないので、使わない方が良いかもしれない。 文字列に空白、改行が含まれる場合は、空白と改行は、そのまま文字列に反映される。 以下のサンプルでは「変数」を使用しているが、変数については別の機会に説明する。 <!doctype html> <?php echo ‘<?xml version=”1.0″ encoding=”utf-8″?>’; ?> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml” lang=”ja” xml:lang=”ja”> <head> <meta http-equiv=”Content-Type” … 続きを読む →

Posted in PHP, PHP講座, ネット・PC | Tagged | 2 Comments

初心者による初心者のためのPHP講座 第2回 PHPの基本構造

第2回では、PHPプログラムの基本構造について説明する。 プログラミング環境の準備 前回、テキストエディタの準備が必要であることを書いたが、「TeraPad」を例に話を進めてゆく。 インストールが完了したら、まず、文字コードと改行コードの設定しておくと良いだろう。 「TeraPad」の場合は、「表示」メニューから「オプション」を実行し、「文字コード」タブを開くと、ファイルを開いた際の文字コードである「初期文字コード)」保存する際の文字コードである「保存文字コード」の設定が出来るようになっているので、それぞれ設定しておく事。 テキストにマルチバイト文字を含まない限り、文字コードの「自動判別」は効かないので、意識しなくとも意図した文字コードで保存されるようにするためにも必要な設定である。 PHPは、Unix環境で動作させる事が多い事もあり、 文字コード:EUC(EUC-JP)、 改行コード:LF が使われることが多く、これは無難な設定である。 私の場合は、WordPress用のプラグインを作ることが多く、ウェブサイトもUTF-8で記述する事が多いので、 文字コード:UTF-8N(UTF-8、BOMなし)、改行コード:LF に設定しており、この講座は、この設定を前提に話を進めてゆく。 ファイルの拡張子 PHPで記述されたコードを含むファイルの拡張子は、原則として「php」とする必要がある。 ファイル名には、半角英数字を使用し、区切りが必要な場合は「.」や「-」、「_」を使用する。 そして「.php」で終わるようすること。 アップロードと実行 PHPで記述されてファイルは、HTMLで記述されたファイル同様に、ウェブサーバーにアップロードすれば良い。 拡張子は異なるものの、実行もHTMLの場合と全く同じ要領であり、「http://example.com/index.php」のようなURLをブラウザに入力してアクセスすれば良い。 基本構造 PHPは、下記のようにHTMLに簡単に組み込むことが出来る。 <!doctype html> <?php echo ‘<?xml version=”1.0″ encoding=”utf-8″?>’; ?> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml” lang=”ja” xml:lang=”ja”> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title>PHPの基本構造</title> </head> <body> <p>PHPで日付を表示します。</p> <p>今日は、<?php echo date(“Y/m/d”); ?> です。</p> </body> </html> 上記のスクリプトの実行結果を表示 PHPによる記述は、 <?php PHPでの記述 ?> の部分であり、PHPのプログラムは、「<?php」で始まり「?>」で終わる必要がある この「<?php」と「?>」に囲まれた間に、PHPで命令文を記述してプログラムを作成する。 複数の命令文を書く事も可能で、「;」が命令文の区切りを表し、各命令文の最後には「;」を付ける必要がある。 例外として「?>」の直前の命令文は「;」を省略することが出来るが、命令文には「;」を付けることを習慣とした方が良い。 また、「<?php」と「?>」で囲まれたPHPプログラムは、1つのファイル内で複数回登場しても良い。 逆に「<?php」と「?>」に囲まれない範囲にあるHTMLによる記述は、そのままHTMLとして処理される。 つまり、HTMLとPHPを、簡単に混在させることが出来る。 サンプルプログラムでは、下記のコードで、現在の日付を動的に表示している。 <?php echo date(“Y/m/d”); ?> ここでは、echo()、date()と言う2つの関数を使用している。 「関数」とは、「与えられた値(引数)を元に処理を行い、結果(戻り値)を返す」という役割を担う命令文で、PHPプログラム内の処理の中心となる構造物である。 関数を電子レンジに例えるなら 引数・・・温める時間。 処理・・・物を温める。 戻り値・・・加熱の終了を知らせる音。 と言ったところだろうか。 シンプルな時計は、引数を必要としないが、時刻の計算処理を実行し、戻り値として現在の時刻を常に返すと言えるかもしれない。 実際、サンプルスクリプトでも使用しているdate()関数は、時計と似ている。 関数は、通常、下記のように記述する。 関数名(引数) サンプルプログラムを見るとechoには「()」が無く、これは関数のルールから外れているように思えるが、echo()の場合は「()」を省略出来る。 「()」が省略できるのは、echo()は厳密には関数ではなく、「言語構造」と呼ばれるものであるためだが、ともかく、echo()は、こう言うものと理解しておこう。 ただし、ここでは便宜上、関数として扱う。 echo()の「()」を省略せずに <?php echo(date(“Y/m/d”)); ?> と書くことも出来るが、通常は、このような書き方はしない。 date()関数は、現在の日付を計算する関数で、引数として日付のフォーマット(Y/m/d)を関数に渡し、戻り値として現在の年月日を返させている。 echo()関数は、引数をブラウザに表示する処理を行う。 この場合、echo()関数の引数は、date()関数の戻り値であり、結果としてブラウザには、現在の年月日が「/」区切りで表示される。 このサンプルプログラムでは、date()関数の引数に文字列(別の機会に詳しく)を使用しているが、文字列は「”」や「’」で囲むなどする必要がある。 関数には、引数、処理、戻り値の3つが必ずしもセットになっているとは限らない。 例えば、echo()関数は、引数を必要とし、引数をブラウザに表示する処理を行うが、戻り値は返さない。 echo()関数と同等の処理を行う関数として、print()関数があるが、こちらは戻り値を返す。 ちなみにprint()も厳密には関数ではなく、言語構造。 echo()関数やdate()関数は、PHPで予め定義された関数で、同様の関数は他にも沢山あり、「関数リファレンス」で見つけることが出来る。 ※関数リファレンスでは、「引数」は「パラメーター」、「戻り値」は「返り値」と表記されている。 このような定義済み関数の他に、自身で関数を定義して使用することも出来る。 サンプルプログラムでは、下記にもPHPを使用している。 <?php echo ‘<?xml … 続きを読む →

Posted in PHP, PHP講座, ネット・PC | Tagged | 1 Comment

初心者による初心者のためのPHP講座 第1回 PHPとは

WordPressのカスタマイズやプラグインを作成する事を目的に、2011年の4月から独学で「PHP」について勉強を始めた。 「PHP」は、簡単とは言われているが、私の場合は、海外在住のため日本語の書籍も簡単に手に入るわけではなく、インターネットの情報や既存のプログラムのソースコードを元に学んだため、苦労は無かったとは言えないが、最初の作品となるWordPress用プラグイン「Add attrib for LightBox」を意外と簡単に完成させられたこともあり、その後もPHPでの開発を継続している。 実際、最初につまずくと、先へ進めないものである。 そこで「初心者による初心者のためのPHP講座」と題して、私の経験を交えた「PHP入門書」をブログ上で作成してみることにした。 これは、私の勉強にもなる。 私がPHPを勉強し始めたきっかけが「WordPress」であり、PHPを使って作成しているものが「WordPress」用のプラグインであるため、一般的なPHPの話と言うよりは「WordPress」寄りの内容になるだろう。 どこまで出来るか分からないが、これからPHPを学ぼうとする方の手助けになれば幸いである。 なお、「初心者による初心者のためのPHP入門」の投稿は、不定期に行う。 PHPとは 「PHP」は、「PHP: Hypertext Preprocessor」の略で、動的にHTMLを生成することが出来る開発言語である。 要は、PHPを使えば、HTMLだけで記述した場合と比較して、より高機能なHPを簡単に構築することが出来る。 ・PHPの特徴 ウェブサイト、ウェブアプリケーションの開発に特化。 サーバー上で実行される。 C言語の影響を受けた構文で、平易な文法。 データベースとの連携が容易。 スクリプト言語なので大げさな開発環境が不要。 PHPは、1995年にバージョン1.0が登場しており、開発言語としては歴史はそれほど古くない。 にも関わらず、文法が易しいこともあり、広く普及している。 ユーザーが多いということは、書籍やインターネットを通じて情報を得やすいと言う利点もある。 PHPは、ウェブサイト、ウェブアプリケーションの構築に特化した開発言語であり、「PHP」同様に動的なサイトの構築に用いられる事が多い「Perl」とはこの点で異なる。 ウェブサイト上の掲示板、お問い合せフォームなどはPHPで記述できるウェブアプリケーションの例である。 PHPで記述されたアプリケーションの中でも比較的、大規模なものの例を挙げると、「WordPress」やWikipediaで使われている「MediaWiki」、ショッピングカートの「Zen Cart」、「EC CUBE」などがある。 データベースとの連携が容易であることも特徴で、データを「MySQL」などのデータベースという外部の入れ物に保存し、必要に応じて取り出して利用することが出来る。 HTMLでは、表示する内容は全てHTML上に含める必要があるが、PHPの場合は、本文をデータベースに格納し、サイトにアクセスがあった際に、データベースから取り出し、必要に応じて加工した上でブラウザに送信することも可能である。 実際、多くのPHPプログラムがデータベースと連携している。 ・PHPで出来ることの例 コメントを受け取り、表示する。しかし、危険な部分は、不適切な部分は削除して表示したい。 ⇒ HTMLでは、データを受け取れないし、処理できない。 フォームから入力されたデータを整形して管理者にメールで送信する。 ⇒ HTMLでは、データを処理できないし、メールも送信できない。 ユーザーの環境に合わせて、自動的に異なる言語のページを表示する。 ⇒ HTMLでは、リンクなどで対応するしかない。 必要な予備知識 PHPは、比較的、敷居の低い開発言語かとは思うが、全くの予備知識なしに学べるものではない。 参考までに私のケースを挙げておくが、PHPを勉強し始める以前にも、HTMLとCSSは、それなりに書け、PerlとJavaスクリプトも少し書けたが、Perlの方は、長い間使っていないので、かなり忘れてしまっていた。 ・必要な予備知識 HTML CSS 英語(必須ではないが、開発の幅広がる。) PHPは、ウェブアプリケーションを構築する言語であるため、「HTML」や「CSS」に関する知識は不可欠である。 テキストエディターを使って、HTMLで構造を記述し、CSSでレイアウトして、HPを作ることが出来る方なら全く問題ないだろう。 予備知識として「英語」を上げたのは、PHPに限らず、情報を公開する上での標準言語になっているからだ。 PHPやその他の言語で記述された数多くのプログラムがオープンソースの形で公開されており、自身が作るPHPプログラムに、それらを機能の一部として取り込む事も可能である。 実際に、他にプログラムとの連携を目的とした「ライブラリ」と呼ばれるプログラムも数多く存在する。 それらを利用したいとと思った場合、仕様の解説文を読む必要がある。 しかし、これらは英語で記述されていることが多い。 逆に英語以外の言語で仕様をまとめると、そのプログラムは、世に広まり難いといえるので、ネイティブでない開発者であっても英語で記述している場合が多い。 つまり有名なもの、実績があり、安心できるものを求める場合は、英語は避けて通れない。 「WordPress」のように多言語に翻訳されているものばかりなら良いのだが、実際には、そのようなケースは稀である。 また、自身で開発したプログラムを公開する場合も、仕様や解説文を英語で書いた方が、利用者が獲得しやすく、フィードバックも得られやすい。 プログラミングとは さて、プログラムを初めて経験する方にとっては、プログラムとは何かすら分からな状況かもしれない。 プログラムは、基本的に「文章」である。 「俳句を作る」、「Twitterにつぶやく」事と、本質的には変わらない。 「俳句」は定型文であり、ルールがある。 また、Twitterにも文字数制限があり、RT、ハッシュなどの流儀がある。 プログラムをこれと全く同じであり、一定のルールに従って文章を作れば良い。 「俳句」、「Twitterのつぶやき」は、ルールに従った上で、人間が理解出来る言葉で書けばよいが、プログラムは、誰に理解できる言葉で記述すべきであろうか? 答えは、PCなどの内蔵されている中核の処理装置「CPU」である。 CPUの理解できる言葉は、マシン語と呼ばれ、0と1と組み合わせである2進数(通常は、16進数で表記)である。 しかし、マシン語で記述されたプログラムなど理解が容易なはずがない。 小規模なアプリケーションが主流だった、古き良き時代には、個人が作るアプリケーションであってもマシン語で記述していたこともあるが、現在の大規模なアプリケーションでは、それも困難である。 また、マシン語は、1つではなく方言があり、CPUの種類毎に異なるため、1つのCPUのマシン語を覚えたからといって、別のCPUのマシン語が簡単に書けるわけではない。 ちなみに私は、インターネットもまだ無く、キャプテンシステムとか騒いでいた古き良き時代にマシン語(アセンブリ言語)を勉強しようとして挫折した。 実際の開発では、C言語のような、より人間が話す言葉に近く、CPUの差を吸収してくれる高級言語(中級言語)と呼ばれる開発言語が使われることが多い。 しかし、C言語は、あくまで人間寄りの言葉であって、C言語で記述されたファイルは、CPUには理解出来ないので、そのままでは実行する事も出来ない。 そこで、C言語で記述されたプログラムは、「コンパイラ」と呼ばれるプログラムを用いてCPUが理解出来る実行形式に変換する作業(コンパイル)を行う必要がある。 ※開発言語で書かれた元のファイルをソースファイル、その中の記述をソースコード、コンパイル後のファイルをバイナリと呼ぶ。 通常、プログラムは、ソースコードのままで提供されるのではなく、コンパイルされ、実行形式に変換されて提供、販売されるため、私たちも簡単に利用することが出来る。 それに対してPHPの場合は、バイナリと言った概念は存在しない。 人間寄りの言葉で書かれたソースコードをそのまま実行させる。 では、どのように実行しているかと言うと、実行する際にインタプリタと呼ばれる翻訳機を通すことで、CPUが理解できる言葉に変換し、実行を可能としている。 この方法は、通訳を通して会話するようなものであるため、コンパイルされたバイナリに比べて実行速度が落ちると言う欠点もある。 プラグラムは、コンパイルやインタプリタによる翻訳が必要であるため、プログラミング言語には、一定のルールが必要となる。 翻訳を考えれば、柔軟な人間の言葉よりも、人間寄りの言葉ではあるが、人間の言葉とは異なったシンプルなものの方が都合が良い。 人間の言葉では、同じような意味の事柄を異なった言い回しで表現出来る。 つまり、「画面を表示して頂けますか?」、「画面を表示して下さい。」、「画面を表示しろ!」よりもプログラム言語では、「表示 画面」などの方が遥かに都合が良い。 また、構文も人間の話す言葉に準じるよりも、効率的にプログラムを書く事を優先した方が良い。 その辺りがプログラム言語を難しく見せている理由ではあるかとは思うが、より柔軟な言語である「英語」を学ぶことよりも遥かに易しいとも言える。 開発環境の準備 C言語での開発の場合、コンパイラを必要とし、コンパイルという余計な作業が発生するのに対して、PHPでは、コンパイラは不要であり、コンパイルが不要な分、楽であるとも言える。 つまり、PHPの場合は、特別な開発環境は不要である。 PHPのプログラムは、テキスト形式のファイルで保存する必要があるため、文章を書くための紙に相当するテキストエディタ(シンプルなワープロ)さえあれば良い。 これから、PHPによるプログラミングを始めるなら、必ず、テキストエディタの準備が必要になるが、お金を必要はなく、フリーのもので十分である。 ただし、文字コード、改行コードが選択できるもの使うこと、例えば、Windowsのメモ帳は不可である。 参考:Windows用のテキストエディタを比較 WordPress用のテーマ、プラグインを作成するなら、「UTF-8、BOMなし」で保存できるものにすること。 私は、シェアウェアの「秀丸エディタ」を使っているが、Window用ならフリーの「TeraPad」で十分なので、ダウンロードしてインストールしておくこと。 今後、エディタの操作などは、「TeraPad」を標準して書くようにする。 PHPの実行と実行形態 PHPが翻訳され、実行されることは先に書いたが、つまり、そんための環境が必要となる事を意味している。 では、具体的にどこで翻訳され、実行されるのだろうか? PHPのプログラムは、ウェブサーバー上で翻訳され、プログラムに従って処理を実行し、実行結果をHTMLとしてブラウザに送信するパターンが基本となる。 ウェブサーバーには、「Apache」などのウェブサーバーアプリケーションがインストールされており、このアプリケーションの働きにより、HPにアクセスがあれば、HTMLで記述されたデータがブラウザに送信され、閲覧者はHPを参照できるが、これだけではPHPの実行までは出来ない。 更にオプションとして「PHP」を加えることで、PHPで記述されたサイトの出力も可能となる。 PHPで記述されたプログラムは、Apacheなどのウェブサーバーアプリケーション自身が実行するか、ウェブサーバーアプリケーションが、PHPを解釈、実行できるPHPプログラムを起動して代わりに実行させている。 前者のようなPHPの実行に仕方は、PHPがウェブサーバーアプリケーションの一部(モジュール)として組み込まれている場合にのみ可能であり、実行が高速である。 後者のような方法は、CGIと呼ばれ、ウェブサーバーが、逐次、PHPプログラムを起動する必要があるため実行が遅くなる。 PHPは、ウェブサーバー上で動作するため、PHPを利用するためには、PHPをサポートするレンタルサーバーの契約が必要となる。(PC上で動作される方法もあるが割愛する。) これは、一般的なウェブサイトを構築するために借りるレンタルサーバーで問題ない。 PHPをサポートしないレンタルサーバーを探すほうが難しいであろうから、PHPのサポートの有無については、あまり心配はいらないだろう。 PHPと単にいう場合は、PHPで記述されたプログラムを指すことが多いが、ウェブサーバーにインストールされているPHPを実行するためのプログラム(PHPランタイム)を指すこともあり、こちらがPHPのコアとも言える。 ウェブサーバーにインストールされているPHPにもバージョンがあり、できる限り新しいバージョンのものがインストールされているサーバーが好ましいが、レンタルサーバー会社側の都合にもよるので、最新のものが利用できるとは限らない。 新しいバージョンのPHPでは、機能が拡張されており、新しいバージョンで追加された機能を使ったPHPプログラムは、古いバージョンのPHPでは動作しないので注意が必要だ。 例えば、「WordPress … 続きを読む →

Posted in PHP, PHP講座, ネット・PC | Tagged | Leave a comment

WordPressと無関係なPHPファイル上で、WordPressの関数を実行する方法

WordPressには、便利な関数やフックが用意されているが、当然、これらはWordPressに無関係なphpファイルでは利用できない。 WordPress経由で読み込まれたphpファイルのみが対象となる。 私の作成したプラグインの中には、Javaスクリプトから読み込まれたphpファイル上で、WordPressの関数を実行しているものがある。 しかし、プラグインに含まれるphpファイルと言えども、Javaスクリプト経由である以上、WordPressとは全く無関係なファイルであり、本来は、WordPressの関数は利用不可能である。 実は、強制的にWordPressに関連付ける方法がある。 ただし、本来WordPressの関連のないファイルでWordPressの関数を実行するということは異例なことであり、これを行う際は、セキュリティ上の注意も必要だ。 方法は簡単で「require_once()」で「wp-load.php」を読み込んでやれば良い。「wp-config.php」と「admin.php」を読み込む方法もあるが、「wp-load.php」の方が良いだろう。 以下で解説する方法は、直接「wp-load.php」を読み込むのではなく、まず「wp-load.php」を読み込む処理を書いたファイルを準備し、「require_once()」を使って、それを読み込む方法である。 この方法は「Syntax Highlighter Compress」を参考にした。 複数のファイルで「wp-load.php」を読み込む必要がある場合でも重複した処理を記述する必要がなく、便利である。 まず、次のような記述のファイルを準備する。 <?php $path = ”; // It should be end with a trailing slash if (!defined(‘WP_LOAD_PATH’)) { $classic_root = dirname(dirname(dirname(dirname(__FILE__)))).’/'; if (file_exists($classic_root.’wp-load.php’) ) { define(‘WP_LOAD_PATH’, $classic_root); } else { if (file_exists($path.’wp-load.php’)) { define(‘WP_LOAD_PATH’, $path); } else { exit(__(“Could not find wp-load.php”)); } } } //Load wp-load.php require_once(WP_LOAD_PATH.’wp-load.php’); ?> 続いて、WordPressとは無関係なphpファイルの先頭に以下のように記述して、先ほど作成したファイルを読み込めばよい。 require_once( dirname( dirname(__FILE__) ) .’/my-bootstrap.php’); 場合によっては、セキュリティのために権限やその他条件チェックも行ったほうが良い。 例えば、上記の構文に続いて以下のような構文を追加する。 if ( !is_user_logged_in() || !current_user_can(‘edit_posts’) ) wp_die(__(“You are not allowed to access this file.”)); 上記の例では、このファイルをリクエストしたユーザーが、ログインユーザーでない場合、記事の投稿権限を持たない場合は、処理を中断している。

Posted in PHP, WordPress, ネット・PC | Tagged , | Leave a comment

WordPressの投稿やコメントで使えるタグを追加する

WordPressの投稿やコメントでタグを使ったところ、タグが消されたり、属性が消されたりした経験はないだろうか? このような現象は、記事やコメントを保存した後や、ビジュアルエディターとHTMLエディターを切り替えた後に起こっているはずた。 これは、単に禁止されているタグや属性があるからなのだが、逆に言えばきちんと許可さえしてやれば削除されなくなる。 実は、WordPressでは、入力出来るタグや属性を制限する仕組みは2つある。 1つは、HTMLエディターでの制限で、ksesというフィルターによるもの。「/wp-includes/kses.php」での制限である。 この制限は、HTMLエディターを利用する投稿画面とコメント欄で有効であるが、管理者権限を持つものには適応されないので、管理者として記事を投稿し、コメントを書いているなら、そもそも制限はないので無視して良い。 もし何かの事情で許可したいなら「/wp-includes/kses.php」に記述されている配列にタグや属性を追加すれば良い。 投稿画面の場合は、 $allowedposttags = array( ‘address’ => array(), ‘a’ => array( ‘class’ => array (), ‘href’ => array (), ‘id’ => array (), ‘title’ => array (), ‘rel’ => array (), ‘rev’ => array (), ‘name’ => array (), ‘target’ => array()), ‘abbr’ => array( ‘class’ => array (), ‘title’ => array ()), にタグや属性を追加する。 コメント欄の場合は、 $allowedtags = array( ‘a’ => array( ‘href’ => array (), ‘title’ => array ()), ‘abbr’ => array( ‘title’ => array ()), ‘acronym’ => array( ‘title’ => array ()), ‘b’ => array(), に付け加えれば良い。 上記と同じような記述は、プラグインやfunctions.phpでも書くことが出来る。 私は、コメントで使えるタグを追加で許可する構文をプラグイン中で書いているので、それを参考にまとめておく。 function my_allowedtags_in_comments($data) { global $allowedtags; $allowedtags['pre'] = array( ‘name’=>array(), ‘class’=>array()); $allowedtags['script'] = array( ‘type’=>array(), ‘class’=>array()); … 続きを読む →

Posted in PHP, WordPress, ネット・PC | Tagged , , , , | Leave a comment

WordPress 3.2以降のフルスクリーンモードにボタンを追加する

私は、WordPressの標準のビジュアルエディター「TinyMCE」に独自の機能を持ったボタンを追加するプラグインを作っている。 SyntaxHighlighter TinyMCE Button しかし、WordPress 3.2以降では、フルスクリーンモードの仕様が変わり、今まで通りのやり方ではノーマルモードでしか追加したボタンが表示されなくなってしまった。 試行錯誤の結果、WordPress 3.2以降で、フルスクリーンモードにボタンを追加する方法が分かったのでまとめておく。 既に「TinyMCE」にボタンを追加する「TinyMCE」用のプラグインを作成し、有効化済みであることを前提とするので、「TinyMCE」へのボタンの追加自体の説明は省略する。 ボタンを追加する手順自体は、過去のバージョンと同じである。フルスクリーンモードへの追加には、これとは別に次のような処理が必要となる。 まずは、「wp_fullscreen_buttons」フックを使ってフルスクリーンモードにボタンを追加する。 以下は、「my_button」の場合の例である。 function my_fullscreen_button($buttons) { $buttons[] = ‘separator’; // 必要ならボタンの前に区切りを追加 $buttons['my_button'] = array( ‘title’ => __(‘My button’), // マウスオーバーで表示されるテキストラベル ‘onclick’ => “tinyMCE.execCommand(‘my_button_cmd’);”, // 実行するコマンド ‘both’ => false); // trueならHTMLエディターでも表示 return $buttons; } add_filter(‘wp_fullscreen_buttons’, ‘my_fullscreen_button’); 「onclick」で実行しているコマンドは、 ed.addCommand(‘my_button_cmd’, function() { のような形で、既に「TinyMCE」用プラグイン内のJavaスクリプトとして記述しているはずなので、それを実行させる。 ここまでの作業で、既にフルスクリーンモードにボタンが追加され、ボタンも機能しているはずだ。 しかし、ボタンラベルのアイコンが表示されていない。 続いて、ボタン上にアイコンを表示させるための処理を追加する。 アイコンは、CSSを使ってボタンの背景として表示させる。 まず、次のように背景の画像を定義したCSSファイルを準備する。 .wp_themeSkin span.mce_my_button { background: url(“my_icon.png”) no-repeat 20px 20px; background-position:0 0 } ボタンを表示させる箇所のclass属性は「mce_ボタンの登録名」となるので、この場合は「mce_my_button」となる。 今度は、このCSSを、エディター画面で読み込ませる処理を書く。 function my_editor_style() { wp_enqueue_style(‘my-editor-style’, ‘http://www.near-mint.com/blog/my_editor_style.css’, false, ’1.0′); } add_action(‘admin_print_styles-post.php’, ‘my_editor_style’); add_action(‘admin_print_styles-post-new.php’, ‘my_editor_style’); add_action(‘admin_print_styles-page.php’, ‘my_editor_style’); add_action(‘admin_print_styles-page-new.php’, ‘my_editor_style’); 以上で、ボタンのアイコンも表示され、無事、フルスクリーンモードへのボタンの追加が完了する。

Posted in PHP, WordPress, ネット・PC | Tagged , , | Leave a comment

WordPressのプラグインの後始末

プラグインをアンインストールした後、データベースの「options」テーブルの掃除することが習慣になって来ている。 掃除と言っても、プラグインによってデータベースに書き込まれたデータを削除しているだけだが。 最近、偶然に、 http://WordPressのURL/wp-admin/options.php にアクセスすると、「すべての設定」というページが表示され、「options」テーブルに格納されたデータの一覧を見ることが出来る事を知った。 シリアル化されていないものについては、データの更新も出来るようだが、残念ながら削除は出来ない。 WordPress上から「options」テーブルの掃除が出来れば掃除も楽になるが、phpMyAdminを使うしかなさそうだ。 そこで、WordPressの管理画面からMySQLを管理できるプラグインは無いかと探してみたところ、「Adminer」と言うプラグインが見つかった。 「Adminer」は、phpMyAdminのようなMySQLの管理ツールで、それをプラグイン化したものらしい。 高機能なツールなのだが、「options」テーブルを掃除したいだけなので、もっとシンプルな機能のもので十分なのだが・・・。 さて、今回の話題は、以前からプラグインの利用者としても開発者としても気になっていたが、最近、Twitterでも話題になったようだ。 私の作成したプラグインもそうであるが、WordPress用のプラグインの多くが、データベース上に設定値などを格納している。 例えば、アクセス解析プラグインのログなど、頻繁に書き込みや更新が発生するようなデータは、データベース上に独自のテーブルを作成し、そこにデータを格納しているのが通例だが、対して、設定値など頻繁に書き込みや更新が行われないデータであれば「add_option()」を使って、データベース上の「options」テーブルに保存している事が多い。 プラグインを使っている間は、これらデータベースに格納された値は、なんら問題にならない。むしろ、動作に必要である。 ところが、プラグインが不用になり、一旦アンインストールしてしまうと、データベース上のゴミと化す場合も少なくない。 アンインストール時にデータベースの「options」デーブルに追加した値を削除してくれれば良いのだが、そうではない行儀の悪いプラグインも多い。 開発者なら知っていることだが、add_option()で追加されたデータは、delete_option()で簡単に削除できる。 要はタイミングの問題で、プラグインのアンインストール時にdelete_option()を実行出来れば、ゴミを残すこともなくなる。 勿論、その方法は用意されており、プラグインのアンインストール時にdelete_option()を実行したいのなら、下記の様に記述した「uninstall.php」ファイルを作成し、プラグインファイルに含めるだけで良い。 <?php if (!defined(‘ABSPATH’) && !defined(‘WP_UNINSTALL_PLUGIN’)) {exit();} delete_option(‘my_plugin_option1′); delete_option(‘my_plugin_option2′); delete_option(‘my_plugin_option3′); . . . ?> 「uninstall.php」が実行される前に「WP_UNINSTALL_PLUGIN」が定義されているかは、確認したほうが良いようなので上記のような記述になっている。 また、現在は使われていなが、過去のバージョンで使用して値がある場合は、それも記述した方が良い。 同様の処理を「register_uninstall_hook()」を使って実行させる方法もあるが、私のプラグインの場合は、「uninstall.php」を使っている。 アンインストール時の処理とは関係ないが、プラグインが有効化された時、無効化された時の処理を記述する場合は、「register_activation_hook()」、「register_deactivation_hook()」が利用出来るので覚えてくと役立つかもしれない。 しかし、「uninstall.php」や「register_uninstall_hook()」は、WordPress 2.7からの新機能のようなので、もっと古いバージョンでも動作するプラグインの場合は、別の方法をとる必要があるかもしれない。 と言え、開発者にアンインストール時の処理が浸透するまでは、データベースの「options」テーブルの掃除から解放されそうにはない。 様々なプラグインのデータを格納している「options」テーブル自体、雑居ビルのような状態であるため、不要なものを探すだけでも一苦労である。

Posted in PHP, WordPress, ネット・PC | Tagged , , , | Leave a comment

WordPress用のプラグインを簡単に作成する方法

今回は、簡単なプラグインの作成方法を説明する。 ただし、作成するプラグインは、あくまで個人的な利用を目的としているので、推奨されている作法に従っていない部分もある。 まず、「UTF-8 BOMなし」で保存できるテキストエディタで下記のように記述する。 <?php /* Plugin Name: My Plugin Plugin URI: http://www.near-mint.com/blog/ Description: For personal use. Version: 1.0 Author: Redcocker Author URI: http://www.near-mint.com/blog/ */ //ここに処理を記述する ?> 最初のコメントの部分は、プラグインに合わせて修正しておくこと。 Plugin Name・・・プラグインのタイトル Plugin URI・・・プラグインのサイトのURL Description・・・プラグインの説明。 Version・・・プラグインのバージョン Author・・・プラグインの作者 Author URI・・・作者のサイトのURL 今回作成するプラグインは、あくまでパーソナルな目的であるので、日本語で記述しても構わない。 問題は「//ここに処理を記述する」の部分に何を記述するかという点だが、書くべき処理を意外に簡単に見つける方法がある。 このブログでも書いた事があるが、「◯◯◯するために、☓☓☓をテーマのための関数(functions.php)に追加してください。」と言った内容の記事を見たことがあるのではないか思うが、その「☓☓☓」を記述すれば良い。 このブログでは「WordPressのヘッダを変更してフィードをカスタマイズ」で、ヘッダーからフィードリンクを削除するために、2行の処理を「テーマのための関数(functions.php)」に追加したが、それを記述してみよう。 <?php /* Plugin Name: My Plugin Plugin URI: http://www.near-mint.com/blog/ Description: For personal use. Version: 1.0 Author: Redcocker Author URI: http://www.near-mint.com/blog/ */ remove_action(‘wp_head’, ‘feed_links’, 2 ); remove_action(‘wp_head’, ‘feed_links_extra’, 3); ?> このファイルを 「UTF-8 BOMなし」形式で「.php」で終わるファイル名を付け保存し、「/wp-content/plugins」にアップロードする。フォルダに入れてアップロードしても構わない。 後は、管理画面のプラグインから有効化すればフィードリンクがヘッダーから消える。 とは言え、これだけではあまりにも寂しいので、その他の不要なヘッダー部分の要素も同時に削除する処理を追加した。 <?php /* Plugin Name: My Plugin Plugin URI: http://www.near-mint.com/blog/ Description: For personal use. Version: 1.0 Author: Redcocker Author URI: http://www.near-mint.com/blog/ */ remove_action(‘wp_head’, ‘feed_links’, 2); remove_action(‘wp_head’, ‘feed_links_extra’, 3); remove_action(‘wp_head’, ‘rsd_link’); remove_action(‘wp_head’, ‘wlwmanifest_link’); remove_action(‘wp_head’, ‘index_rel_link’); remove_action(‘wp_head’, ‘parent_post_rel_link’, 10, … 続きを読む →

Posted in PHP, WordPress, ネット・PC | Tagged , , | Leave a comment