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

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

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

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

parent category togglerプラグインが便利

http://wordpress.org/extend/plugins/parent-category-toggler/

wordpressのカテゴリは、親子関係があるのですが、子も親もチェックしたいのに、ついつい親へのチェックを忘れてしまうことがあります。

こうしたいのに
category-1

こうしちゃう
category-2

そこで見つけたのが、「parent category toggler」プラグイン。
子カテゴリをクリックすると、親カテゴリにもチェックが入ります。これでチェック忘れはなくなりますね。

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)
最新版のプラグインはプレビューに対応しています。
現在は、上記の対応は入れる必要はありません。

DISQUSを導入した

コメントスパムを防ぐ仕組みのようです。

今すごく話題のサイト http://theinterviews.jp/ にも導入してあったのをみて、コメントスパムが増えていたところだったので、よくわからないまま導入。

SI CAPTCHA Anti-Spamより見た目もいいし、おすすめです。今までは名前とメールアドレス必須にしてスパムを防いでたけど、twitterとかfacebookのアカウント認証でいけるし、個人的にはこちらの方が全然簡単で、メールアドレス入れるより気楽でいいですね。

このブログwordpressなんですが、wordpressならプラグインも用意されているし、やることは2つだけ。

1. http://disqus.com/ でアカウントを作る
2. wordpressのプラグイン、Disqus Comment Systemを導入し、設定する
(設定はプラグインページのDisqus Comment Systemのsettingから開始し、shiteshortnameを入れるだけ)

画像付きの説明がこちらにありましたので、詳しくはこちらをどうぞー。
http://ueblog.natural-wave.com/2009/02/01/wordpress-disqus/

これでどのくらいコメントスパムが減るか様子見します。

かっこいいwordpressテーマ

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

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

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

WordPressのカスタムポストが便利っぽい

以前ZendFramework勉強会でご一緒させていただいたNullyさん(http://blog.nully.org/)がTwitterでつぶやかれていた”カスタムポスト”という言葉を見ました。

前後の投稿からWordPress関連なのはわかったのですが、どういうものかさっぱり???なので、質問してみると、機能の内容を教えていただいて、参考サイトまで教えてもらいました。それがこちら。
http://wpxtreme.jp/how-to-use-custom-post-types-in-wordpress-3-0-beta1

うん便利そう。作る側よりも使う側が便利そう。
今度、友達になんか頼まれごとしたときに利用できそうならやってみようと思います。
カテゴリ選んでーとかよりも理解しやすいですよね。きっと。

このブログ、WordPressのtipsがいっぱいあって超いいです。
http://wpxtreme.jp/how-to-use-cusom-taxonomy-with-wordpress-versions-lower-than-3
これとか勉強になります。タクソノミーって、確かに自分で使ってみようってしてなかったので。

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/