WordPress Popular Posts 4.1.0 で REST API が必須に

スポンサーリンク

 当ブログでは WordPress で記事毎のアクセス数を取得したいとかウィジェットで人気記事を表示したいという目的で WordPress Popular Posts (以下 WPP) を導入している。
 その WPP がこの度 4.1.0 にバージョンアップしたのだが、記事の PV カウントやウィジェットに配置した人気記事やらの項目が表示されなくなってしまった。
 WPP の更新履歴をみてやるとどうも REST API を使用するようになったとか。
 たしか特定のプラグイン以外では REST API が無効となるように設定していたなという事で確認をしたら、テーマである Simplicity2 の子テーマ側の functions.php を弄っていたことを思いだした。

WordPressのREST APIを無効化しつつ特定プラグインは動作するようにカスタマイズする方法
REST APIを無効にしていたら、JetpackやContact Form 7が使えなくなってしまった…なんて場合の対処方法です。REST APIは無効化したまま利用したいプラグインのみをホワイトリスト方式で指定できます。

 上記アドレスの手順通りに行っているので、許可するアドオンの namespace を追加してあげるだけで済みそうだ。
 そこで次に示すソースの 19~22 行目を追記した。WPP の namespace は wordpress-popular-posts/ と指定すれば OK だった。

//特定のプラグインを除外してREST APIを無効にする
function deny_restapi_except_plugins_demo( $result, $wp_rest_server, $request ){
    $namespaces = $request->get_route();

    //oembedの除外
    if( strpos( $namespaces, 'oembed/' ) === 1 ){
        return $result;
    }
    //Jetpackの除外
    if( strpos( $namespaces, 'jetpack/' ) === 1 ){
        return $result;
    }

    //Contact Form7の除外
    if( strpos( $namespaces, 'contact-form-7/' ) === 1 ){
        return $result;
    }

    //WPP
    if( strpos( $namespaces, 'wordpress-popular-posts/' ) === 1 ){
        return $result;
    }

    return new WP_Error( 'rest_disabled', __( 'The REST API on this site has been disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'deny_restapi_except_plugins_demo', 10, 3 );

 もしその他手段を用いた一括での REST API 無効化をしていたらこの際だから有効化してみたり、本記事の様に特定のプラグインだけ許可してあげると言った対策が必要となるだろう。

 とはいえ REST API を制限していた理由ってなんだっけかなーと改めて見返してみるとクエリーを投げて何かしらの情報が簡単に得られるとか、過去には脆弱性があってそれを突いた不正な攻撃があった―― なんて事が挙がった。
 脆弱性が過去にあった物をオープンにしておくのもなぁとは思ったけど現状は特に騒がれていないから大丈夫かとも思われる。それならば上記特定プラグインだけ許可するとか細々やるよりも、問答無用で有効化しておいたほうが今後のプラグイン更新次第ではいちいち対策をしなくて楽で良いのかなとも思う。
 この辺は追って情報を集めてから考えてみよう。なるべく WordPress によるブログ運営に手間をかけたくないというのもあるし、それはそれで面白いという相反する考えもあるしでなかなか収拾が付かなそうだけど。

スポンサーリンク