Quantcast
Channel: 小粋空間
Viewing all 219 articles
Browse latest View live

Movable Typeで選択したカテゴリの親カテゴリを一括選択できる「ParentCategorySelectorプラグイン」

$
0
0


Movable Typeで親カテゴリを一括選択できる「ParentCategorySelectorプラグイン」を公開します。

1.機能

ブログ記事投稿画面のカテゴリ選択で、チェックしたカテゴリの親カテゴリを選択します。

次のようにチェックボックスの上でチェックします。

カテゴリ選択画面

チェックすると、親カテゴリまでまとめて選択されます。

カテゴリ選択画面

チェックした子カテゴリのチェックをはずせば、親カテゴリの選択も解除します。親カテゴリが選択されたあと、個別にチェックをはずすことも可能です。チェックボックスでない部分(カテゴリ名など)をチェックすれば子カテゴリだけを選択することもできます。

また、プラグイン設定画面で、次のようにチェックしたカテゴリを主カテゴリにすることもできます。デフォルトの動作は最上位の親カテゴリが主カテゴリになります。

カテゴリ選択画面

このプラグインはMT5.12で動作します。ブラウザはFirefox8のみ正常に動作することを確認しています(v0.01では他のブラウザでは動作しません)。

2.価格

  • 非商用利用:無償
  • 商用利用:1050円/1サーバ(購入前に必ず動作確認してください)

非商用利用でご利用の場合も、プラグインのご利用および質問に対する回答等について、ご支援・ご賛同くださる方からの寄付をお待ち申し上げます。

3.プラグインのダウンロード

下記のリンクをクリックして、プラグインアーカイブをダウンロードします。

ParentCategorySelector_0_01.zip

プラグインアーカイブを展開し、中にあるParentCategorySelectorフォルダごと、Movable Type のアプリケーションディレクトリのpluginsディレクトリにアップロードします。

システム管理画面のプラグイン設定画面で、「ParentCategorySelector~」が表示されればインストール完了です。

プラグイン設定画面

4.プラグインの設定

プラグインを利用したいブログの管理画面で「ツール」→「プラグイン」→「ParentCategorySelector~」→「設定」をクリックして、「このプラグインを有効にする」をチェックして「変更を保存」をクリックします。この操作を行わないと親カテゴリまで含んだ選択は行われないので注意してください。

プラグイン設定画面

主カテゴリをチェックしたカテゴリにしたい場合は、「チェックしたカテゴリを主カテゴリにする」をチェックしてください。デフォルト動作は、最上位の親カテゴリが主カテゴリになります。


WordPressの固定ページでコメントフォームを非表示にする方法

$
0
0


WordPressの固定ページ(あるいは記事ページ)でコメントフォームを非表示にする方法をまとめました。

変更前後のイメージを掲載しておきます。

コメントフォームが表示された状態の固定ページ
表示オプション

コメントフォームを非表示にした状態の固定ページ
表示オプション

以下、設定方法です。説明の中で使っている管理画面のスクリーンショットはWordPress 3.2.1です。

1.記事単位でコメントフォームの表示・非表示を制御する

記事単位でコメントフォームの表示・非表示を制御するには、投稿画面右上にある表示オプションをクリック。

管理画面

「ディスカッション」をチェック(チェックされていれば次に進んでください)。

表示オプション

「コメントの投稿を許可する。」のチェックをはずす。

ディスカッション

これで投稿すれば固定ページのコメントフォームが非表示になります。

2.一括で制御する

一括でコメントフォームの表示・非表示を制御するには、ナビゲーションの「設定」→「ディスカッション」をクリック。

ナビゲーション

「新しい投稿へのコメントを許可する」のチェックをはずして「変更を保存」をクリックすれば、以降の新規投稿分についてコメントフォームが表示されなくなります。

新しい投稿へのコメントを許可する

厳密に言うと、この設定を行うことで、新規投稿時に1項の「コメントの投稿を許可する。」のチェックがはずれた状態になります。記事投稿画面で個別に「コメントの投稿を許可する。」をチェックすれば、「設定」→「ディスカッション」の設定より優先されます。

3.固定ページのみ常に非表示にする

2項の設定は記事ページ・固定ページ別での制御が行えず、使い勝手がよくありません。

固定ページのみ一括で非表示にしたい場合は、wp-includes/comment-template.phpにcomments_openフィルタがあるので、これを利用して、テーマのfunctions.phpに以下のコードを追加するとよいでしょう。

function close_page_comment( $open, $post_id ) {
    $post = get_post( $post_id );
    if ( $post && $post->post_type == 'page' ) {
        return false;
    }
    return $open;
}
add_filter( 'comments_open', 'close_page_comment', 10, 2 );

これで固定ページのディスカッションの設定状態にかかわらず、コメントフォームを非表示にします。

Movable Typeの画像アップロード時にリサイズできる「UploadImageResizerプラグイン」

$
0
0


Movable Typeの画像アップロード時にリサイズ可能な「UploadImageResizerプラグイン」を公開します。

1.機能

アイテムのアップロード画面で画像をアップロードする際、「アップロード画像オプション」をチェックします。

アイテムのアップロード画面

チェックすると、アップロード画像をリサイズするためのオプションが表示されます。各フィールドに値を設定してアップロードすれば、指定したサイズでアップロードされます。

アップロード画像オプション

このプラグインは、アップロード後の画像をリサイズするのではなく、アップロード時にサイズ指定するものです。アップロード後に画像をチェックしながらリサイズしたい場合は、インターネットに接続された環境であれば「Pixenateプラグイン」を推奨します。

Movable Typeでアイテム画像を編集できる「Pixenateプラグイン」

また、UploadImageResizerプラグインは画像の拡大は行えません。また現在のバージョンでは上書きアップロードにも対応していません(上書きアップロードは別途対応予定)。

動作はMT5.12で確認しています。

2.アップロード画像サンプル

下のスクリーンショットは元画像(640×425)をそのままアップロードしたアイテム編集画面に表示された画像です。

アップロード画像

幅300px・高さ200pxにリサイズしてアップロードしたものです。画像の幅・高さとサイズが変更されます。

アップロード画像

幅200pxを指定+アスペクト比を保持してアップロードしたものです。指定した幅
にあわせて高さが自動調整されます。

アップロード画像

150pxのサムネイル(四角)作成したものです。

アップロード画像

3.価格

  • 非商用利用:無償
  • 商用利用:1050円/1サーバ(購入前に必ず動作確認してください)

非商用利用でご利用の場合も、プラグインのご利用および質問に対する回答等について、ご支援・ご賛同くださる方からの寄付をお待ち申し上げます。

4.プラグインのダウンロード

下記のリンクをクリックして、プラグインアーカイブをダウンロードします。

修正履歴

2011/11/16 初版
2011/11/16 v0.02 MT5.0x対応
UploadImageResizer_0_02.zip

プラグインアーカイブを展開し、中にあるUploadImageResizerフォルダごと、Movable Type のアプリケーションディレクトリのpluginsディレクトリにアップロードします。

システム管理画面のプラグイン設定画面で、「UploadImageResizer~」が表示されればインストール完了です。

プラグイン設定画面

5.注意事項

下記の条件でアップロードすると、元画像をそのままアップロードします。

  • 「アップロード画像オプション」をチェックしていない
  • 幅・高さの指定がない
  • 幅・高さのいずれかの指定サイズが元画像のサイズを超えている
  • ラジオボタンのいずれも選択されていない

「スマートフォンオプション for Movable Type」の発売開始

$
0
0


Movable Typeで作成するウェブサイトやMovable Typeの管理画面をスマートフォン対応にする「スマートフォンオプション for Movable Type」が2011年11月16日に発売となりました。

