カテゴリー : WordPress

WordPress wp_posts データ、画像データに関しての覚書き

検討中のWebサイトを、WordPressを利用して構築するにはどーしたらいいか検索しながら考えている最中、次の記事を見つけた。

WordPress のアップロードファイル管理

触発されて、wp_postsテーブルを眺めて気が付いた事についての備忘録です。

先ずは、wp_postsテーブルの定義でどんなカラムがあるかは、Database Descriptionを参照。日本語のページデータベース概要には、各カラムに登録されるデータについて簡単な説明がある。

WordPress は、投稿やページ、アップロード画像データなどの管理を、wp_posts テーブルで一元管理しているようだ。なので、データの種類を表すカラムや登録日時を表すカラムは、データの種類に関わらず共通であるが、画像データのパスやMIMEタイプなどデータの種類により異なる解釈をする(あるいは利用しない)カラムがあるようだ。

投稿・ページデータと画像データ

  • post_title
    投稿ではタイトル、画像では imgタグのtitle属性で利用される。
  • post_excerpts
    投稿では「抜粋」欄の項目で、一覧表示で投稿のさわりや要約を表示する際利用される。一方画像では、画像のキャプションデータとして使われる。どちらもテンプレートで指定して利用できるようになっている項目である。
  • post_status
    投稿では「公開」の状態で「publish:公開済み」、「draft:下書き」など表す。画像の場合、「inherit」になる。
  • post_name
    投稿はタイトルから、画像はファイル名からテーブル内でユニークとなる文字列で登録される。テーブル定義でキー指定された項目である。
  • post_parent
    投稿では「0」、画像では指定された投稿データのIDが指定される。複数の投稿に同じ画像を表示しても、投稿のこの項目値は最初に登録された値となっている。なお、post_content内で画像データは、[caption id=”attachment_xxx” …]<img…>のように、imgタグの前にショートコードが埋め込まれている。
  • guid
    投稿ではパーマリンクが、「http://www.example.com/archives/xxx」のように登録される。画像でも画像の URI が「http://www.example.com/xxx/2010/05/xxx.jpg」のように登録される。
  • post_type
    投稿は「post」、ページは「page」、画像は「attachment」と登録される。
  • post_mime_type
    投稿は何も登録されない。画像は「image/jpeg」のように、MIMEタイプが登録される

画像を投稿に貼る際、代替テキストの項目に入力したデータは、imgタグのalt属性に設定されるが、テーブルの項目には保存されていないので、imgタグ毎に編集を指定されると読み出して管理しているのかもしれない。

と思ったが、以前の投稿を見たら wp_postmeta テーブルにも登録されているのが分かったので、少し調べてみた。

画像とwp_postmeta

wp_postmeta には、投稿編集でカスタムフィールドを登録すると、そのデータが「key-value」で保存される。そのテーブルに、画像をアップロードすると画像に関するデータも登録されていた。

目に付いたデータは、meta_keyカラムの値が以下の3つである。

  • _wp_attached_file
    設定のその他の設定で登録された「アップロードするファイルの保存場所」からのファイルパス名。
  • _wp_attachment_metadata
    画像の横・縦サイズ、縮小画像のファイル名とサイズ(thumbnail,medium,large)、画像のExif情報。シリアライズされたデータが保存される。
  • _wp_attachment_image_alt
    imgタグに指定されるalt属性のテキスト。

デジカメで撮影された画像データには、Exifと言うデータが記録されている。アップロードした画像にそのデータがあると、_wp_attachment_metadataに登録されるようだ。以下は、登録されたデータと、Exifビューワで見た内容の比較である。

(WordPress 2.9.2)

プログラムソースを綺麗に表示するには(その2)

WordPress の表示ページ上で、PHP や JavaScript のコードを紹介する際、カラーリングして見易くしてくれるものとして「Syntax Highlighter」を導入すると良い、ということを前回「プログラムソースを綺麗に表示するには」でメモしていた。

前回のプラグインで不満に思っていた事は、「preタグ」に「name属性」を使用していた事だ。この属性、HTMLエディタからビジュアルエディタへ切り替えると、削除されてしまった。だから迂闊に切り替えできない。もう一点は、ソースプログラムの言語の種類によりカラーリング方法を合わせてくれるのは良いが、せっかく言語別に分離されたモジュールがページ表示で全てロードされてしまう。これでは、表示に時間がかかってしまう。

ところで、今日プラグインのライブラリを見ていたら、上を回避してくれる「easy-google-syntax-highlighter」があった。なので、早速変更することにした。

