WordPressはデフォルトではPHPの$_SESSIONを使用しないため、独自にコードを書く必要がある。あくまで一例だが、

add_action('init', function() {
    if (!session_id()) {
        session_start();
    }
});

とし、たとえば独自ログイン処理後に

$_SESSION['my_authenticated_user'] = get_current_user_id();

として、以下のように認証処理を書けばよい。

register_rest_route('custom/v1', '/sample', [
    'methods'  => 'POST',
    'callback' => 'sample_callback',
    'permission_callback' => function() {
        return isset($_SESSION['my_authenticated_user']) && $_SESSION['my_authenticated_user'] > 0;
    }
]);

PHPセッションもクッキー(PHPSESSID)で管理されるため、JavaScript Fetch APIでのリクエストには必ず「credentials: ‘include’」を付与する。

fetch('https://api.example.com/wp-json/custom/v1/sample', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    credentials: 'include',
    body: JSON.stringify({ ~ }),
});

独自のPHPセッションはスケーラビリティに課題(たとえば複数サーバー間のセッション共有問題)などがあるため、導入の際はよく検討する。