WordPress Disqus Pluginのエラーを修正

このblogの下の方にこんなエラーが出てコメントのフォームが出てきません.
hostのOSをDebian jessieからDebian stretchにdist-upgradeしてWordPressのVersionが上がったせいでしょう.

4.1+dfsg-1+deb8u15 → 4.7.5+dfsg-2+deb9u1

Notice: get_currentuserinfo の使用はバージョン 4.5.0 から非推奨になっています! 代わりに wp_get_current_user() を使ってくださ
い。 in /usr/share/wordpress/wp-includes/functions.php on line 3830

spamが酷くてDisqusのコメントシステムをつかっているのですがそれがコケているような感じです.
Plugin の version が古いのかと確認してみると最新の 2.87

とりえずエラーメッセージのとおり修正したら動きました.

diff

$ sudo -u www-data diff -u plugins/disqus-comment-system/disqus.php.org plugins/disqus-comment-system/disqus.php
--- plugins/disqus-comment-system/disqus.php.org        2017-10-04 06:16:02.520645362 +0900
+++ plugins/disqus-comment-system/disqus.php    2018-01-08 02:00:35.729022200 +0900
@@ -1382,7 +1382,7 @@
         return array();
     }
     global $current_user, $dsq_api;
-    get_currentuserinfo();
+    wp_get_current_user();
     if ($current_user->ID) {
         $avatar_tag = get_avatar($current_user->ID);
         $avatar_data = array();

利用者多いしDisqus公式のものなので別のもっといい方法がある気がします.

WordPress へのspam 投稿をしたことのあるIP を拒否するようにした

最近WordPress へのコメントとトラックバックスパムが酷くなってきました。URL が含まれている物は承認が必要なようにしているのですが面倒です。このときにスパムはスパムだと手動で振り分けをしているので振り分けたものからIP を抜き出してアクセス制限を掛けるとましにならないかと設定してみました。

データベースから該当IP を抜き出す

MySQL からスパムを指定したIP の一覧は以下のようにして取得出来そうです。

$ cat /etc/wordpress/spamcommentip.sql
SELECT comment_author_IP FROM wordpress.wp_comments WHERE comment_approved='spam'
$ /usr/bin/mysql -umy -p < /etc/wordpress/spamcommentip.sql | /usr/bin/sort -n | /usr/bin/uniq -c| sort -n|cut -c-7|uniq -c
     81       1
     31       2
     26       3
     12       4
      8       5
      9       6
      4       7
      9       8
      1       9
      1      10
      3      11
      2      12
      3      13
      1      14
      1      15
      1      18
      4      20
      1      22
      1      23
      1      24
      1      26
      1      43
      1      82
      1     119
      1     146
      1     394

自動化したいので、MySQL にアクセスする為のMySQL の設定ファイルと、IP を抜き出すsqlファイルを用意します。

  • MySQL アクセスの為の設定ファイル

    $ cd /etc/wordpress
    $ umask 077
    $ sudo touch .my.conf
    $ sudo chown www-data.root .my.conf
    $ vi .my.conf
    cat .my.conf 
    user=wp
    password=XXXXXXXXXXXXXX
    database=wordpress
    
  • IP を抜き出す為のsqlファイル

    $ sudo vi /etc/wordpress/spamcommentip.sql
    $ cat $ cat /etc/wordpress/spamcommentip.sql
    SELECT comment_author_IP FROM wordpress.wp_comments WHERE comment_approved='spam'
    

以下のようにしてIP の一覧が取得出来るようになりました。

$ /usr/bin/mysql --defaults-file=/etc/wordpress/.my.conf < /etc/wordpress/spamcommentip.sql

apache httpd の .htaccess で指定IPアドレスからの WordPress のコメント投稿とトラックバックを制限

Debian のパッケージで WordPress を導入しているので導入パスは /usr/share/wordpress/ です。
設定ファイルは /etc/wordpress 以下です。
/usr/share/wordpress/.htaccess/etc/wordpress/htaccess のシンボリックリンクになっています。

アクセス制限をするには .htaccessdeny from ip address な感じで行けます。
さっきのIPの一覧取得時に並べ替えて同一IPをまとめて頭にdeny from を付けるようにします。

$ /usr/bin/mysql --defaults-file=/etc/wordpress/.my.conf < /etc/wordpress/spamcommentip.sql | /usr/bin/sort -n | /usr/bin/uniq | /bin/grep -v 'comment_author_IP' | /bin/sed "s/^/  deny from /"

あまり無いと思いますが、正しいIP アドレスを登録してしまっても本文が読めるようにコメントやトラックバックだけ制限しようと思います。コメント、トラックバックは次のwp-comments-post.php / wp-trackback.php を利用するようなのでこのファイルへのアクセスを制限します。
.htaccess の Files ディレクティブを利用して以下ような感じでいけそうです。

<Files ~ wp-comments-post.php|wp-trackback.php>
  deny from ip address
</Files>

動作確認は自分のIPアドレスを一時的に登録して行いました。blog本文にはアクセス出来てコメントURL は拒否されています。

% w3m -dump_head https://matoken.org/blog/blog/2015/06/09/facebook-pgp/|head -1
HTTP/1.0 200 OK
% w3m -dump_head https://matoken.org/blog/wp-comments-post.php|head -1
HTTP/1.1 403 Forbidden

cron を使って自動的に更新するようにする

IP list は外部ファイルにして読み込むようにすると便利そうですが、Include ディレクティブは .htaccess からは利用出来無いようなので分割ファイルを作って連結することにします。

  • /etc/wordpress/htaccess_base
    • 元のhtaccess
  • /etc/wordpress/htaccess_spamhead
    • Files ディレクティブの先頭
  • /etc/wordpress/htaccess_spamiplist
    • データベースから抜き出して作成した拒否IPリスト
  • /etc/wordpress/htaccess_spamtail
    • Files ディレクティブの末尾
  • /etc/wordpress/htaccess
    • 最終的に結合されて.htaccess のリンク元になるファイル

htaccess_base / htaccess_spamhead / htaccess_spamtail を用意します。

$ sudo cp -p /etc/wordpress/htaccess /etc/wordpress/htaccess_base
$ sudo sh -c "echo '<Files ~ wp-trackback.php|wp-comments-post.php>' > /etc/wordpress/htaccess_spamhead"
$ sudo sh -c "echo '</Files>' > /etc/wordpress/htaccess_spamtail"

htaccess_spamiplist / htaccess はcron で1時間毎に作成するようにします。

$ sudo -u www-data crontab -e
$ sudo -u www-data crontab -l
14 * * * *      /usr/bin/mysql --defaults-file=/etc/wordpress/.my.conf < /etc/wordpress/spamcommentip.sql | /usr/bin/sort -n | /usr/bin/uniq | /bin/grep -v 'comment_author_IP' | /bin/sed "s/^/  deny from /" > /etc/wordpress/htaccess_spamiplist && /bin/cat /etc/wordpress/htaccess-base /etc/wordpress/htaccess_spamhead /etc/wordpress/htaccess_spamiplist /etc/wordpress/htaccess_spamtail > /etc/wordpress/htaccess

これで1時間毎にWordPress 上でspam と判定したコメント/トラックバックの送信元IP からコメント/トラックバックを拒否するようになりました。
うまくいくといいのですが……。

追記)
設定して数日経ちましたが,spam激減しました!

