advanced custom fieldsがプレビューに対応していた

以前、advanced custom fieldsプラグインでプレビューもやりたいという記事を書きましたが、最新版ではプレビューにも対応していました。

プラグインをアップデートしたら、以前の記事に書いたプレビュー対応の部分でエラーがでたため、一旦外したところ、外した後もプレビューできていました。これからは、プラグインを有効化するだけで、プレビューにも対応可能ですね。

手間が減るって嬉しいことです。中身がどう変わったのかも、見てみようと思います。

advanced custom fieldsプラグインでプレビューもやりたい

wordpressをカスタマイズするときに、よく使うプラグインが「advanced custom fields」です。
http://komodo.arrow.jp/wp/614

通常だと、タイトル・カテゴリ・タグ・本文・抜粋を入力するwordpressですが、
全部の投稿に画像を複数付けたいとか、画像と1行文をセットにするとか、
そんな要望がでてくることも多々あると思います。

そういうときに便利なのか「advanced custom fileds」です。
wordpressの記事入力画面の入力項目を好きなように作れます。

ただ、1つ不便だなと思うところがあります。
このプラグインは、wordpressのcustom filedを使って実現されているんですが、
custom filedに入力したデータは、プレビュー機能で見れないんですよね。
公開されている記事を編集する場合は、公開済の情報が表示されてしまいます。

せっかく、データを入力しやすいようにカスタマイズしても、プレビューでできないのは残念。
そこで、「advanced custom fields」で入力した情報を、プレビューできるようにしました。
テンプレートのfunctions.phpに以下を書けば、OKです。

// カスタムフィールドをプレビュー対象にする

// preview用に保存された下書き情報(post)のIDを取得する
function get_preview_id($postId)
{
    global $post;
    $previewId = 0;

    if (($post->ID == $postId) && $_GET['preview'] == true &&  ($postId == url_to_postid($_SERVER['REQUEST_URI']))) {
        // プレビュー表示の際に、自動保存されたpostの下書き情報を取得する
        $preview = wp_get_post_autosave($postId);
        if ($preview != false) { $previewId = $preview->ID; }
    }

    return $previewId;
}

function get_preview_postmeta($metaValue, $postId, $metaKey, $single)
{
    // プレビュー表示のときにmeta情報(custom fileds情報)を、
    // プレビュー用のmeta情報に置き換える
    if ($previewId = get_preview_id($postId)) {
        if ($postId != $previewId) {
            $metaValue = get_post_meta($previewId, $metaKey, $single);
        }
    }

    return $metaValue;
}
add_filter('get_post_metadata', 'get_preview_postmeta', 10, 4);


// 下書き情報を作成するときに、対応するcustom filed情報も作成する
// プレビューの際には、この時作ったcustom filed情報を読み出す
// (読み出しているのが、get_preview_postmetaの部分)
function save_preview_postmeta($postId)
{
    global $wpdb, $acf;  // $acfがadvanced custom filedsのglobal 変数

    if (wp_is_post_revision($postId)) {
        if (count($_POST['fields']) != 0) {
            foreach ($_POST['fields'] as $key => $value) {
                $field = $acf->get_acf_field($key);

                if (count(get_metadata('post', $postId, $field['name'], $value)) != 0) {
                    update_metadata('post', $postId, $field['name'], $value);
                    update_metadata('post', $postId, "_" . $field['name'], $field['key']);
                } else {
                    add_metadata('post', $postId, $field['name'], $value);
                    add_metadata('post', $postId, "_" . $field['name'], $field['key']);
                }
            }
        }
        do_action('save_preview_postmeta', $postId);
    }
}
add_action('wp_insert_post', 'save_preview_postmeta');

調べるのに時間かかったので、忘備録として。
このプログラムは、こちらの記事を参考に、advanced custom filedsに対応させて頂きました。
http://www.warna.info/archives/2502/

※追記(2013/7/16)
最新版のプラグインはプレビューに対応しています。
現在は、上記の対応は入れる必要はありません。

redmineのメール設定で凡ミス

redmineをぼちぼち触っていっています。

