WordPress の非公開記事を購読者でも閲覧できるようにする

WordPress の非公開記事を「購読者 (subscriber)」でも閲覧できるようにしたくなったので、やり方をメモしておきます。

ちなみに、 WordPress はデフォルトの状態では「管理者 (administrator)」と「編集者 (editor)」のみ非公開記事の閲覧ができます。

ただし、ケースによっては「記事の編集権限は与えたくないので、購読者で記事の閲覧権限だけ付与したい」という場合もあるかと思います。

そこで対処。

シンプルなコード

単純に付与することだけを考えるならば、フォーラムにある「非公開」の権限について | WordPress.org 日本語のスレッドのコードで良いかもしれません。

$subscriber = get_role( 'subscriber' );
$subscriber->add_cap( 'read_private_posts' );

これをテーマの functions.php に追加すれば、要件は満たせるようです。ただし、add_cap() の Codexには

注意: この設定はデータベース(テーブル wp_options のフィールド wp_user_roles)へ保存されます。そのため、テーマやプラグインを有効化した時に実行したほうがいいかもしれません。

関数リファレンス/add cap – WordPress Codex 日本語版

という注意書きがありました。設定がDBに保存されるのであれば、元に戻せるようにしておきたいです。また、DBに設定が保存されるのであれば、何度もこのコードが実行されるのではなく、初回の一度だけ実行される方が良さそうな気がします。

そこで、「コードをプラグイン化し、プラグインの有効化の際に上記コードが実行、プラグイン無効化の際は逆に設定を戻すコードが実行」されるような設計にしたいと思います。

コード (プラグイン)

上述の設計を落とし込むと以下のようになりました。なお、一応生関数をブローバルスコープに置くのではなく、クラスとして使用してみました。

<?php
/*
Plugin Name: Readable Subscriber
Version: 0.0.1
*/

/**
 * ReadableSubscriber : プラグイン有効時、非公開記事 ( private posts ) を購読者 ( subscriber ) でも閲覧可能にする。無効時、その権限を削除する
 */
class ReadableSubscriber
{
    protected $role = 'subscriber';
    protected $privilege = 'read_private_posts';

    /**
     * __construct : コンストラクタ。プラグイン有効時・無効時をトリガーにして対応するメソッドを呼ぶ
     *
     */
    public function __construct() {
        // 有効化の際に発動
        register_activation_hook(
            __FILE__,
            [
                $this,
                'addReadPrivilege',
            ]
        );
        // 無効化の際に発動
        register_deactivation_hook(
            __FILE__,
            [
                $this,
                'removeReadPrivilege',
            ]
        );
    }

    /**
     * addReadPrivilege : 購読者にも非公開記事を閲覧する権限を付与
     *
     */
    public function addReadPrivilege ()
    {
        $subscriber = get_role( $this->role );
        $subscriber->add_cap( $this->privilege );
    }
    /**
     * removeReadPrivilege : 購読者から非公開記事を閲覧する権限を剥奪
     *
     */
    public function removeReadPrivilege ()
    {
        $subscriber = get_role( $this->role );
        $subscriber->remove_cap( $this->privilege );
    }
}

// instantiate
$ReadableSubscriber = new ReadableSubscriber();

プラグイン名や関数名は適当に。

これで簡単にチェックしたところ、望んだ通りの挙動になりました。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。