CMSの最近のブログ記事

MovableType|正規表現で変数を使う

regex_replaceで変数を使う場合、ちょっとコツがあったのでメモメモ。

検索文字列を変数「hoge」に入れた場合、regex_replace="/$hoge/","fuga" だとうまくいかない。
正解は、変数「hoge」に最初から「/」を入れておくこと。

-----

例)「馬」→「鹿」に変換したい場合

<$mt:SetVar name="hoge" value="/馬/" $>
<$mt:Munya regex_replace="$hoge","鹿" $>

-----

元ネタはこちら
https://mixi.jp/view_bbs.pl?comm_id=4620862&id=56450038

表題の件を探したところ「かたつむりくんのwww」に良い記事があったのでメモメモ。
https://tinybeans.net/blog/2012/06/16-075413.html

 

<$mt:SetVar name="favorite" value="バッジョ,ジーコ,クライフ,ピルロ,ストイコビッチ,グアルディオラ"$>
<$mt:Var name="favorite" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="length"$>

<mt:For var="i" from="1" to="$length">
  <mt:If name="__first__"><ul></mt:If>
  <$mt:Var name="favorite" regex_replace="/^([^,]+).*/","$1" setvar="value"$>
  <$mt:Var name="favorite" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="favorite"$>
  <li><$mt:Var name="value"$></li>
  <mt:If name="__last__"></ul></mt:If>
</mt:For>

カンマの数を拾ってループさせる回数を決め、<For>でその回数だけ回して、使った分だけ削って次へ回す感じかな。

元ページのほうに詳しい解説があるのでそちらも参照すること。

実案件で作ったので備忘録。

クライアントは某自治体(代理店も入っているので名前は明かせない)。今回の要望は「更新をすべてトップページに表示したい」。当初は更新情報の子ブログを立ち上げて手動で入力した発信することを提案したが、担当者さまは自動生成へのこだわりが強いようす。話を聴いていくと市民からのニーズが確実にあること、更新者が多数いて更新した情報を集めるだけでも大変で、多少不完全なものであっても自動生成のほうが合理的と分かりました。

そこでこんな仕様で組んでいます。

◆「更新情報」は最近30日に更新のあったものを表示。
◆ウェブページはすべて監視して、「最終更新日」をキーに「更新日:<ページタイトル>を更新しました」と表記
◆新着情報などブログにしてあるものは「公開日:<記事タイトル>を更新しました」
◆一覧を日付順に並べる

ひと工夫する必要があったのが「一覧を日付順に並べる」という部分。いったん配列変数に格納してLoopで並び替えながら取り出すことに。

配列変数を入れ子にする必要があって、下層の日付をキーにして並べ替えしたかったけど方法が見つからない。MTLoopの並び替えは「sort_by=」の値に「key」or「value」以外の選択肢は無さそう。なのでここは日付+記事IDをkeyに設定することで解決。

 

----------
参考ソース
----------

【ブログ記事を配列変数に格納】

<mt:Entries days="30" blog_ids="9,17,14">
    <mt:SetVarBlock name="entryKey"><$mt:EntryDate format="%Y%m%d"$><$mt:EntryID$></mt:SetVarBlock>
    <mt:SetHashVar name="updateEntries">
        <mt:SetHashVar name="$entryKey">
            <mt:SetVarBlock name="date"><$mt:EntryDate format="%Y.%m.%d"$></mt:SetVarBlock>
            <mt:SetVarBlock name="ttl"><$mt:EntryTitle$> を更新しました</mt:SetVarBlock>
            <mt:SetVarBlock name="cate"><$mt:EntryBlogName$></mt:SetVarBlock>
            <mt:SetVarBlock name="url"><$mt:EntryPermalink$></mt:SetVarBlock>
        </mt:SetHashVar>
    </mt:SetHashVar>
</mt:Entries>

 

【ウェブページについても似た感じで配列変数に格納】

※ソースは省略
※ただしこちらは公開日でなく更新日がキーなのでdaysモディファイアが使えない。
 ごにょごにょと書いて30日前までに更新された記事を抽出するように。

 

【表示部】