設定画面

設定画面で、利用しないモジュールをディスエーブルにできるのも良いが、必要なモジュールを自動的に選択して読み込むように指定できるところが、とても気にいった。

また、プラグイン制作者のページSyntaxHighlighter のページへのリンクがあり、そこに多くドキュメントが掲載されていた。

SyntaxHighlighterは、1行が長いときワードラップしてくれるが、自分はワードラップせずスクロール表示してくれる方を好んでいる。その指定の仕方が、「<pre class=”brush:js; wrap-line:false”>」というように指定すればいい事が、ドキュメントのおかげて分かった。

さらに、ビジュアルエディタで利用されている TinyMCE の設定について、前回の記事で「tiny_mce_before_init」を利用すればビジュアルエディタのカスタマイズができそうな事を書いていたが、実はそのものズバリのドキュメントがあった。

WordPress.ORG のドキュメント 「TinyMCE Custom Buttons」 がそれだ。

ビジュアルエディタを利用するときの表示フォントが気に入らず、パッチを当てている人は多いと思う(参考:編集で利用するビジュアルエディタのフォント変更)。WordPress のバージョンアップの度にパッチを当て直ししなくても済むように、これでより良い方策が思い浮かぶと良いが。

パスワード保護した投稿の表示期限

WordPress では、ページや投稿をパスワードで表示制限する機能がある(管理画面-投稿編集-公開状態)。パスワードを入力すると、閲覧しているブラウザに情報がクッキーで登録され、10日間以内であれば再入力せず閲覧できる(10日間過ぎると再入力)。

この「10日間」を変更したい場合、例えばブラウザ終了まで有効とし、再接続では新たにパスワードを入力する、ようにするにはどうしたらいいのか?

「/wp-pass.php」の「setcookie」コマンドに、クッキーの有効期限のパラメータがありデフォルトで

time() + 864000

となっている。これは、time()で現在時刻、そしてその864000秒後まで有効としている。この部分を「0」に差し替えればよい。

さて、それではページや投稿そのものに表示期限を付けることはできるだろうか?

直接制御できるような方法はないようなので、カスタムフィールドに有効期限を設定し、テンプレートでページを表示する際、ふるいにかけるようにするのはどうだろうか?

(WordPress 2.8.6)

WordPress ログインフォームをページ上に表示してログインするには

サイトの来訪者を一般と登録ユーザーに分けて、コンテンツを見せたいと思うことはないだろうか?そんなとき WordPress では、「購読者」という権限でユーザー設定すれば、テンプレートでユーザーがログインしているかどうか確認し、コンテンツ表示を制御できる。

ところでユーザーのログインページだが、WordPress のログインページを利用するよりもヘッダーやサイドバーなどにログインフォームを設けて、そこでログイン操作ができればスッキリする。さらに、管理画面も表示禁止にできればもっと嬉しい。

ここでは、サイドバーにログインフォームを表示、ログイン後はログイン前の表示ページに戻りつつ、サイドバーにユーザー名を表示する仕方を見て行きたい。また、登録ユーザーの管理画面表示を禁止する方法も検討する。

サイドバーのテンプレートにログインフォームを設定する

ログインフォーム
サイドバーにユーザー名、パスワード、ログインボタンを図のように配置する。フォームのデータ送信先は、

<?php echo wp_login_url() ?>

で取得できる。ログイン直後に管理画面へ移行しないようにするには、「redirect_to」というパラメータを与えるとよい。もし、ログインしたときと同じ表示ページに戻るには、次のように指定すればよい。

<?php echo wp_login_url() ?>?redirect_to=<?php echo esc_attr($_SERVER[‘REQUEST_URI’]) ?>

では、ユーザー名・パスワードの入力要素に与える「name」属性は何にするかと言えば、WordPress が分かるようにそれぞれ、「log」と「pwd」を指定する。

ログイン中次に、ログインが成功した場合のユーザー名とログアウト処理へのリンクの張り方を見る。

ユーザー名は、テンプレート関数1回で表示する方法がないようなので次のようにした。

<?php global $current_user; echo $current_user->display_name ?>

もう少しおしゃれな方法があればお知らせ下さい m(_ _)m。

さて、ログアウト処理へのリンクであるが、これもログアウト後に元のページに戻るように、次のように指定する。

<a href="<?php echo wp_logout_url() ?>&amp;redirect_to=<?php echo esc_attr($_SERVER['REQUEST_URI']) ?>">こちら</a>

以上をまとめて、テンプレート「sidebar.php」に次のように入力する。