WordBench鹿児島に参加してきた

先月から第二土曜日に毎月定例で行う予定でしたが,先月は台風で中止になっていました. そういえば明日だなWP でちょっとはまってネタも出来たしと思って参加申し込みをしたら補欠>< 数時間後に確認したら繰り上がっていました.盛況ですね.

ユニマルの永田さんによる「universions」のお話

universions というのは初めて知ったのですが,WordPressに特化した開発ツールになるのかな?独自のGUIのバージョン管理システムやchat/wiki/tasb管理,WordPress環境が1分で作れるなど. 逆にシェルから操作とかは出来無さそう?gitとかがわかる人向けではないとのこと. シェルの画面が苦手な人の取っ掛かりにいいのかもです.

質問&相談をみんなで解決しましょう

Doorkeeper での参加登録時に質問相談などを書くようになっていて,それを付箋に書いて貼ってアンカンファレンス形式でのディスカッションでした. 畑違いなので結構知らない言葉が飛び交っていて大変でしたが勉強になりました.

次回

次回はWB東京とかぶるので第2土曜から1週ずらして10/18(土)になるとのことでした. 興味のある方は以下の辺りをfollow しておくといいのかも.

WP で嵌ったネタは発表してないしまたここにでも書きます.

DP1M0442DP1M0443DP1M0444DP1M0445DP1M0446

春の翻訳&ドキュメンテーション祭りに参加