スマートフォンオプション for Movable Type - Six Apart
スマートフォンオプション for Movable Type

これを利用すれば、下のような感じでスマホで管理画面にアクセスできるようになります。早速ダウンロードさせて頂いてちょっと操作してみたところ、かなりイケてる感じで、MTが時代に追いつきました。

1.概要

手抜きですいませんが、シックス・アパートの紹介スライドをご覧ください。

それだけではなんなので、スマホ(Xperia Acro)の管理画面スクリーンショットもいくつか紹介しておきます。

まず、ブログ記事一覧画面です。記事部分はPCサイト用と同様、Ajaxで表示されます。

ブログ記事一覧画面
ブログ記事一覧

ブログ記事編集画面です。リビジョンやカテゴリなども表示されます。

ブログ記事編集画面
ブログ記事編集画面

ナビゲーションは「ブログ記事の管理」の左にあるアイコンをクリックすれば表示されます。

ナビゲーション
ナビゲーション

再構築もPCサイトと同様に行えます。

再構築画面
再構築画面

2.主な機能

ということで本題です。

「スマートフォンオプション for Movable Type」で提供される機能は大きく分けて次の2つです。

  • スマホ用管理画面の提供
  • ウェブサイトをPC用サイトとスマホ向けサイトに最適化するテーマの提供

管理画面では以下の各機能が提供されます。

  • ブログ記事、ウェブページの作成、編集、プレビュー
  • カスタムフィールドの入力、修正
  • カテゴリの選択、作成、並び替え
  • コメントの公開管理、返信入力
  • アイテムの検索、編集、挿入
  • ブログ記事・ウェブページ・コメント・アイテムの検索
  • ブログ、ウェブサイトの再構築

3.「スマートフォンオプション for Movable Type」の構成

「スマートフォンオプション for Movable Type」は、大きく分けて次の3つを提供します。

  • DynamicMTMLアドオン
  • SmartphoneOptionプラグイン
  • 「Smart Blog」テーマ

「DynamicMTML」は簡単に言うと、静的なファイルにMTテンプレートタグをそのまま出力し、ページを表示するときにテンプレートタグを動的に再構築するためのアドオンです。この機能はアルファサード有限会社が開発したものです。

「SmartphoneOptionプラグイン」はスマホ用の管理画面向けのプラグインです。このプラグインはアイデアマンズ株式会社が開発したものです。

「Smart Blog」テーマは、PCサイト/スマホサイト向けのテーマで、テンプレートにはDynamicMTML用のテンプレートタグを使うことで、例えば1つのメインページ用テンプレートで複数のデバイス表示に対応しています。

4.ライセンス

ライセンスは次の通りです。

Movable Typeのライセンスは別途購入が必要です。なお、次の製品を購入すれば「スマートフォンオプション for Movable Type」が無料で提供されます。

「Power CMS for MT」は、開発元のアルファサード有限会社で購入した場合も「スマートフォンオプション for Movable Type」が無料で提供されます。

5.サポート対象環境

「スマートフォンオプション for Movable Type」が利用可能なMTの製品とバージョンは次の通りです。

  • Movable Type Pro 5.12 以上
  • Movable Type Advanced 5.12 以上

MT5.0x以下のバージョンは対応していません。

MTOSではライセンス上、利用することはできませんが、3項で紹介した「DynamicMTML」と「Smart Blog」テーマを以下からダウンロードできます。

6.対応するスマホ端末

対応するスマホ端末は下記の通りです。

  • iPhone (iOS4以上)
  • iPad (iOS4以上)
  • Android OSのバージョン2.3以上を搭載したスマートフォン

7.インストール・操作方法

手抜きですいませんが、インストールや操作方法については以下のリンクで紹介されています。

以上です。「スマートフォンオプション for Movable Type」の詳細については当サイトでも別途紹介していきたいと思います。

Movable Typeのコミュニティ機能で投票できない不具合を解消する

$
0
0


Movable Typeのコミュニティ機能(コミュニティブログ/コミュニティ掲示板)には、投票機能(スターアイコン★をクリックして投票)がデフォルトで用意されています。

具体的には、次のようにトピック単位に投票用のスターアイコンが表示され、スターアイコンまたは「X票」の部分にマウスをポイントするとクリックで投票できるようになっています。

投票

クリックすると1票が追加され、自分が投票したことが分かるように、スターアイコンにチェックマークがつきます。もう一度クリックすれば投票を取り消します。

投票後

ところが、次のようにマウスをポイントしても投票できないケースがあります。

投票できないケース

本エントリーでは投票できない原因と、問題がある場合の解消方法について紹介します。

1.原因1:コミュニティのユーザーとしてサインインしていない

コミュニティのユーザーとしてサインインしていない場合、投票することができません。ページ右上にある「サインイン」をクリックしてサインインすれば、投票できるようになります。

サインイン

2.原因2:匿名の投票を有効にしていない

コミュニティのユーザーとしてサインインしていなくても、誰でも投票できるようにすることができます。

投票できるようにするには、ブログ管理画面の「設定」→「コミュニティ」をクリックして、「匿名での投票を許可する」をチェックします。

匿名での投票を許可する

3.原因3:クロスドメイン問題

投票機能はAjaxを利用しており、ページ読み込み時にAjaxでコミュニティ用のCGI(mt-cp.cgi)にアクセスして投票情報を取得・表示します。このCGIにアクセスするURLのドメインと、コミュニティサイト自体のドメインが異なっているとクロスドメイン問題により、1項や2項の対処を行っても投票することができません(厳密にはサインインもできないはずです)。

例えば、それぞれのドメインの設定が次のようになっていると、この問題が発生します。

  • コミュニティサイトのドメイン:blog.user-domain
  • mt-cp.cgi実行時のドメイン:user-domain

投票できない問題がクロスドメインであるかどうかは、JavaScriptエラーの有無で切り分けることができます。例えばIE9でF12を押下して開発者モードの画面の「スクリプト」タブで確認すると、次のような「アクセスが拒否されました。」というエラーが表示されているはずです。

エラー

エラーが発生しているmt.jsの558~559行目のコードは次のとおりです。

598: var url = 'http://user-domain/mt/mt-cp.cgi';
599: xh.open('POST', url, true);

変数xhはAjax通信を行うためのXMLHttpRequestオブジェクトで、open()メソッド、つまり指定したURLへのリクエスト送信に失敗していることが分かります。598行目に表示されているドメインとコミュニティサイトのドメインが異なっていることからも判別可能です。

解消するには、コミュニティサイトのドメインとmt-cp.cgiのドメイン(=MTをインストールしているドメイン)を一致させます。言い換えると、コミュニティサイトのドメイン配下にMTをインストールする必要があります。アクセスするドメインが一致すれば良いので、MTをドメインに対応するパス直下にインストールする必要はありません。「mt」など適当なディレクトリを作って、そこにインストールすれば良いでしょう。

例えば次のような配置でMTをインストールします。

  • MTのインストールパス:/home/user/www/mt
  • コミュニティサイトのパス:/home/user/www
  • コミュニティサイトのURL:http://blog.user-domain/

「ソーシャルコマース~ソーシャルメディア時代のショッピングと企業戦略~(仮)」刊行記念セミナー開催のお知らせ

$
0
0


ソーシャルコマースに関する国内初の書籍「ソーシャルコマース~ソーシャルメディア時代のショッピングと企業戦略~(仮)」が、マイナビより12月上旬に発売されるようです。

著者はソーシャルコマース・ソーシャルキャンペーンで実績のある桜丘製作所株式会社です。

桜丘製作所株式会社のFacebookページ
桜丘製作所株式会社