<li><h2>ログイン</h2>
<?php if (is_user_logged_in()) : ?>
	Welcome! <?php global $current_user; echo $current_user->display_name ?>さん<br />
	ログアウトは &raquo; <a href="<?php echo wp_logout_url() ?>&amp;redirect_to=<?php echo esc_attr($_SERVER['REQUEST_URI']) ?>">こちら</a>
<?php else : ?>
	<form method="post" action="<?php echo wp_login_url() ?>?redirect_to=<?php echo esc_attr($_SERVER['REQUEST_URI']) ?>">
		<p><label for="login_username">ユーザー名:</label><br />
		<input type="text" name="log" id="login_username" value="" /></p>
		<p><label for="login_password">パスワード:</label><br />
		<input type="password" name="pwd" id="login_password" value="" /></p>
		<p><input type="submit" value="ログイン" /></p>
	</form>
<?php endif; ?>
</li>

管理画面へ移行しないようにするには

WordPress では、ログインユーザーはデフォルトで管理画面が表示できるようになっている。これを簡単に禁止する設定はないようなので、フックを利用して表示できないようにする。管理画面を表示するとき、必ず呼び出されるアクションフックがあるので、そこで強制的にトップページなどへリダイレクトするようにする。

これはプログラムになるので、テンプレートに書き込まず、同じテーマディレクトリにある「functions.php」のお尻へ追加しておけばいいだろう。プログラムは以下の通りにした。

function mts_check_login() {
	global $current_user;

	get_currentuserinfo();
	extract($current_user->wp_capabilities);
	if ($subscriber) {
		wp_redirect(get_bloginfo('url'));
	}
}

add_action('admin_init', 'mts_check_login');

その他

もし、ログインエラーを起こした場合はどうなるだろうか?

残念ながら、WordPress のログイン画面がエラーメッセージとともに表示されてしまう。これを避けるためには、wp-login.php を参考にログイン処理するプログラムを追加する必要があるようだ。

なお、「ログイン情報の記憶」のチェックボックスや、「パスワードをお忘れですか?」のリンクも追加することが可能である。

同人の方とかでダウンロードする人を制限したい場合、利用できないでしょうか?また、データのダウンロード回数をカウントするプラグインも掲載してるので、是非ご利用下さい。お仕事があればお声掛けも歓迎します(^_^;)。

WordPressのダウンロード補助用プラグインを作ってみた

WordPress を使ってみようと思い立ち、インストールしてから3ヶ月以上たったが、ようやく、ファイルのダウンロードとダウンロード回数を表示するプラグインを作ることができた(MTS Download Leader Plugin for WordPress)。

自分と同じように、これから「WordPressでデビュー」しようと思っている方も多いのではと思う。WordPress は Web 上に多くのドキュメントがあり、また書籍の方も充実してきたので、情報も得やすいのではないかと思う。実際、大変助かっている。

最初に自分が取り掛かった事は、このサイトでもサイドメニューに「WordPress資料」でリンクを張ってあるが、Webサイト上のテンプレートやプラグインに関する部分を読んで確認した。それぞれ分かりやすい説明なので理解は難しくない。また、フリーのテンプレートをダウンロードして、デザインをいじりながらテンプレートの構造を確認したりした。しかし、全体像はおぼろげながら分かるのだが、プログラミングするためもう少し知りたい、と思ってもどこから手を付けていいか分からず、困っていた。

そんなとき、本屋で「WordPressカスタマイズブック(藤本 壱 著)」を見つけ、目次と中をパラパラと見て、速攻でレジに向かった(^_^;)。

紙質は厚く、ページ数が多いということはない。また、自分は読んで理解できた、と言うことでもなかった。が、そこに書かれている機能について、実際にカットアンドトライで WordPress に組み込みながら動作するものを作ることで、全体像が掴め、より深く理解が進んだと思う。

WordPress を CMS として利用するため、プログラミングしたい人に薦めるなら、

  • テンプレートの構造が分かっている
  • 管理画面が使える
  • (X)HTML、CSS、PHPが分かっている

ことが望ましい。上の条件に当てはまれば、本書とWebサイト上の説明でサクサクと WordPress をモノにすると思う。

自分も、まだいろいろと理解を深めなければいけない課題がいくつもある。一人でコツコツとするのも悪くないが、近所で勉強会があればなぁ、と思うことしきりだ。ご近所のWeb屋さんで、WordPress でサイトを立ち上げてみようかと悩んでおられるようであれば、お気軽にご連絡ください。