<mt:Loop name="updateEntries" sort_by="key reverse">
    <mt:GetVar name="__value__" setvar="updateEntry">
    <dl class="homeNewsItem">
        <dt><$mt:GetVar name="updateEntry{date}"$></dt>
        <dd class="entryDate" datetime="<$mt:GetVar name='updateEntry{date}'$>"><a href="<$mt:GetVar name='updateEntry{url}'$>"><$mt:GetVar name='updateEntry{ttl}'$></a></dd>
    </dl>   
</mt:Loop>

 

実際にはブログによって定型文に変えたりリンク先を記事ページ以外にしたりと激しく分岐させてるけど、上記で骨子の部分は思い出せるかな。

クライアントのサイトで不可解な現象に遭遇。詳細ページの体裁を変更するためにアーカイブテンプレートを探したらどこにも見当たらない。実はインデックステンプレートで詳細ページを書き出していたという仕様でした。

何故そのような仕様になったかここでは説明できないのだけれど、インデックステンプレートをアーカイブテンプレート的に使うことができるのは驚き。MT7からのコンテンツタイプを使い込んでいくと、もしかするとこれを使う機会も出てくるかもしれないのでメモメモ。

-----

これをやるためにはH.Fujimotoさんが公開しているプラグインが必要。サイト上ではMT5.0から6.2までの対応とあるが、クライアントの7.0でも動いているようだ。

https://www.h-fj.com/mtplugins/writetofile.php

基本的には1ページを書き出すものなのだが、条件を設定してLoopなどを回すことで複数書き出すことができる。

他にもアーカイブテンプレート内に設置して、例えば個別店舗を案内するときに、地図がある場合だけ地図ページを書き出すといった使い方も考えられるかな。

 

【concrete5】タイトルタグの調整

concrete5は標準で「ページ名 :: サイト名」となるが、ほぼほぼ変更したくなるので方法をメモメモ。
※5.7以降のモダンバージョンが対象

----------

【システム上で表記方法を変更】

全体を「ページ名|サイト名」という体裁に変更したい場合。

コアファイル /application/config/generated_overrides/concrete.php を
オーバライド /application/config/concrete.php にコピーして記述する
※変更する部分だけ記述すること

タイトルの体裁だけなら
return [
    'seo' => array( 'title_format' => '%2$s | %1$s'),
];

その他にもいろいろ設定を変更できるので下記を参照
https://concrete5-japan.org/help/5-7/recipes/config?

 

----------

【特定ページだけタイトルを変更】

そのページの歯車マーク「設定」から「SEO」へ進み、「METAタグタイトル」を入力すればOK。
HOMEなどはこれで変更すると良い。

MTAppjQueryで設定をへぐったところ、管理画面がjs不完全な感じのエラーで不具合となり、プラグイン画面からMTAppjQueryの設定を開くことができなくなり、進むも退くもできなくなってしまった。結局、DBを直接いじって初期化できたのでメモメモ。

まずはphpMyAdminでDBを開き、テーブル: mt_plugindataを覗く。

「plugindata_plugin」カラムが「MT::Plugin::MTAppjQuery」のデータのうち、「plugindata_key」カラムで「configuration:blog:3」のように目標のブログIDを記述してあるデータを削除すると初期化できる。

MT|mtevalとリッチテキストエディタ

モディファイア「mteval」を使うと、エントリーやウェブページの本文内でMTタグが使えますが、エディタの「HTML編集モードの切り替え」をするとボロボロになってしまいます。