この、書籍「ソーシャルコマース~」刊行を記念し、ソーシャルコマースの現状と、事業者の取り組み・大手ショッピングモール各社の戦略・将来的な展望までを一望できるセミナーが下記のとおり急遽開催されることになりました。

  • 日時:2011年12月8日(木)13:00開場 13:30開始 17:20終了(予定)
  • 場所:(株)マイナビ本社 マイナビルームS
    〒100-0003 東京都千代田区一ツ橋1-1-1 パレスサイドビル9階東コア
    東京メトロ東西線竹橋駅1b出口直結(地図
  • 募集人数:100名(予定)
  • 参加対象者:企業・ショップのEC担当者、Web担当者、ECサイト構築に携わるWeb制作者
  • 参加費:9,000円(クレジット払い)、10,000円(当日現金払い)
    ※クレジットカード支払いは、現金支払いより1,000円OFF
    ※書籍「ソーシャル・コマース」代(1,890円)込みの価格

申し込み方法

ソーシャルコマース PowerMeeting開催!」の「お申し込み」から申し込めます。

  • 支払い方法:クレジットカード支払い・当日現金支払いを選べます
  • 申し込み締め切り:2011年12月7日(水)11:00(予定)
    ※定員に達し次第、受付を終了いたします

プログラム

13:00 開場
13:30 キーノートスピーチ「ソーシャルコマース・ナウ」
14:10 楽天市場のソーシャルコマース戦略
14:40 休憩
14:50 国内事例紹介 
15:30 ソーシャルコマースの海外展開支援ツールについて(仮)
16:00 休憩
16:10 Yahoo! JAPANのソーシャルコマース戦略
16:40 パネルディスカッション「2012年のソーシャルコマース、展望と戦略を語る」
17:20 名刺交換会

講師

  • ヤフー株式会社 コンシューマ事業統括本部 モバイル企画部 部長 秀誠
  • 楽天株式会社 楽天市場事業 企画部 メディア戦略グループ 山岡まどか
  • 株式会社アラタナ 取締役 東京支社長 佐藤文彦
  • 桜丘製作所株式会社 宮坂友大
  • イケダハヤト

※その他講演者は調整中

国内の各種事例だけでなく、楽天市場やYahoo! JAPANの現場担当者から戦略や展望について直接聞くことができます。都合のよい方は参加されてみてはいかがでしょうか。

Movable Typeでアイテムアップロード時にリサイズ可能な「UploadImageResizerプラグイン」バージョンアップ

$
0
0


Movable Typeでアイテムアップロード時にリサイズ可能な「UploadImageResizerプラグイン」をバージョンアップしました。

このプラグインは、アイテムアップロード画面に表示されたチェックボックスをチェックすれば、アップロード画像をリサイズするためのオプションを表示します。各フィールドに値を設定してアップロードすれば、指定したサイズでアップロードされます。

UploadImageResizerプラグイン

1・変更点

アップグレード後の報告ですが、MT5.0xに対応しました。MT5.0xのアイテムアップロードでも次のようにオプションが表示されます。

MT5.06のアイテムアップロード画面
上書きアップロード

また、リサイズ指定後の上書きアップロードに対応しました。リサイズ指定したアップロードで次の画面が表示された場合、「はい」をクリックすればリサイズした内容でアップロードします。

上書きアップロード

2.プラグインのダウンロード

プラグインは以下のリンクからダウンロードできます。

Movable Typeの画像アップロード時にリサイズできる「UploadImageResizerプラグイン」

WordPressのTwenty Elevenテーマ解説:サイドバー (sidebar.php)

$
0
0


WordPressの勉強も兼ねて、Twenty Elevenテーマの各テンプレートについて解説しています。確認バージョンは3.2.1です。

サイドバー (sidebar.php)

Twenty Elevenテーマの「サイドバー (sidebar.php)」は、次のように、各ページのサイドバーを表示します。

サイドバー (sidebar.php)

テンプレートのソースコードは次のとおりです。

<?php
/**
 * The Sidebar containing the main widget area.
 *
 * @package WordPress
 * @subpackage Twenty_Eleven
 * @since Twenty Eleven 1.0
 */
 
$options = twentyeleven_get_theme_options();
$current_layout = $options['theme_layout'];
 
if ( 'content' != $current_layout ) :
?>
        <div id="secondary" class="widget-area" role="complementary">
            <?php if ( ! dynamic_sidebar( 'sidebar-1' ) ) : ?>
 
                <aside id="archives" class="widget">
                    <h3 class="widget-title"><?php _e( 'Archives', 'twentyeleven' ); ?></h3>
                    <ul>
                        <?php wp_get_archives( array( 'type' => 'monthly' ) ); ?>
                    </ul>
                </aside>
 
                <aside id="meta" class="widget">
                    <h3 class="widget-title"><?php _e( 'Meta', 'twentyeleven' ); ?></h3>
                    <ul>
                        <?php wp_register(); ?>
                        <li><?php wp_loginout(); ?></li>
                        <?php wp_meta(); ?>
                    </ul>
                </aside>
 
            <?php endif; // end sidebar widget area ?>
        </div><!-- #secondary .widget-area -->
<?php endif; ?>

以下、順を追ってテンプレートの内容について解説します。

1.レイアウト情報の取得

テーマ情報をtwentyeleven_get_theme_options()で取得し、さらにその中のレイアウト情報を取得します。

$options = twentyeleven_get_theme_options();
$current_layout = $options['theme_layout'];

twentyeleven_get_theme_options()はwp-content/themes/twentyeleven/inc/theme-options.phpに実装されています。

wp-content/themes/twentyeleven/inc/theme-options.php

function twentyeleven_get_theme_options() {
    return get_option( 'twentyeleven_theme_options', twentyeleven_get_default_theme_options() );
}

twentyeleven_get_theme_options()の中ではget_option()を実行しているだけです。get_option()の第1パラメータはオプション名、第2パラメータはデータベースにオプションが存在しない場合のデフォルト値です。デフォルト値はtwentyeleven_get_default_theme_options()で返却された値を使用しています。

twentyeleven_get_default_theme_options()は、twentyeleven_get_theme_options()と同じtheme-options.phpに実装されています。

function twentyeleven_get_default_theme_options() {
    $default_theme_options = array(
        'color_scheme' => 'light',
        'link_color'   => twentyeleven_get_default_link_color( 'light' ),
        'theme_layout' => 'content-sidebar',
    );
 
    if ( is_rtl() )
        $default_theme_options['theme_layout'] = 'sidebar-content';
 
    return apply_filters( 'twentyeleven_default_theme_options', $default_theme_options );
}

$options['theme_layout']に対応する内容として「content-sidebar」が設定されていることが分かります。

2.レイアウトについて

Twenty Elevenテーマのレイアウトには次の3種類が用意されています。

  • content-sidebar(右サイドバー)
  • sidebar-content(左サイドバー)
  • content(サイドバーなし)

レイアウトは、theme-options.phpのtwentyeleven_layouts()に定義されています。

function twentyeleven_layouts() {
    $layout_options = array(
        'content-sidebar' => array(
            'value' => 'content-sidebar',
            'label' => __( 'Content on left', 'twentyeleven' ),
            'thumbnail' => get_template_directory_uri() . '/inc/images/content-sidebar.png',
        ),
        'sidebar-content' => array(
            'value' => 'sidebar-content',
            'label' => __( 'Content on right', 'twentyeleven' ),
            'thumbnail' => get_template_directory_uri() . '/inc/images/sidebar-content.png',
        ),
        'content' => array(
            'value' => 'content',
            'label' => __( 'One-column, no sidebar', 'twentyeleven' ),
            'thumbnail' => get_template_directory_uri() . '/inc/images/content.png',
        ),
    );
 
    return apply_filters( 'twentyeleven_layouts', $layout_options );
}

レイアウトを変更するには、管理画面の「外観」→「テーマ設定」→「デフォルトのレイアウト」で行えます。

デフォルトのレイアウト

3.レイアウトの判定

取得したレイアウトの判定を行い、「content」つまりサイドバーを表示しないレイアウト以外であれば、ifブロック内を実行します。

<?php
…中略…
if ( 'content' != $current_layout ) :
?>
…中略…
<?php endif; ?>

4.サイドバーの判定

dynamic_sidebar()でサイドバーの有無を判定します。第1パラメータはサイドバーの名称で「sidebar-1」は管理画面の「外観」→「ウィジェット」の「メインサイドバー」が対応します。「メインサイドバー」にウィジェットが1つも割り当てられていなけばifブロック内を実行します。

        <div id="secondary" class="widget-area" role="complementary">
            <?php if ( ! dynamic_sidebar( 'sidebar-1' ) ) : ?>
            …中略…
            <?php endif; // end sidebar widget area ?>
        </div><!-- #secondary .widget-area -->

dynamic_sidebar()はwp-includes/widgets.phpに実装されています(掲載は割愛)。この関数の実行結果は真偽値を返却します。

5.アーカイブ一覧の出力

次の部分でアーカイブ一覧を出力します。

                <aside id="archives" class="widget">
                    <h3 class="widget-title"><?php _e( 'Archives', 'twentyeleven' ); ?></h3>
                    <ul>
                        <?php wp_get_archives( array( 'type' => 'monthly' ) ); ?>
                    </ul>
                </aside>

wp_get_archives()は日付ベースのアーカイブリストを表示するテンプレートタグで、wp-includes/general-template.phpに実装されています(掲載は割愛)。

パラメータの「type」には次のものを指定できます。指定を省略した場合は「monthly」を適用します。

  • yearly
  • monthly
  • daily
  • weekly
  • postbypost

その他、下記のパラメータを設定できます(内容は公式ドキュメントより)。

  • limit:取得するアーカイブ数を数値で設定。デフォルトは制限なし
  • format:アーカイブリストの形式(下記のいずれか)を設定
    • html:HTML のリストタグ(<li>)と before・after の文字列
    • option:セレクトボックスまたはドロップダウンメニュー用のセレクトタグ(<select>)内のオプションタグ(<option>)
    • link:リンクタグ(<link>)内に
    • custom:before・after の文字列を用いたカスタムリスト
  • before:リンクの前に表示する内容(htmlまたはcustomを選択した場合に有効)
  • after:リンクの後に表示する内容(htmlまたはcustomを選択した場合に有効)
  • show_post_count:投稿数を表示(真偽値を設定)

6.メタ情報の出力

次の部分でアーカイブ一覧を出力します。

                <aside id="meta" class="widget">
                    <h3 class="widget-title"><?php _e( 'Meta', 'twentyeleven' ); ?></h3>
                    <ul>
                        <?php wp_register(); ?>
                        <li><?php wp_loginout(); ?></li>
                        <?php wp_meta(); ?>
                    </ul>
                </aside>

wp_register()は次の制御を行います。

  • ログイン中:「サイト管理」のリンクを出力(クリックすれば管理画面に移動)
  • ログアウト中:
    • 管理画面の「設定」→「一般」の「だれでもユーザー登録ができるようにする」をチェックしている場合:「登録」のリンクを出力
    • チェックしていない場合:何も出力しない

ログイン中の表示
ログイン中の表示

ログアウト中(または他ユーザー)でチェックしている場合の表示
ログイン中の表示

wp_register()はwp-includes/general-template.phpに実装されています。

wp-includes/general-template.php

function wp_register( $before = '<li>', $after = '</li>', $echo = true ) {
 
    if ( ! is_user_logged_in() ) {
        if ( get_option('users_can_register') )
            $link = $before . '<a href="' . site_url('wp-login.php?action=register', 'login') . '">' . __('Register') . '</a>' . $after;
        else
            $link = '';
    } else {
        $link = $before . '<a href="' . admin_url() . '">' . __('Site Admin') . '</a>' . $after;
    }
 
    if ( $echo )
        echo apply_filters('register', $link);
    else
        return apply_filters('register', $link);
}

wp_loginout()はログインリンクを表示します。ログインしているユーザーにはログアウトリンクを表示します。

ログイン中
ログイン中の表示

ログアウト中
ログアウト中の表示

wp_loginout()はwp-includes/general-template.phpに実装されています。

wp-includes/general-template.php

function wp_loginout($redirect = '', $echo = true) {
    if ( ! is_user_logged_in() )
        $link = '<a href="' . esc_url( wp_login_url($redirect) ) . '">' . __('Log in') . '</a>';
    else
        $link = '<a href="' . esc_url( wp_logout_url($redirect) ) . '">' . __('Log out') . '</a>';
 
    if ( $echo )
        echo apply_filters('loginout', $link);
    else
        return apply_filters('loginout', $link);
}

wp_meta()は、プラグインのアクションフックです。デフォルトの状態では何も出力されません。functions.phpに次のようなコードを記述すればリンクが表示されます。

function out_link () {
    echo "<li><a href="...">foo</a></li>";
}
add_action('wp_meta', 'out_link');

Movable Typeのカテゴリリストで階層別に背景画像を変更する

$
0
0


Movable Typeのカテゴリリストで階層別に背景画像を変更する方法を紹介します。

1.カテゴリリストの完成サンプル

このカスタマイズでは次のようなカテゴリリストを出力します。

カテゴリリスト

カテゴリリストのli要素のclass属性には、階層別に異なる値を設定します。class属性値にスタイルを適用すれば、階層別に異なる背景画像を適用できます。

また、サンプルでは第3階層の最後のli要素に「last」というclass属性値も付与しています。

<ul>
  <li class="parent"><a href="http://user-domain/cat1/">親カテゴリ</a>
    <ul>
      <li class="child"><a href="http://user-domain/cat1/1/">子カテゴリ1</a>
        <ul>
          <li class="grandchild"><a href="http://user-domain/cat1/1/1/">孫カテゴリ1</a></li>
          <li class="grandchild"><a href="http://user-domain/cat1/1/2/">孫カテゴリ2</a></li>
          <li class="grandchild last"><a href="http://user-domain/cat1/1/3/">孫カテゴリ3</a></li>
        </ul>
      </li>
      <li class="child"><a href="http://user-domain/cat1/2/">子カテゴリ2</a>
        <ul>
          <li class="grandchild"><a href="http://user-domain/cat1/2/1/">孫カテゴリ1</a></li>
          <li class="grandchild"><a href="http://user-domain/cat1/2/2/">孫カテゴリ2</a></li>
          <li class="grandchild last"><a href="http://user-domain/cat1/2/3/">孫カテゴリ3</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

2.カスタマイズ

1項のカテゴリリストを出力するには、次のサブテンプレートを利用します。

<$mt:SetVar name="depth" value="1"$>
<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
<ul>
  </mt:SubCatIsFirst>
    <mt:if name="depth" eq="1">
  <li class="parent"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
    </mt:if>
    <mt:if name="depth" eq="2">
  <li class="child"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
    </mt:if>
    <mt:if name="depth" eq="3">
      <mt:SubCatIsLast>
  <li class="grandchild last"><a href="<$MTCategoryArchiveLink$>"><mt:CategoryLabel></a>
      <mt:else>
  <li class="grandchild"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
      </mt:SubCatIsLast>
    </mt:if>
    <$mt:SetVar name="depth" op="++"$>
  <$mt:SubCatsRecurse$>
  <$mt:SetVar name="depth" op="--"$>
</li>
  <mt:SubCatIsLast>
</ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

ポイントは青色で示した変数depthの制御で、これで階層の深さを判断しています。変数をインクリメントしているのはMTSubCatsRecurseの直前のMTSetVarタグ、デクリメントしているのがMTSubCatsRecurseの直後のMTSetVarタグです。

また、赤色で示したMTSubCatIsLastタグで、第3階層の「last」を付与を制御しています。

ちなみに、

      <mt:SubCatIsLast>
  <li class="grandchild last"><a href="<$MTCategoryArchiveLink$>"><mt:CategoryLabel></a>
      <mt:else>
  <li class="grandchild"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
      </mt:SubCatIsLast>

の5行は、実際には次の1行に置き換えて書くこともできます。

<li class="grandchild<mt:SubCatIsLast> last</mt:SubCatIsLast>"><a href="<$MTCategoryArchiveLink$>"><mt:CategoryLabel></a>

第1階層・第2階層の判定処理の中に、第3階層の処理と同じようにMTSubCatIsLastタグを使えば、「parent」や「child」に「last」を付与することができます。

3.カスタマイズ(第1階層をh3要素にする)

第1階層のみをh3要素にするには、次のサブテンプレートを利用します。

<$mt:SetVar name="depth" value="1"$>
<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <mt:if name="depth" ne="1">
<ul>
    </mt:if>
  </mt:SubCatIsFirst>
    <mt:if name="depth" eq="1">
<h3><mt:CategoryLabel></h3>
    </mt:if>
    <mt:if name="depth" eq="2">
  <li class="child"><MTCategoryLabel>
    </mt:if>
    <mt:if name="depth" eq="3">
      <mt:SubCatIsLast>
  <li class="grandchild last"><a href="<$MTCategoryArchiveLink$>"><mt:CategoryLabel></a>
      <mt:else>
  <li class="grandchild"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
      </mt:SubCatIsLast>
    </mt:if>
    <$mt:SetVar name="depth" op="++"$>
  <mt:SubCatsRecurse>
  <$mt:SetVar name="depth" op="--"$>
  <mt:if name="depth" ne="1">
</li>
  </mt:if>
  <mt:SubCatIsLast>
    <mt:if name="depth" ne="1">
</ul>
    </mt:if>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

2項のサブテンプレートの違いは、赤色で示しました。違いは、第1階層の処理でh3要素を出力することと、ul要素を出力しないことです。

4.その他

このエントリーのカスタマイズでは変数を利用して階層を判断していますが、次のタグを利用しても実現可能です。

  • MTHasParentCategory
  • MTHasNoParentCategory
  • MTHasSubCategories
  • MTHasNoSubCategories

例えば、第2階層の判定にはMTHasParentCategoryタグとMTHasSubCategoriesタグ、第3階層の判定にはMTHasNoSubCategoriesタグを使用します。ただし、第2階層までしかないカテゴリがあると、第2階層がMTHasNoSubCategoriesタグの判定にひっかかってしまい、期待通りの出力にならない可能性があるので気をつけてください。

Movable Typeでスマホサイト用トップページをPCサイト用トップページと異なるURLにする方法

$
0
0


Movable Typeでスマホ用トップページのURLに、PCサイトと異なるURLを設定する方法を紹介します。

1.サイトパスがドメイン直下の場合

例えば、サイトパスがドメイン直下、

http://user-domain/

となっている状態でスマホ用のトップページのURLを

http://user-domain/i/

としたい場合、スマホ用トップページ(インデックステンプレート)の出力ファイル名を次のように設定します。

出力ファイル名

ファイル名にパスを設定することで、再構築時に「i」というパスを自動生成し、その直下にindex.htmlを出力します。

2.サイトパスがサブディレクトリの場合

サイトパスがサブディレクトリ、

http://user-domain/blog/

になっていて、スマホ用のパスを

http://user-domain/i/blog/

と、サブディレクトリの間に挿入したい場合もあると思います。

このケースでは、インデックステンプレートの出力ファイル名を先程と同様、「i/index.html」と設定しても、URLは、

http://user-domain/blog/i/

となり、期待するパスになりません。

このような場合は、スマホサイト用トップページのインデックステンプレートのファイル名に、次のように相対パスで指定します。

../i/blog/index.html

出力ファイル名

これでスマホサイト用トップページのURLを

http://user-domain/i/blog/

にすることができます。

3.アーカイブページのURLについて

アーカイブページのURLについてスマホ用のURLを設定したい場合、ArchivePathSelectorプラグインを利用してください。

詳細は下記のエントリーをご覧ください。

スマホサイト制作に役立つ「ArchivePathSelectorプラグイン」バージョンアップ

YouTubeの動画を途中から再生させる方法

$
0
0


ときどきブログ記事などで「YouTubeのこの動画のXX秒から見てください」みたいな文章をみかけることがありますが、その秒数まで移動するのは結構面倒です。

ということで動画を途中から再生させる方法を紹介します。

1.動画を途中から再生できるリンクを表示する

まずはサンプルです。クリックすれば動画の途中から再生が開始します。

本田圭佑の無回転フリーキックのスローモーション

動画を途中から再生できるリンクを表示するには、閲覧しているYouTube動画の下にある「共有」をクリックして表示された「この動画へのリンク」からリンクを取得します。

この動画へのリンク

http://youtu.be/WVIdfNOfUO8

36秒の部分から開始したい場合は、このURLの末尾に「#t=36s」を加えます。

http://youtu.be/WVIdfNOfUO8#t=36s

1分05秒から開始したい場合は、URLの末尾に「#t=1m05s」を加えます。

http://youtu.be/WVIdfNOfUO8#t=1m05s

あとは、このURLをa要素のhref属性に設定して自分のブログなどに貼り付ければOKです。1項の冒頭に掲載したサンプルのコードも念のため掲載しておきます。

<a href="http://youtu.be/WVIdfNOfUO8#t=36s">本田圭佑の無回転フリーキックのスローモーション</a>

これは公式サイトで「ディープリンク」と呼ばれている機能で、YouTubeのコメント欄でも使えます。

YouTube ヘルプ - ディープリンク

ちなみに、特定の時間のリンクは再生中の動画を右クリックして、「現時点の動画のURLをコピー」を選択しても取得できます。一時停止中でも取得できます。

現時点の動画のURLをコピー

2.ブログなどに表示する動画を途中から再生できるようにする

自分のブログなどに貼り付けたYouTubeの動画を途中から再生できるようにするには、次のいずれかで可能です。サンプルはあとで掲載します。

閲覧しているYouTube動画の下にある「共有」→「埋め込みコード」をクリックして表示されたコードを取得します。

埋め込みコード

あとは1項と同様、コードに含まれるURLの末尾に「#t=36s」などを加えてブログに貼り付ければOKです。

<iframe width="420" height="315" src="http://www.youtube.com/embed/WVIdfNOfUO8#t=36s" frameborder="0" allowfullscreen></iframe>

iframe要素以外に、次のobject要素で表示させることもできます(以前はobject要素を取得できましたが、2011年11月現在ではiframeでしか取得できないようです)。

<object style="height: 344px; width: 420px">
<param name="movie" value="https://www.youtube.com/v/WVIdfNOfUO8?version=3&feature=player_embedded&start=10">
<embed src="https://www.youtube.com/v/WVIdfNOfUO8?version=3&feature=player_embedded&start=36" type="application/x-shockwave-flash" width="420" height="342" />
</object>

embed要素のsrc属性のURLを次のように変更します。

https://www.youtube.com/v/WVIdfNOfUO8?version=3&feature=player_embedded&start=36

赤色が可変部分で、「WVIdfNOfUO8」の部分は1項で取得したURLの末尾の文字列を設定し、「start=」の後方に開始秒数を設定します(分は秒に変換)。以下は実際のサンプルです。

object要素で途中から再生を開始するサンプル

URLに含まれる「version=3」をはずすと、動画の再生開始時間が「0:00」になり、再生を開始した時点で指定した時間までスキップされます(追記:閲覧環境によってそうならない場合があるようです)。

「version=3」をはずしたサンプル

が、再生開始時間は最初から表示されている方が親切でしょう。

3.コード出力ツール

object要素を手で書くのは面倒なのでツールを用意しました。

YouTube用コード生成ツール
YouTube用コード生成ツール

Linkには1項の手順で取得した「この動画へのリンク」をそのまま貼り付け、開始したい分・秒を設定すれば適切なobject要素(またはiframe要素)を取得できます。

Movable Type 5のダイナミックパブリッシングでのページ分割について

$
0
0


Movable Type 5のダイナミックパブリッシングでのページ分割を紹介します。

ダイナミックパブリッシングでのページ分割

1.ダイナミックパブリッシングによるページ分割について

Movable Typeでは、バージョン4.2からのアーカイブテンプレートについて、ダイナミックパブリッシングでのページ分割機能を提供しています。

ダイナミックパブリッシングでのページ分割

※詳細なテストを行っていない実験的機能なのでサポート対象外です。

2.ページ分割方法

まず、「月別ブログ記事リスト」や「カテゴリ別ブログ記事リスト」などの「公開」オプションを「ダイナミック」に変更します。

「公開」オプション

次にブログ記事リストアーカイブテンプレートのMTEntriesタグに対し、limitモディファイアとoffsetモディファイアを設定し、limitモディファイアに1ページに表示したい記事数を設定、offsetモディファイアに「auto」を設定します。

例えば、5ブログ記事単位にページ分割したい場合は次のように設定します。

<mt:Entries limit="5" offset="auto">

ナビゲーションはMTEntriesタグ内に次のように設定します。

<mt:EntriesHeader>
<div class="content-nav">
  <mt:ifPreviousResults>
    <a href="<$mt:PreviousLink encode_html="1"$>" rel="prev">&laquo; Previous</a>&nbsp;&nbsp;
  </mt:ifPreviousResults>
  <mt:PagerBlock>
    <mt:ifCurrentPage>
      <$mt:GetVar name="__value__"$>
    <mt:else>
      <a href="<$mt:PagerLink encode_html="1"$>"><$mt:GetVar name="__value__"$></a>
    </mt:ifCurrentPage>
    <mt:unless name="__last__">&nbsp;</mt:unless>
  </mt:PagerBlock>
  <mt:ifMoreResults>
    &nbsp;&nbsp;<a href="<$mt:NextLink encode_html="1"$>" rel="next">Next &raquo;</a>
  </mt:ifMoreResults>
</div>
</mt:EntriesHeader>

MTEntriesタグ内に記述するため、1回だけ表示されるよう、全体をMTEntriesHeaderタグで括っています。MT4.2ではMTEntiresタブブロックの外側にナビゲーションを設置できたように記憶していますが、MT5.xでは動作しなかったので、このようにしています。

上記のタグを使ったナビゲーションは冒頭のスクリーンショットのように表示されます。

ナビゲーションのバリエーションについては、バージョン4.2の記事ですが以下が参考になると思います。

WingMemo - ダイナミック・パブリッシングで頁分割(8) MT4.2公式編

Movable Typeのダイナミックパブリッシングでのページ分割ナビゲーションの不具合を解消する

$
0
0


先日「Movable Type 5のダイナミックパブリッシングでのページ分割について」の続きで、ページ分割によるナビゲーションの不具合と、修正方法を紹介します。不具合が発生する事象はMT5.xだけでなく、MT4.292でも確認しています。

※ダイナミックパブリッシングでのページ分割は実験的機能なのでサポート対象外です。

1.問題点

アーカイブページのページ分割を行ったとき、分割ページが2ページになるケースに限って、1ページ目でナビゲーションを表示するためのMTIfMoreResultsタグが正常に動作しないようです。

例えば、ナビゲーション表示のために以下のサブテンプレートを利用している場合、1ページ目で赤色の部分が正常に実行されません。

<mt:EntriesHeader>
<div class="content-nav">
  <mt:ifPreviousResults>
    <a href="<$mt:PreviousLink encode_html="1"$>" rel="prev">&laquo; Previous</a>&nbsp;&nbsp;
  </mt:ifPreviousResults>
  <mt:PagerBlock>
    <mt:ifCurrentPage>
      <$mt:GetVar name="__value__"$>
    <mt:else>
      <a href="<$mt:PagerLink encode_html="1"$>"><$mt:GetVar name="__value__"$></a>
    </mt:ifCurrentPage>
    <mt:unless name="__last__">&nbsp;</mt:unless>
  </mt:PagerBlock>
  <mt:ifMoreResults>
    &nbsp;&nbsp;<a href="<$mt:NextLink encode_html="1"$>" rel="next">Next &raquo;</a>
  </mt:ifMoreResults>
</div>
</mt:EntriesHeader>

1ページ目のナビゲーションは次のようになります。本来は「2」の右側に「Next »」というリンクが表示されるはずですが、表示されません。

ナビゲーションが表示されない

2.対処方法

MTIfMoreResultsタグのダイナミックパブリッシング処理を修正します。以下のリンクから対処ファイルをダウンロードしてください。

block.mtifmoreresults.zip

アーカイブを展開して、中にある「block.mtifmoreresults.php」をMovable Typeインストールディレクトリにある、

php/lib/block.mtifmoreresults.php

と置き換えてください。元のファイルはリネームするか、別のディレクトリに移動するなどして、念のため保存しておいてください。

これで、1ページ目のナビゲーションが次のように表示されます。

ナビゲーションを表示

Movable Type 5.1の検索で検索結果テンプレートを指定する方法

$
0
0


Movable Type 5.1の検索で検索結果テンプレートを指定する方法を紹介します。ここで紹介する方法は5.12で動作確認しています。

1.基本動作

検索結果テンプレートの基本的な動作は次のようになります(公式ドキュメントより抜粋)。

Movable Type 5 ドキュメント - 検索ページのカスタマイズ

IncludeBlogsで最初に指定したブログのテンプレートを利用します。

IncludeBlogsは検索対象を指定するパラメータで、フォームに次の赤色のように記述します。

<form method="get" action="<$mt:CGIPath$><$MTSearchScript$>">
    <input type="text" id="search" name="search" value="<$mt:SearchString$>" />
    <input type="hidden" name="IncludeBlogs" value="1,2,3,4,5" />
    <input type="submit" value="GO" />
</form>

ブログIDを1つしか指定しなければそのブログIDの検索結果テンプレートを利用します。上記の設定ではブログID「1」の検索結果テンプレートを利用します。

2.特定のブログの検索結果テンプレートを指定する

検索フォームに赤色のinput要素を追加します。value属性には、検索結果テンプレートを使用したいブログのブログIDを指定します。

<form method="get" action="<$mt:CGIPath$><$MTSearchScript$>">
    <input type="text" id="search" name="search" value="<$mt:SearchString$>" />
    <input type="hidden" name="IncludeBlogs" value="1,2,3,4,5" />
    <input type="hidden" name="blog_id" value="2" />
    <input type="submit" value="GO" />
</form>

この場合はブログID「2」の検索結果テンプレートを利用します。

3.代替テンプレートを使って検索結果を表示する

「代替テンプレート」とは、どのブログにも属さないテンプレートを指します。検索フォームにname属性「Template」のinput要素を追加することで、検索結果用の代替テンプレートを指定します。

代替テンプレートを使った検索結果のサンプル
代替テンプレートによる検索結果

検索結果用の代替テンプレートは、MTのインストールディレクトリにあるsearch_templatesディレクトリに配置します。そのディレクトリにはdefault.tmplがサンプルとして置かれているので、それをリネームして利用すると良いでしょう。なお正式な代替テンプレートファイル名として「default.tmpl」は利用できないので注意してください。

代替テンプレートを使って検索結果を表示するには、mt-config.cgiに次の内容を追加します。ここでは代替テンプレートのファイル名を「altsearch.tmpl」とします。

SearchAltTemplate altsearch altsearch.tmpl

検索フォームに次のinput要素を追加します。value属性には、SearchAltTemplateで設定した2つめの文字列(=利用したい代替テンプレートの拡張子を除いた名称)を設定してください。

<input type="hidden" name="Template" value="altsearch" />

代替テンプレートを利用するときに、すべてのブログを検索対象にしたい場合は、name属性がblog_idおよびIncludeBlogsのinput要素を指定しないでください。ただしこの設定を行った場合には不具合が発生するため、対処方法は別途エントリーします。

blog_idのinput要素を指定した場合、代替テンプレートで利用するテンプレートタグについて、指定したブログIDの情報が適用されることがあります。例えばMTLinkタグがそうです。

IncludeBlogsのinput要素でブログIDを指定すれば、指定したブログを検索対象にして代替テンプレートで検索結果を表示することができますが、先頭に設定したブログIDの情報が適用されることがあります。適用されることで何か不都合が生じる場合はblog_idと併用することを推奨します。

4.参考情報

Movable Type 5.1の検索で「blog_idパラメータが不正です。」となる不具合の対処

$
0
0


Movable Type 5.1の検索で検索結果テンプレートを指定する方法」で紹介した方法で不具合が発生するケースがあるので、その対処方法を紹介します。

1.問題点

次のような検索フォーム(blog_idおよびIncludeBlogsのinput要素を指定しない)で検索を実行します。

<form method="get" action="<$mt:CGIPath$><$MTSearchScript$>">
    <input type="text" id="search" name="search" value="<$mt:SearchString$>" />
    <input type="submit" value="GO" />
</form>

この場合、次の「blog_idパラメータが不正です。」というエラーが発生します。

検索時のエラー

そもそも、blog_idおよびIncludeBlogsを指定しない検索フォームが適切かどうかという点ですが、2011年11月現在の公式ドキュメントに次の記載があり、適切であるように読み取れます。

Movable Type 5 ドキュメント - 検索ページのカスタマイズ

管理しているブログ全てを検索の対象にしたい場合は、検索フォームの IncludeBlogsを削除し、検索対象の絞り込みをしないようにします。

<form method="get" action="<$mt:CGIPath$><$MTSearchScript$>">
    <input type="text" id="search" name="search" value="<$mt:SearchString$>" />
    <input type="submit" value="GO" />
</form>

ソースコードをトレースしたところ、MT5.0はドキュメント通りの動作になるようですが、MT5.1では検索時のパラメータチェック処理が変更されており、冒頭のエラーが発生するようです。

2.対処方法

MT5.1(ここではMT5.12)での対処方法は、lib/MT/App/Search.pmの以下の赤色で示した2行を、削除またはコメントアウト(行頭に「#」を付与)します。

変更前

…前略…
sub init_request {
    my $app = shift;
    $app->SUPER::init_request(@_);
    …中略…
 
    # invalid request if they are given Zero as blog_id
    return $app->errtrans( 'Invalid [_1] parameter.', 'blog_id' )
        unless ( $blog_id > 0 );
 
    my $params = $app->registry( $app->mode, 'params' );
    …中略…
}
…後略…

変更後

…前略…
sub init_request {
    my $app = shift;
    $app->SUPER::init_request(@_);
    …中略…
 
    # invalid request if they are given Zero as blog_id
#    return $app->errtrans( 'Invalid [_1] parameter.', 'blog_id' )
#        unless ( $blog_id > 0 );
 
    my $params = $app->registry( $app->mode, 'params' );
    …中略…
}
…後略…

本対処はMT5.0で存在していなかったチェック処理を削除しただけです。

これで冒頭のエラーは発生しなくなりますが、処理を削除することで他の問題が発生する可能性がありますので、自己責任でご利用ください。


テーブルを直接編集できるjQuery.TableEditorプラグイン

$
0
0


テーブルを直接編集できるようにするjQuery.TableEditorプラグインを紹介します。

1.サンプル

以下のリンク先にサンプルを用意しました。jQuery.TableEditorプラグインの動作を確認できます。

サンプル
サンプル

「編集」をクリックすれば、テーブルのセルがテキストフィールドに切り替わります。

サンプル

「保存」をクリックすれば、テキストフィールドに入力した値がテーブルに表示されます。入力した値は保存時に起動する関数を利用してデータベースやファイルに保存できます。

2.プラグインのダウンロード

TableEditorのページから「tableEditor」と「tableSorter」をダウンロードします。

TableEditor
TableEditorのページ

3.jquery.tableEditor.jsの修正

ダウンロードしたjquery.tableEditor.jsはjQueryの最新バージョン(2011年11月現在では1.7.1)では正常に動作しないため、以下の2ヶ所を修正します。

変更前

…前略…
jQuery.editRow = function(link, tid) {
  …中略…
  var action = (jQuery(link).is('.tsToggleEdit')) ? 'save' : 'edit';
  var row = jQuery("../../td",link);
  var key = jQuery(o.ROW_KEY_SELECTOR,row).text();
  …中略…
  if (action == 'edit') {
    row.each(function(i) {
      if (fRow.index(this) < 0)
        …後略…

変更後

…前略…
jQuery.editRow = function(link, tid) {
  …中略…
  var action = (jQuery(link).is('.tsToggleEdit')) ? 'save' : 'edit';
  var row = jQuery("td",jQuery(link).parent().parent());
  var key = jQuery(o.ROW_KEY_SELECTOR,row).text();
  …中略…
  if (action == 'edit') {
    row.each(function(i) {
      if (fRow.index(this) < 1)
        …後略…

4.設定

テーブルを編集できるようにするには、JavaScriptを次のように設定します。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.tableEditor.js"></script>
<script type="text/javascript">
$(function() {
    $("#editableTable").tableEditor({
        EDIT_HTML: '(編集)',
        SAVE_HTML: '(保存)',
        FUNC_PRE_EDIT: 'preEdit',
        FUNC_POST_EDIT: 'postEdit',
        FUNC_PRE_SAVE: 'preSave',
        FUNC_UPDATE: 'updateTable'
    });
});
function preEdit(o) {
  // alert('FUNC_PRE_EDIT called');
}
function postEdit(o) {
  // alert('FUNC_POST_EDIT called');
}
function preSave(o) {
  // alert('FUNC_PRE_SAVE called');
}
function updateTable(o) {
  // alert('FUNC_UPDATE called');
}
</script>

指定したtable要素のエレメントに対してtableEditor()を実行します。

$("#editableTable").tableEditor({ ... });

tableEditor()の主なパラメータの意味は次の通りです。

  • EDIT_HTML:保存後の編集用のリンクテキスト
  • SAVE_HTML: 編集時の保存用のリンクテキスト
  • FUNC_PRE_EDIT:編集前に起動する関数名を指定
  • FUNC_POST_EDIT:編集開始後に起動する関数名を指定
  • FUNC_PRE_SAVE:保存前に起動する関数名を指定
  • FUNC_UPDATE:保存後に起動する関数名を指定

table要素は次のように設定します。

<table id="editableTable">
  <thead>
  <tr>
    <th name="ID" class="pvV pvNumber">ID</th>
    <th id="name" name="first" class="pvV pvEmpty" >商品名</th>
    <th id="price" name="last" class="pvV pvEmpty">価格</th>
  </tr>
  </thead>
  <tbody>
    <tr><td><key>1</key><a href="#" class="tsEditLink">(編集)</a></td><td>あああ</td><td>1000</td></tr>
    <tr><td><key>2</key><a href="#" class="tsEditLink">(編集)</a></td><td>いいい</td><td>3000</td></tr>
    <tr><td><key>3</key><a href="#" class="tsEditLink">(編集)</a></td><td>ううう</td><td>200</td></tr>
    <tr><td><key>4</key><a href="#" class="tsEditLink">(編集)</a></td><td>えええ</td><td>500</td></tr>
  </tbody>
</table>

tableのid属性にはtableEditor()を実行するエレメントを設定します。また、一番左側のtd要素に、次のリンクを設定します。

<tr><td><a href="#" class="tsEditLink">(編集)</a></td>~</tr>

class属性値に「tsEditLink」を設定します。この属性値はtableEditor()のオプションに「EVENT_LINK_SELECTOR」を設定することで変更できます。

また、サンプルのように編集リンク部分にkey要素を指定すれば、編集用リンクと併せて値を設定することができるようです。

<tr><td><key>1</key><a href="#" class="tsEditLink">(編集)</a></td>~</tr>

5.テーブルに入力した値の取得

テーブルに入力した値を取得には、保存時に起動する関数を使って次のように記述します。

function updateTable(o) {
    var data = o.row[1].innerHTML;
    // dataの値をデータベースやファイルに保存
}

配列o.rowのインデックスはテーブルの列を指定します。一番左の列(td要素)の内容がインデックス「0」に保存されています。保存時にデータベースやファイルにアクセスすれば、変更した値を保存させることができます。

以上です。他にもソートや行追加などの機能がありますが、これらについては別途エントリーします。

MTCafe Tokyo開催のお知らせ

$
0
0


「MTCafe Tokyo」開催のお知らせです。

MTCafe Tokyo
MTCafe

10月にMTCafeが名古屋で開催されました。「MTCafe Tokyo」はその東京版です。MTCafeとは、Movable Typeのユーザーが気軽に集まってMTの情報交換をする場です。MTCafeを考案された@riatwさんによるコンセプトは次のとおりです。

"だれでも"、"気軽に"、"楽しく"、MTに触れることのできる場所です。
お茶、コーヒーなどを飲みながら、情報交換したり、おしゃべりしたり、 参加者同士でホームページやプラグインを作ったりしませんか?

仕事でMTに携わっている方、趣味のブログとして使っている方、カスタマイズで悩みがある方、これからMTに触れてみたいという方、どなたでも参加できます。

ということで「MTCafe Tokyo」の開催案内です。

  • 日時:2011年12月3日(土)13:30開場、14:00~16:30頃(出入り自由)
  • ​​参加費:500~1000円程度(会議室・その他施設利用料金・準備料金を参加者全員で頭割り)
  • 場所​​:ITS市ヶ谷健保会館 F会議室
    (東京都新宿区市谷仲之町4-39 市ヶ谷健保会館1F
    都営新宿線曙橋駅下車徒歩8分
    都営大江戸線牛込柳町駅下車徒歩8分
    地下鉄丸ノ内線四谷三丁目駅下車徒歩15分)
    地図
  • 持ってくるもの:必要に応じてパソコン・インターネット環境
  • 主催:にっくさん
  • 申し込み:MTCafe Tokyo - お申し込み

下のGoogleマップを拡大した中心にある「リエール市ヶ谷」がその場所みたいです。


大きな地図で見る

この建物っぽいです。

MTCafe

11月30日現在、18名の方が参加予定です。私も都合がよければ参加したいと思います。

Facebookページの新しいインサイト機能で「いいね!」をクリックしたユーザー一覧を確認する方法

$
0
0


本題と関係ありませんが、Facebookページ「小粋空間」が1000いいね!を達成しました。クリックしてくださった皆様、ありがとうございます。

Facebookページ「小粋空間
Facebookページ

で、本題です。

Facebookページの管理人であれば、以前は数字の下に表示されたテキストリンクをクリックすれば、「いいね!」をクリックしたユーザーの一覧が表示されたのですが、10月に新しいインサイト機能が導入されてから、クリックするとインサイトのページに移動するように変更されました。

Facebookページ

インサイトのページ
インサイトのページ

とはいっても、「いいね!」をクリックしたユーザーの一覧を見ることができなくなったわけではありません。すでにご存知の方も多いと思いますが、移動先のインサイトページ右側にある「いいね!を見る」をクリックします。

インサイト

これで「いいね!」をクリックしたユーザーの一覧をこれまでと同じように確認することができます。

ユーザーの一覧

以上です。

あと、どうでもいいのですが、新しいインサイト機能が導入されてから、「1000」の下に表示されている「人が人が~」という誤記がずっと放置されているのが気になって仕方ありません(笑)。

Facebookページ

逆に、その下の「51」のところに「人が」という表示が抜けているので、おそらく表記場所が間違っていると思います。

いつ修正されるのか楽しみです(笑)。

Movable Typeでブログ記事投稿ユーザーの情報を取得するEntryAuthorDataプラグイン

$
0
0


Movable Typeでブログ記事投稿ユーザーの情報を出力するための「EntryAuthorDataプラグイン」を公開します。

1.機能

このプラグインは、ブログ記事に投稿したユーザー情報を取得するためのMTEntryAuthorDataブロックタグを提供します。

例えば、次のようにMTEntriesタグを使ったブログ記事コンテキストやブログ記事ページの中でMTEntryAuthorDataタグを記述します。MTEntryAuthorDataタグブロック内ではMTAuthorxxファンクションタグを使ってブログ記事投稿者の情報を取得することができます。

<mt:Entries>
  <mt:EntryAuthorData>
    <$mt:AuthorBasename$>
  </mt:EntryAuthorData>
</mt:Entries>

なお、デフォルト機能を使った次のサブテンプレートでも同様の機能が実現可能ですが、直感的に使えるようなテンプレートタグという意味で作ってみました。

<mt:Entries>
  <$mt:EntryAuthorDisplayName setvar="name"$>
  <mt:Authors display_name="$name">
    <$mt:AuthorBasename$>
  </mt:Authors>
</mt:Entries>

このプラグインは以下のMTQフォーラムの質問・回答より着想を得たものです。

MTQフォーラム - 「ブログ記事」で<$mt:AuthorBasename$>を

本当はMTEntryAuthorというブロックタグ名が適切なのですが、デフォルトで同名のファンクションタグが存在するため、MTEntryAuthorDataとしました。

2.プラグインのダウンロード

下記のリンクをクリックして、プラグインアーカイブをダウンロードします。

修正履歴

2011/12/02 初版
EntryAuthorData_0_01.zip

プラグインアーカイブを展開し、中にあるEntryAuthorDataフォルダごと、Movable Type のアプリケーションディレクトリのpluginsディレクトリにアップロードします。

システム管理画面のプラグイン設定画面で、「EntryAuthorData~」が表示されればインストール完了です。

プラグイン設定画面

WordPressのサイドバーリストをjQueryでツリー化する「wp_tree_makerプラグイン」バージョンアップ

$
0
0


WordPressのサイドバーリストをjQueryでツリー化する「wp_tree_makerプラグイン」を2.2にバージョンアップしました。

1.変更点

リストの第1階層にもツリーを表示するためのチェックボックスを追加しました。

wp_tree_maker管理画面
wp_tree_maker管理画面

これまでのツリー表示(リストの第2階層以降に適用)
これまでのツリー表示

バージョンアップ後のツリー表示(リストの第1階層にも適用可能)
第1階層にも適用した表示

2.プラグインのダウンロード

バージョンアップしたプラグインは以下のリンク先からダウンロードできます。

WordPressのサイドバーリストをjQueryでツリー化する「wp_tree_maker」プラグイン
Viewing all 219 articles
Browse latest View live




Latest Images