2015年6月25日木曜日

FacebookのRSSが…

RSS取得機能が廃止された模様…
■FacebookページのフィードをRSS/Atomで取得できる機能が6/23で廃止に。

この機能ありきの案件がまさに進行中だったので、ショックすぎてう○こ漏らしかけました。

やりたいこととしては、
・RSSフィードを取得してJSON形式に変換
・JSONデータを使用してサイト内でごにょごにょ
というそんなに大したことない内容です。

facebookページのJSONデータを取得するだけなら、
「https://graph.facebook.com/ユーザーID/feed?access_token=」
をGETすれば済む話ですが、アクセストークンをパラメタとして付加する必要があります。
アクセストークンは開発者登録&アプリケーション登録すれば取得できるのですが、トークンには有効期限があり、最長で60日間。しかもバッチ処理不可の模様…。
さてどうしたものかと方々調べてまわった結果、トークンには「ユーザートークン」なるものと「アプリ自体のアクセストークン」なるものが存在するようです。
何がどう違うのかについては割愛して、今回やりたいことは「アプリ自体のアクセストークン」を使用すれば解決することが判明。
そんなことも知らずによくもまぁ…と言われれば返す言葉もありません。はい。

トークンに必要な情報としては、アプリケーション登録後に得られる「FacebookアプリのID」と「シークレットキー」の2点。
これをパイプライン(|)でつなげた文字列がアクセストークンとして使用できるそうです。

答え: https://graph.facebook.com/ユーザーID/feed?access_token=AppID|secret 

■お世話になったサイト
APPOFIT > offline_accessパーミッション削除に対応する
mk-mode BLOG > Facebook API - アクセストークン!
User's Manual2 > Facebook アプリID取得方法

2015年6月3日水曜日

WordPressのセキュリティ対策メモめも…

WordPressのセキュリティ対策について真面目に考える機会があったので、あれこれ試行錯誤の備忘録。

セキュリティ対策プラグインとしてよくお世話になっているのが、ログイン試行回数を制限できる「Limit Login Attempts」というプラグイン。
このプラグインには試行回数オーバーでロックされたIPとログインユーザー名をログに記録する機能があり、たいがいは「admin」などのありがちなユーザー名でのアタックが記録されてるのですが、たまにドンピシャのユーザー名を使用されている場合があります。

よくよく考えればユーザー名の入手なんて比較的容易にできちゃったりするのがWordPress。
何もしないよりはましだろうということで、以下ちょっとしたセキュリティ対策。

 

■ログイン画面へのアクセスを認証制にする

まずはオーソドックスに、ログイン画面自体に認証をかけてしまおうという方法。
.htaccessなどを使用してください。

<Files wp-login.php>
AuthUserfile /xxxxx/xxxxx/.htpasswd
AuthGroupfile /dev/null
AuthName "Please enter username and password"
AuthType Basic
require valid-user
</Files>

 

■投稿者アーカイブページへアクセスさせない

テーマファイルに「author.php」を追加し、適宜内容を設定する。例えば wp_redirect() させたり、とか。

 

■投稿者アーカイブページへのリダイレクトを制御

パーマリンク設定をデフォルト以外の設定にしている場合、「http://xxxxx/?author=1」などにアクセスされると、あまり見られたくないURLに転送されちゃったりしますので、functions.phpに以下を記述。

function disabled_redirect_author_archive()
{
 if (is_author()) {
  // ここにお好みの処理を記述
  wp_redirect(home_url());
  exit;
 }
}
add_action('template_redirect', 'disabled_redirect_author_archive');

 

■フィードに投稿者名を出力させない

「http://xxxxxx/feed」などにアクセスすると取得できるフィードにはユーザー名(またはニックネーム)が出力されてしまうので、functions.phpに以下を記述。

function remove_feed_author($name)
{
 return is_feed() ? 'unknown' : $name;
}
add_filter('the_author', 'remove_feed_author');

 

こんなところかな。プラグインで対策可能なものもありますが、お好みで。

2014年4月26日土曜日