チケット等を更新した際に、メールが送信されるように設定しようとしたところ、送信時に失敗します。なぜ!設定時に記述した内容は、以下です。

production:
email_delivery:
delivery_method: :smtp
smtp_settings:
address: “localhost”
port: 25
domain: “localhost”

検索してでてきた設定方法と上記を見比べても、悪いところはなかったので、他の原因を探ることに。getaddrinfo: Name or service not known”という発生したエラーで検索したら、出てきました、答えが。

“proction:”っていうパートが、設定ファイルの末尾にあって、上書きされているという結果でした。なんで、例でコメントアウトしてる行があるのに、更に何も書いてない”production:”の部分があるのか意図が読めないですが、これで解決。このサイトに助けられました。

http://www.lesstep.jp/wiki/index.php?Redmineでメール送信が失敗する

redmineを利用し始めました

会社で、好きなの入れていいから、チケット管理をできる環境を作りたいという話がでてきたので、rubyを勉強する口実にもなると考え、redmineを選びました。ちょうど、4/16に1.4系がリリースされたので、タイミングもよかったです。

インストールは、以下の記事の通りにやったら、すんなりいきました。
http://blog.redmine.jp/articles/redmine-1_4-installation_centos/

メールサーバ設定を行う、configuration.ymlでは、特に何も設定せずに、sampleをコピーしただけの状態です。最初は例に習って、sendmailを使う形にしていたのですが、うまくインストールできなくて、sampleと同じ内容にしました。

これから、プラグインの便利なものを見つけたり、使い方や機能でいいなと思うものがあったら、記事にしていきます。

今回は、redmineのインストールより、CentOSで固定IPを割り振る部分でつまづきました。
いつもは、VirtualBoxで、DHCPとホストオンリーネットワークの組み合わせでやっていたので、外部からも見れる固定IPを設定し、DNSの設定もしてというのが初めてだったので。
恥ずかしながら、”/etc/sysconfig/network-script/ifcfg-ethxx”に、DNSの情報を書いて、restartとすると、”/etc/resolve.conf”が生成されるということも今回初めてしりました。

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.x ←サーバのIP
NETMASK=255.255.255.0
TYPE=Ethernet
HWADDR=00:oo:3F:oo:1F:oo
GATEWAY=192.168.1.y
IPV6INIT=no
USERCTL=no
NM_CONTROLLED=yes
DNS1=127.0.0.1
DNS2=192.168.1.1

IPアドレスとかは、適当に書き換えてますが、こんな感じで”/etc/sysconfig/network-scripts/ifcfg-eth0″を書きました。いくつかのサイトを見ながら、これに落ち着いたので、メモしておきます。

ネットワークの知識の浅さを改めて感じる作業でした。redmine楽しみです。

かっこいいwordpressテーマ

