Ultimate Member の URL 制御がゴミ

副業の都合で Ultimate Member という WordPress のプラグインを使っている.
サイト全体をメンバー以外から秘匿し,ログインした者でないとアクセスできなくするといったことが可能である.

秘匿した際に,「特定の URL を許可する」設定が可能なのであるが,完全一致型しかできない(内部で in_array を用いている).

結論:

Reflection まで持ち出して,Ugly に以下のようにすると良い.'forums' へのアクセスを許す例が以下である.このコードは MIT/X ライセンスや,Public Domain であるものとして用いてよい.

add_action(
    'um_access_check_global_settings',
    function() {
        if ( function_exists( 'UM' ) ) {
            $current_url = UM()->permalinks()->get_current_url( get_option( 'permalink_structure' ) );
            $forum_url = home_url( '/forums/' );
            $partial_url = substr( $current_url, 0, strlen( $forum_url ) );

            if( $partial_url == $forum_url ) {
                $um_access = UM()->classes['access'];
                // $um_access->allow_access = true;  // private なので不可能
                $refrection = new ReflectionClass( get_class( $um_access ) );
                $allow_access = $refrection->getProperty( 'allow_access' );
                $allow_access->setAccessible( true );
                $allow_access->setValue( $um_access, true );
            }
        }
    }
);

詳細

“Exclude the following URLs” for Access
では

“Exclude the following URLs” for Access
Is it possible to use Regex with this option under Access -> Restriction Content?
Also what does “Restricted Access to posts” and “Restricted Access to Taxonomies” Mean? Does this mean “Enable Restrict Content Access”?

といった議論がされている.しかし,未実装である.

ultimate-member/includes/core/class-access.php ファイルでは,

function template_redirect() {
    // ...
    do_action( 'um_access_check_global_settings' );
    $this->check_access();
}

となっていて,このアクションは,

add_action( 'um_access_check_global_settings', array( &$this, 'um_access_check_global_settings' ) );

という形で,いかにも登録できるような感じを醸し出している.そして,

function check_access() {
    if ( $this->allow_access == true )
        return true;
    // ...
}

となっているから,$this->allow_access を書き換えれば良さそうだ.しかし,肝心のこのプロパティが private なのである.書き換えられない.(そもそも,$this に相当するオブジェクトを action の関数に渡せと思うのだが…)

ということで, private プロパティを強引に書き換える醜悪な方法を行うしかない.詳細は先に述べた通り.

WordPress

Posted by tako