ということで参加してきました.WordPress はそんなに使ってないのですが(今はこのページともう一箇所だけ),普通にGettext での国際化のようなので最近翻訳してなくてコマンドとかも忘れてるし…てことで参加してきました.
会場は301コワーキングスペース.
IMGP9309
こちらのビルの
IMGP9311
その名の通り301号室です.

  • 鹿児島のコワーキングスペース 301 サンマルイチ | 鹿児島中央駅から徒歩3分
  • 2014-05-17 12.44.13
    #準備中の写真しかとってなかったですorz
    翻訳対象はドキュメント,プラグイン,テーマなど.鹿児島では Theme My Login Login LockDown をターゲットにすることに.

    Theme My Login は .pot があるのでお手軽だったのですが, Login LockDown は.pot の作成からでした.

    作業の前にdebian/ubuntu 環境だと,関連パッケージは以下のような感じで導入できます.

    % sudo apt-get install gettext-base gettext poedit

    .pot を作成します.初め以下のようにしていたのですが, _e の行が拾えません.

    % xgettext —keyword=’_’ —language php —from-code=UTF-8 -o ./loginlockdown.pot find $PWD -name *.php -type f

    試行錯誤して最終的に以下のように —keyword を複数指定することで恐らく全て抽出出来ました.

    % xgettext —keyword=’__’ —keyword=’_e’ —language php —from-code=UTF-8 -o ./loginlockdown.pot find $PWD -name *.php -type f

    .pot から ja.po の作成は以下のようにして行いました.

    % msginit —locale ja_JP.UTF-8 —input=loginlockdown.pot

    初め —locale ja としていたのですが,これだと charset=CHARSET となって先ずそうだったので ja_JP.UTF-8 を指定するようにしました.これで, charset=UTF-8 になりました.

    後はPoedit で翻訳して保存すると自動的に ja.mo も作成されます.
    手動で mo を作る場合は, % msgfmt ja.po -o ja.mo で行けます.
    #ちなみに今回 Poedit に有料版があるのを知りました! http://poedit.net/pro/

    ここでまた問題.
    ja.mo の結果が反映されない><

    source を見るとそもそも load_plugin_textdomain() が呼ばれていなそう.試しに書き換えてみると .mo が反映されました!
    #.pot が作れるのになぜ!?

    Screenshot from 2014-05-23 13:06:11

    という辺りで今回は時間切れとなりました.
    別の方々が ja.po の翻訳をされていたのでそっちとマージするといい感じになりそうです.

    鹿児島会場の参加者は最終的に7人でした.
    そうそう!定期的にやりたいねって話になりました.次回は恐らく6/14(土)となりそうです.
    興味のある方は以下のFacebook Group をcheck!

    関連URL

    今回のハッシュタグ

    Debian Squeeze にWP を試しに立ててみる

    IMGP8267

    ずっとblog 放置してて最近はGoogle+ やPukiwiki にメモしたりしてますがblog もたまに書きたくなって来ました.
    ということで,blog を立ち上げてみようかと思います.
    先ずはこのblog の為にWP を入れてみたエントリから.

    環境

    $ cat /etc/debian_version 
    6.0.5
    

    導入

    $ sudo apt-get install wordpress wordpress-l10n
    

    設定

    apache の設定

    $ cd /etc/apache2/sites-enabled
    $ sudo vi 004-matoken.org
    $ sudo git diff 004-matoken.org
    diff --git a/apache2/sites-enabled/004-matoken.org b/apache2/sites-enabled/004-matoken.org
    index df3c502..1c9f8b7 100644
    --- a/apache2/sites-enabled/004-matoken.org
    +++ b/apache2/sites-enabled/004-matoken.org
    @@ -14,6 +14,13 @@
                    allow from all
            </Directory>
    
    +       Alias /blog /usr/share/wordpress
    +       <directory /usr/share/wordpress>
    +               Options FollowSymLinks
    +               AllowOverride Limit Options FileInfo
    +               DirectoryIndex index.php
    +       </directory>
    +
            ErrorLog ${APACHE_LOG_DIR}/error-matoken.org.log
    
            # Possible values include: debug, info, notice, warn, error, crit,
    $ sudo /etc/init.d/apache2 restart
    

    db の作成

    DB 名 : wordpress
    DB User : wp
    DB Password : password

    $ mysql -uroot -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 7158
    Server version: 5.1.63-0+squeeze1 (Debian)
    
    Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> CREATE DATABASE wordpress;
    Query OK, 1 row affected (0.04 sec)
    
    mysql> GRANT ALL PRIVILEGES ON wordpress.* TO wp@localhost IDENTIFIED BY 'password';
    Query OK, 0 rows affected (0.22 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.16 sec)
    
    mysql> EXIT
    Bye
    

    wordpress の設定

    $ cat /etc/wordpress/config-matoken.org.php
    <?php                                                                                                                                                 
    define('DB_NAME', 'wordpress');                                                                                                                       
    define('DB_USER', 'wp');                                                                                                                              
    define('DB_PASSWORD', 'password');                                                                                                                 
    define('DB_HOST', 'localhost');                                                                                                                       
    define('DB_CHARSET', 'utf8');                                                                                                                         
    define('DB_COLLATE', '');                                                                                                                             
    define ('WPLANG', 'ja');                                                                                                                              
    define('WP_HOME', 'https://matoken.org/blog');                                                                                                         
    define('AUTH_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');                                                                                                                                                         
    define('SECURE_AUTH_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');                                                                                                                                                  
    define('LOGGED_IN_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');                                                                                                                                                    
    define('NONCE_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
    ?>
    

    https://matoken.org/blog/ にアクセスして設定.

    Plugin の導入

    WordPress › Markdown on Save Improved « WordPress Plugins

    Markdown 記法が使えるようになるPlugin です.

    $ cd /tmp
    $ wget http://downloads.wordpress.org/plugin/markdown-on-save-improved.2.2.zip
    $ cd /usr/share/wordpress/wp-content/plugins
    $ sudo unzip /tmp/markdown-on-save-improved.2.2.zip
    

    管理画面の「プラグイン」から Markdown on Save Improved を有効化

    その他

    パーマリンク設定が有効にならない

    rewrite が無効になっているので有効にする

    $ sudo a2enmod rewrite
    Enabling module rewrite.
    Run '/etc/init.d/apache2 restart' to activate new configuration!
    $ sudo /etc/init.d/apache2 restart
    Restarting web server: apache2 ... waiting .