百式管理人 田口さんのサイト(http://http://www.ideaxidea.com/)がきっかけで、モノラボさん(http://www.mono-lab.net/)を知りました。

今までいろいろ探した中でも、モノラボさん作成のテンプレートはかっこいい!
以下のダウンロードページにある3つともかっこいです。
個人的には neutral と monochrome が甲乙つけがたいところ。
http://www.mono-lab.net/download/monochrome/

次にテーマを変えるときは、どっちかにしようかな。

wordpressのwp_headとwp_footer

wp_head()とwp_footer()というメソッド。
wordpressのコア部分のメソッドなのですが、恥ずかしながら今まで知りませんでした。

javascriptを利用したプラグインを利用するときは、これらは必須です。
今回、テンプレートにlightboxを導入する際に動ず、調べていたら、ここに行き着きました。

wp_headは、通常はwordpressのバージョン情報等をmetaタグで表示するくらいですが、wp_headが呼ばれたタイミングで、事前に登録したメソッドを呼び出せる機能ももっているのです。この機能を利用して、pluginの動作に必要なcssとかjavascriptとかの記述を行っているpluginが多いのです。
wp_footerも同様です。こちらはjavascriptの実行文を書いてあることが多いです。

今回使ってたテンプレートには、このどちらもなかったので wp-lightpopが動作しなかったというのが、動作不良の原因でした。

pluginによっては、jqueryを読み込んだり、prototype.jsを読み込んだりするので、バッティングして動作しなくなることもありますし、自前でjqueryを読み込んでたりする上に、wp_headでさらに読み込まれるとおかしくなることもあります。この辺は、試しながら調整する必要がどうしても出てきそうです。

add_action(‘wp_head’, ‘自作メソッド名’) で、処理追加
remove_action(‘wp_head’, ‘自作メソッド名’)で、処理削除

自分でプラグインを作成するときは、この辺は覚えておくと便利ですね。

WordPress3.0にして変わったこと

wordpress3.0にアップグレードしたら挙動が変わった部分を発見したのでメモ。

wordpressの場合、category-xx.php (xxはカテゴリID)というテンプレートを作成していると、該当のカテゴリIDを指定して記事一覧画面を出す場合(http://hoge.com/?cat=xx など)に、優先的にIDまで名前に入ったテンプレートを選択してくれていた。

基本的には、3.0でも一緒だが、変わっていたのは、指定されたカテゴリIDに対応する記事が1件もなかった場合。2.9までは、記事がなくてもcategory-xx.phpが呼び出されていたが、3.0からは、index.phpが呼び出されるようになっていた。archive.phpも置いてみたけど、archive.phpではなくindex.phpが呼び出された。

カテゴリID指定のテンプレートはあまり作る機会は無いが、複数の指定カテゴリの記事一覧を表示するとき等に、架空のカテゴリIDを指定して、テンプレート内にて複数カテゴリIDを指定したり、特定カテゴリIDを除外した記事一覧を取得して表示したりしていた。

今後は、index.phpを使うってことで。架空のカテゴリIDを複数使いたい場合は、index.phpの中で、$_GETの中身を見て切り替えることになりそうです。

この挙動は、タグ指定とかでも一緒だと思われます。

ブログを見直しました

ソースコードをブログに書くようになって、横幅が足りないと感じていたので、単一記事のページを2カラムに変更しました。これで、ソースコードが見やすくなったと思います。TOPページもjavascriptで、2カラムと3カラムを切り替えるようにしようかなと考えています。

同時に以下のプラグインを追加しました。

■ サイトの右側にtwitterのリンクを表示させるプラグイン
http://wpburn.com/wordpress-plugins/wp-followme-plugin

■ 単一記事ページに関連記事のリンクを表示させるプラグイン
http://rmarsh.com/plugins/similar-posts/
http://rmarsh.com/plugins/post-plugin-library/
(similar-postsを使うには、post-plugin-libraryが必要です)

■ 新しい記事を作成した際に、twitterに投稿してくれるプラグイン
http://wppluginsj.sourceforge.jp/simple-tweet/

WordPressの日付表示はthe_time()で

1つのテンプレート内で、複数の記事を表示する場合、the_date()を利用すると、
同一の日付が複数存在する場合、2つ目以降の日付が表示されなくなります。

そこで、the_time()に変更すると、同じ日付でも問題なく表示されます。
秒まで一緒だと表示されないのかもしれませんが、そんなことはないという前提で。

DBから取得した値をどうにかして加工しようとしてたので、the_time()を
知ったときは、すごい助かったーという気分でした。便利です。

LightboxをWordPressで利用した

友人のブログをWordPressを使って作っているのですが、画像をLightbox風に
表示させたいってことだったので、やってみました。
スクリプトの種類はいくつもあるんですね。

参考にさせていただいたのは、こちら。いつも読んでます。
http://www.designwalker.com/2008/01/lightbox.html

この中で、選んだのは、こちら。
http://www.dolem.com/lytebox/

理由は、ProtoType.jsや、jQuery.js等のライブラリを必要としないこと。
jQueryは使うので、まぁいいかなと思っていたのですが、ProtoType.jsは
使ったことがないので、問題が起きた時に対応できるかなという不安でやめました。
導入は1時間ほどで完了。ちょっとマニュアル読むのに時間がかかったくらいでした。

思ったより簡単だったので、仕事でも使える部分があったら、使ってみたいですね。