自分が管理するなら何とかなりますが、クライアントに使ってもらうには厳しいですよね(汗

何かうまい対策方法はあるものでしょうか?

-------------------------

ってな投稿をMTQに上げたところ、自己解決したのでメモメモ。

  • エディタの自動変換にかからない文字列を、regex_replaceでMTタグに置換する。
  • 置換するMTタグは長くなるだろうからモジュール化してinclude
  • mtEntryBodyに直接だと何故だかうまくいかないので、いったん変数に格納してから展開
 

<mt:SetVarBlock name="dispBody">
<$mtEntryBody regex_replace="/\[include テストモジュール\]/g",'<mt:Include module="テストモジュール" />' $>
</mt:SetVarBlock>
<mt:GetVar name="dispBody" mteval="1">

 

投稿には、

[include テストモジュール]

ってな具合で。

concrete5のver.5.7を下層の「/dev/」ディレクトリで開発し、ルートで公開したので手順をメモメモ。

前提として、テンプレートでのリンクの書き方は <a href="<?php echo DIR_REL ?>/hoge"> のようにしてインストールディレクトリを起点に記述しておくこと。

  1. 「/dev/」ディレクトリの中身を「/(ルート)」へまるごとコピー
  2. .htaccessの記述のうち、「/dev/」へリダイレクトさせる部分を「/」に変更。

2番の手順を見つけるのにちょいと手間取ってしまった(汗

1番の手順はSSHが使えるならワンパン作業。使えない場合はFTPなどでDL&ULなので時間がかかる。

なお、サブドメインのルートで開発しておいてDNS切り替えで公開という形だと2番もいらないので一番楽ちんかもね。
そう考えると、CPIのスマートリリースとは相性が良さそう。

 

Concrete5関連の情報

Concrete5関連の情報をググっていたら、ゆずさんという方のサイトがよくまとまっていたのでURLをメモメモ。

5.7用覚書
http://immature.01kawa.com/php/concrete5/concrete5-custom/5-7/

concrete5の覚書
concrete5の変数・コード・スニペット
http://immature.01kawa.com/php/concrete5/concrete5%E3%81%AE%E5%A4%89%E6%95%B0%E8%A6%9A%E6%9B%B8/

[concrete5] 5.7 記事ブロックのツールバー

concrete5 5.7の記事ブロックのツールバーはとても貧弱。文字の大きさを変えるくらいもできないのかと思っていたら、

管理画面 > システムと設定 > 基本 > 記事ブロックエディター設定

から多少の設定変更が可能でした。
ツールバーに機能を追加するようなアドオンを入れた場合に、ここから設定をONにしないと使える状態にならない場合もあるので頭においておくこと。

----------------

記事ブロックのツールバー、文字色のパレットに色を追加する方法見つけたのでメモ。

concrete/js/redactor.js をごにょごにょすればOK。
※本体はいじらず、applicationに複製してオーバーライドすること。

[concrete5]ブロックカスタマイズのメモメモ

5.7でブロックをカスタマイズするのに、ひっかかりまくり。
いろいろとメモしてきます。

------------------------

ブロックをapplicationに複製するとエラーになる

controller.phpの中の名前空間「namespace」を書き換える必要がある。

例)namespace Application\Block\Faq;

------------------------

MT for AWS|作業メモあれこれ

いろんなサイトに情報はあるが、SSHに慣れている人向けだったりするので、前提になる「そもそも情報」が抜けてたりする。見つけたサイトをここにメモメモ。

--------------------------------------

元ネタはこちら
http://dev.classmethod.jp/cloud/aws/aws-beginner-ec2-ssh/

 

まず、AWSを設置する際の下記の情報があることを確認

  • グローバルIP or ホスト名
  • 秘密鍵(.pem)

次に、ユーザ名。AmazonLinuxはデフォルトで[ ec2-user ]

 

TeraTermで接続

「新しい接続」でグローバルIPを入力してOK

次の画面で、ユーザ名を入れ、秘密鍵を選択するが、
.pemは一覧に出なかったりするので「すべてのファイルを表示」で探す

これでログインできれば成功!

 

WinSCPで接続

上記のグローバルIPと秘密鍵、ユーザ名で接続できるはず。

ただし、/home内のカレントディレクトリ以外はパーミッションの関係でアップロードできない。
これは、SSH接続して、コマンド[ sudo ]のスーパーユーザ権限を使って、パーミッションを変更してあげる必要あり。

--------------------------------------

プラグインをアップロードしても反映されない場合

元ネタはこちら:http://communities.movabletype.jp/2016/06/awsmtappjquery.html

AWS版やクラウド版のMTは、PSGIで動作していてシステムがメモリに常駐しているために、プラグインをアップロードしただけでは読み込まれない。アップロード後に下記のいずれかで再起動する必要がある。

 

[MovableType]カテゴリーページで、記事一覧

元ネタはこちら
http://www.koikikukan.com/archives/2012/04/21-000300.php

MTのカテゴリーページでは、<mtEntries>が使えない。それに対する対策は下記。

<mt:Blogs blog_ids="2" ignore_archive_context="1">
  <mt:Entries blog_ids="2" lastn="10">
    <$mt:EntryTitle$>
  </mt:Entries>
</mt:Blogs>

[ MT ]カスタムフィールドをループで処理

元ネタはこちら
http://www.h-fj.com/blog/archives/2012/11/13-163510.php

 

似たような項目を繰り返してカスタムフィールドを設定することがある。テンプレートで表示させる記述でループで簡略化できないかと考えたが、<$mt:ttl1$>というようなタグの末尾数字を変えていく方法がわからなかった。

これを解決するのが上記URL。

サンプルソースを転記

<mt:For var="x" from="1" to="3">
  <mt:SetVarBlock name="tmpl">&lt;$mt:Color<$mt:GetVar name="x"$>$&gt;</mt:SetVarBlock>
  <$mt:GetVar name="tmpl" decode_html="1" mteval="1"$>
</mt:For>

[ MT ]投稿窓にCSSを反映

元ネタはこちら
http://makepo.jp/content/column/course-cms/mt-tips/2015-06-12.html

 

Movabletypeの投稿窓にCSSを反映させたい場合は「設定」から。

変更したいウェブサイト、ブログを選び、左メニューの[設定] => [投稿] >[WYSIWYGエディタの設定]

元ネタはこちら
http://www.littlepad.net/blog/2009/06/16/123530

MTディレクトリ/tmpl/cms/include/asset_upload.tmpl

の先頭行に、

<$mt:setvar name="extra_path" value="upload_images/"$>

を追加して、(そのままアップすると、アップグレードで戻ってしまうので、)

MTディレクトリ/alt-tmpl/cms/include/asset_upload.tmpl

と、代替えテンプレートとしてアップする。

[concrete5]予期せぬエラーが発生しました。

いろいろな原因があるようで、けっこうハマるポイントだったりする。
経験するたびに書き足していきます。

---------------------------------

page_theme.php冒頭のパス記述にミス

今回はコミュニティからダウンロードしたテーマを自作として登録しようとしてエラーが出た。ディレクトリを移動したので、デフォルトでの記述から書き換えないといけなかった。

C5|5.7をインストールする際の留意点

5.7をインストールする場合は、どこのサーバを使うにせよ、新規契約を前提とすること。

以前から使っているさくらインターネットにテストサーバを作ろうとしたら、設定してあるphpのバージョンが古かった。他のシステムが動かなくなる可能性があるので全体を上げることはできないため、ディレクトリを区切ってPHP5.4を使うように設定しようとしたら大ハマリ。結果、インストールができていない。

新規契約でサーバ全体を自由に設定変更できる場合は、ググって何とかなることも多い。

 

5.7で自作テンプレートで不具合が出た件は、すんなりインストールできたサーバでは不具合で無かった。(-- 要もっと確認)

C5|今回覚えたことをメモしておく

コンポーザーの設定方法(流れだけ)
http://concrete5-japan.org/help/5-6/editing/composer/

  1. コンポーザを使ったページを追加する親ページを作成します。(ホームと同列に作る場合は不要です。)
  2. デフォルト(ひな形)ページを「ページタイプ」として登録します。
  3. 「ページタイプ」のデフォルトページ(ひな形)をページを作成します。
  4. 「ページタイプ」をコンポーザで使う設定をします。

 

ページタイプの削除
http://concrete5-japan.org/community/forums/beginner/post-5836/

ページタイプの設定からできるが、どのページでも一切使っていない状態でないと削除できない。
古いバージョンで使っていてもダメなので、それぞれのページのバージョン削除する必要がある。

 

ブロックのカスタマイズ(ページリストブロックに日付を付加して新着一覧)

要はview.phpをいじれば良い

WordPress|システム外でデータを使う

WordPressのシステム外にphpファイルを作り、データを活用することができる。

<?php
//wp-blog-header.phpを読み込む(WordPress外でもWordPress独自の関数を使えるようにする)
require('./wp-blog-header.php');
?>

冒頭にこんな記述をすると、あとはテンプレートを作る要領でイケる。

2か国語対応が必要となった。決定版といえる「qTranslate」が、作者の都合で更新が止まっているらしい。おまけにコイツはWordPressのアップデートで動かなくなる可能性が高いとのこと。

そこで「bogo」を試したので、いろいろと気がついたことをメモメモ。

----------------------

【中国語が勝手にデフォルトで有効になっている問題】

管理画面からの無効化はできない。[ wp-content / languages / ]の.moファイルを削除することで対応。

----------------------

【言語切り替えのソース】

ショートコード : [bogo]

php内 : <?php echo do_shortcode('[bogo]'); ?>

----------------------

日本語版のとき、「日本語/English」となってほしいのに「日本語/英語」となる。
設定変更するところが無いようなので、正規表現でごにょごにょして何とかした。

----------------------

メニュー項目や定型見出しなどは、英語訳の対照表を配列で作って、ロケールで切り替えるようにすると、訳を変更するときに一括でできるので便利。

----------------------

和英で単語を分岐させる自作関数

//function.php
function wordTrans($word_ja , $word_en){
  $locale = get_locale();
  if('en_US' == $locale ){ echo $word_en ;}
  else{ echo $word_ja ;}
};

//html

<?php wordTrans('和文単語' , 'English_Word'); ?>

 

----------------------

記事を複製するプラグイン「Duplicate Post」を使うと、相方となる翻訳記事の管理がダメになることがあるので注意が必要

----------------------

固定ページにquery_posts()を使うと、ロケールが日本語固定になってしまう(要検証)

----------------------

----------------------

----------------------

----------------------

元ネタはこちら : http://ishoten.com/web/wordpress/wordpress-customization-post-list

function manage_posts_columns($columns) {
        $columns['customfield'] = "タイトル";
        return $columns;
}
function add_column($column_name, $post_id) {
        if( $column_name == 'customfield' ) {
                $stitle = get_post_meta($post_id, 'customfield', true);
        }
        if ( isset($stitle) && $stitle ) {
                echo attribute_escape($stitle);
        } else {
                echo __('None');
        }
}
add_filter( 'manage_posts_columns', 'manage_posts_columns' );
add_action( 'manage_posts_custom_column', 'add_column', 10, 2 );

【WordPress】MW WP FORMの使い方

MW WP FORMがピカイチに使いやすい。ので、使い方メモ

細かいことは下記リンクから

http://plugins.2inc.org/mw-wp-form/

【WP】Facebookプラグイン

Facebook 純正プラグインを試したので設置方法をメモ

(ただし現時点ではまだ接続が成功していない)

  1. 管理画面から「facebook」で検索してプラグインをインストールして有効可
  2. facebookからデベロッパーへログインしてAppの番号を取得する
     -- ここであれこれ設定する必要があるので、それが不動作の原因と思われる
  3.  

【C5】セキュリティ向上策

concrete5 のセキュリティ向上策はまだたくさんは出ていないけど、気がついたり拾えたものからメモを書き溜めていきます。

 

  • スーパーユーザー「admin」の名前を変更
    加えて、スーパーユーザーを使わないときはアカウントを無効にしておく
  • .htaccess でログインファイルを守る。可能ならIP制限、無理ならパスワード制限。
  • config/site.phpファイルの保護(.htaccess)

    # protect site.php.php
    <files wp-config.php>
    order allow,deny
    deny from all
    </files>

  • ディレクトリ一覧の非表示(.htaccess)

    Options –Indexes

    ※サーバにより記述方法が違うかも?

 

今後に期待したいのは、、、

  • ログインを複数回ミスるとログインできなくなるアドオン
    (2015.10.07追記 最初から実装されてるとのこと)

【WP】Wordpress納品前のチェックリスト

ちゃんとまとめておかないと抜けたりするので、ちゃんとメモメモ。
随時追記していきます。

  • ログイン制限プラグインが入っているか
  • (可能なら) .htaccessによる、IP制限もしくはパスワード制限が入っているか
  • お問い合わせフォームの届け先メアドは修正したか
  • コメント・トラックバックは停止してあるか
     -- 個別記事も停止してあるか
  •  

【C5】concrete5のメリットとデメリット

週刊concrete5 より、要旨をまとめてみた。

メリット

  • 直観的な操作 -- お客さんウケが良い
  • 他のCMSに比べてカスタマイズしやすい
     -- っていうか、もともとが企業サイト向けなのでカスタマイズする必要が薄い
  • イニシャルコストが安い -- これはWPも同じか(?)
  • 権限モードがデフォルトでついている
     -- 地味にクライアントから要望があるところ
     -- ガチな権限というより、「確認してから公開したい」程度の要望にも対応可能。
       -- 下書き保存&プレビュー機能が意外に便利
  • 「フルページキャッシュ」機能を使うと、静的HTML並みのパフォーマンス
  • 日本でもサポート体制が整っている。
  • アドオンなど、レビューチームによる審査を経ているので信頼できる。
     -- 企業サイトなどでも安心して使える。

デメリット

  • ブログ機能が弱い
     -- 有料のブロックをインストールすることで向上できるが、それでも弱い
     -- 新着情報をバンバン出すような企業サイトの場合は要注意
  • タブレットからの更新ができない (改善の努力中ではあるが)
  • ドキュメントが少ない(書く人が少ない)
     -- MTやWPはブログツールなので、「作る人=ブログを書く人」的な側面があるらしい。

違いを端的に

  • MTやWPはけっこうコーディングしないといけない = 左脳的
  • C5は最小限のコーディングで済まして、右脳を使って感覚的に構築することができる。

 

-----------------------------------
以下は個人の雑感

C5は小規模な企業サイトに向いているかもしれない。

WPの場合は、積極的に情報発信するサイトに向いている。C5は会社案内など固定ページの修正が主になるようなサイトということになるかも。(要検討)

MTやWPでもそうだが、TinyMCEやCKEditorなどにある「テンプレート(ひな形)」機能は地味に便利。カスタムフィールドで一生懸命に組むよりも、これをきちんと準備してあげたほうがお客様的には分かりやすかったりする。

concrete5の記事ブロックのTinyMCEをカスタマイズしてテンプレート(ひな形)機能を追加する方法を見つけたのでメモメモ。

元ネタ:http://sharedhat.com/blog/1178/

 

概略

  1. TinyMCEのディレクトリをコア領域からコピーして、ユーザー領域に複製
     -- /concrete/js/tiny_mce を、 /js/tiny_mce として複製
  2. テンプレートファイルとリストファイルの作成
  3. TinyMCEの設定変更
     -- 2で作成したファイルを登録する

WordPressの隠しオプション設定ページ

元ネタ : http://hirunebu.com/blog/archives/356

http://(インストールディレクトリ中略)/wp-admin/options.phpにアクセスすると、各種オプションの設定ができる。

  • メディアを挿入するときのデフォルトのリンク先を無しにしたいなら、image_default_link_typeを「none」

WordPressのセキュリティ

WordBench仙台でのメモメモ

---------------------

WordPress のテーマとプラグインの変更を、configファイルから停止することができる。

define('DISALLOW_FILE_MOP' , true )

を追記すればよい

ただし、自動アップデートができなくなるので、その時は一時的にはずすなどして運用でカバーが必要

 

WordPressを乗っ取られて一番怖いのは、<head>内に変なスクリプトを仕込まれて「アクセスしただけでウィルスに感染するサイト」にされてしまうこと。

テーマとプラグインの変更を制限すると、管理画面にログインされた最悪の場面でも、最悪の最悪は防ぐことはできる。

---------------------------

自動バックアップを毎日、7日分とるなど、バックアップをしっかりとっていつでも戻せる状態にしておくのも、セキュリティ対策の重要な一つ。

アーカイブ

ウェブページ

「紺屋の白袴」とはまさにこの事。見にくいしスマホ対応もまだしていません。そのうちやります。そのうちにね。

エフスタジオの中の人は株式会社メキメキに在籍しています。