ECCUBEのDB移行【ver 2.3.4 → 2.13.1】

無謀かと思われましたが、他サイトさんの情報も参考にして何とか成功。
移行対象は「商品データ(カテゴリ・規格含む)」「顧客データ」「受注データ」「店舗基本情報」です。

2013年8月23日金曜日

「NextGEN Gallery」のアップデート

WordPressのプラグイン「NextGEN Gallery」を 1.9.13 から 2.0 にアップデート、して大失敗。
PHPがエラーを吐いたり動作が怪しかったりと、最悪。
公式サイトをちゃんとチェックしとけばよかった、と初めて思った次第でありました。
既知の不具合らしく、NextGEN Galleryの公式で配布されている暫定的にパッチをあてたらしい 2.0.2 を入れてみるも、やはり駄目。
めんどくさいのでどこが駄目とか説明はしませんが、とにかく 2.0 以降へのバージョンアップは中止してください。
この記事を書いてる時点で 2.0.11 までリリースされてるようですが、評価は「Broken :(」の嵐です。。。

やっちまったひとは 1.9.13 に戻してください。

FTPでバグ有のほうのディレクトリを適当にリネームし、1.9.13 をアップロードしたあと、WPのプラグイン管理画面にアクセスしたら、バグ有版は自動的に停止するので、1.9.13 を有効にすればオッケーでした。
2.0 へのアップデート以前に登録してた画像やギャラリーも今のところは特に影響なさげです。

有償Pro版も配布してるプラグインなので油断しておりました。

2013年3月15日金曜日

allow_url_fopenがoffのとき

共用サーバーにWordPressを設置した場合、プラグインやテーマをインストールする際にFTPの接続情報を都度入力させられることがあります。
そんなときの理由はたいてい、PHPの allow_url_fopen ディレクティブが off になっているためだったりします。
WordPressデフォルトの自動更新機能はこのディレクティブが on になってないと使用できないようです。
この設定はユーザー側で変更できないことがほとんどなのであきらめるしかないんですが、FTPの接続情報を設定ファイルに直接記述しておけば都度入力の手間を省くことができます。

define('FTP_HOST', 'サーバのホスト名またはIPアドレス');
define('FTP_USER', 'FTPユーザー名');
define('FTP_PASS', 'FTPパスワード');

FTP_HOSTの値にホスト名を指定した場合、共用サーバの仕様によっては名前解決に失敗することがあるようです(WADAXとか)。
なので、そんなときは自分のデータが格納されているサーバのドメインをnslookupするなりしてIPアドレスをゲットしてください。
詳しくはWordPress Codex 日本語版でどうぞ。

Contact Form 7 のラジオボタン

WordPressの定番プラグイン「Contact Form 7」をよく利用するのですが、このプラグイン、ラジオボタンの必須入力化に対応していません。
理由はというと下記の通り。

プラグイン配布元サイトより引用---
入力必須版の radio (“radio*”) はありません。Contact Form 7 が “radio*” を提供しない理由は、そもそもラジオボタンとは入力必須のものだからです。
---引用ここまで

とまぁHTMLの仕様に基づくものなので仕方ないかと思い、フォームタグのdefaultオプションで対応してみるものの、一度メールを送ったあとはフォームがリセットされて、defaultオプションで指定したオプションのチェックが外れてしまい、ラジオボタンの値が無いまま送信できてしまいます。
まぁそれだけじゃなくて、ラジオボタンの値を空にして送信する方法などいくらでもあるわけで、やっぱり必須化の機能は欲しいわけであります。。。

そんなわけで、こんな感じです。

function my_wpcf7_validate_radio($result, $tag)
{
    $type = $tag['type'];
    $name = $tag['name'];

    if ('radio' == $type && empty($_POST[$name])) {
        $result['valid'] = false;
        $result['reason'][$name] = wpcf7_get_message('invalid_required');
    }

    return $result;
}
add_filter( 'wpcf7_validate_radio', 'my_wpcf7_validate_radio', 10, 2 );